操作系统学习06 同步

  1. 背景:
    独立的线程: 不和其他线程共享资源或者状态;确定性(输入状态决定结果);可重现(能够重现起始条件),I/O;调度顺序不变。
    合作线程:在多个线程中共享状态;不确定性;不可重现;意味着bug可能间歇性发生

    合作的优点:
    1.共享资源:一个存款余额,多台ATM
    2.加速:I/O操作和计算可以重叠
    3.模块化:将大程序分解成小程序,使系统易于扩展
    我们希望无论多个线程的指令序列怎样交替执行,程序都必须正常工作;
    多线程程序具有不确定性和不可重现的特点;不经过专门设计,调试难度很高
    不确定性要求并行程序的正确性:
    先思考清楚问题,把程序的行为设计清楚;切勿急于着手编写代码,碰到问题再调试。

  2. 一些概念:
    Race Condition(竞态条件):系统缺陷,结果依赖于并发执行或者事件的顺序/时间(不确定性,不可重现)
    Atomic Operation(原子操作):原子操作是指一次不存在任何中断或者失败的执行:该执行成功结束或者根本没有执行。并且不应该发现任何 部分执行的状态; 实际上操作往往不是原子的:即使是i++这样简单的语句,在汇编层面也是由多条指令构成。
    Critical section(临界区):进程中一段需要访问共享资源并且当另一个进程处于相应代码区域时便不会被执行的代码区域
    Mutual exlusion(互斥):当一个进程处于临界区,没有其他的进程会处于临界区并且访问任何相同的共享资源
    Dead Lock(死锁):两个以上的进程,在相互等待完成特点任务,而最终没法将自身任务进行下去
    Starvation(饥饿):一个可执行的进程,被调度器持续忽略,以至于虽然处于可执行状态却不被执行。

临界区:
互斥:同一时间临界区中最多存在一个线程
progress:一个线程想要进入临界区,那么它最终会成功
有限等待:如果一个线程处于入口区,那么再其请求呗接受之前,其他线程进入临界区的时间是有限制的。
无忙等待(可选):如果一个进程在等待进入临界区,那么它可以在进入之前会被挂起。

三种方法实现临界区:
禁用硬件中断:没有中断,没有上下文切换,因此没有并发。硬件将中断处理延迟到中断被启用之后。大多数现代计算机体系结构都是提供指令来完成。 进入临界区则禁用中断,离开临界区则开启中断。
缺点:一旦中断被禁用,线程就无法被停止:整个系统都会为此进程停下来,可能使得其他线程处于饥饿状态。临界区的时间长短是不确定的,无法限制其时间,若太长可能存在硬件影响。 要小心使用

基于软件的解决方案:

操作系统学习06 同步_第1张图片
更高级的抽象:
操作系统学习06 同步_第2张图片
操作系统学习06 同步_第3张图片
操作系统学习06 同步_第4张图片
总结:操作系统学习06 同步_第5张图片

你可能感兴趣的:(java,开发语言,后端)