Critical Section

临界区保护信号量,信号量完成进程间的同步;
  • 为什么要保护信号量?
  • 实际中如何保护信号量?

竞争条件(Race Condition)

共享数据在内核中会因为调度顺序引发主义错误。
解决竞争条件的直接想法:(加锁)一段代码一次只允许一个进程进入

临界区(Critical Section)

基本保护原则
  • 互斥进入
好的保护原则
  • 有空让进:若干进程要求进入空闲临界区时应尽快使一进程进入
  • 有限等待

轮换法

notion image
满足互斥进入要求,但不满足有空让进

标记法

notion image
满足互斥进入,但是可能会死锁
比如执行序列为:
  1. flag[0]=true;
  1. flag[1]=true;
  1. while (flag[1]);
  1. while (flag[0]);

Peterson算法

notion image
结合了标记和轮转两种方法,满足互斥进入、有空让进,但只适用两个程序
  • 互斥进入:如果两个进程都进入则flag[0]=flag[1]=true、turn=0=1,矛盾!
  • 有空让进:如果进程P1不在临界区,则flag[1]=false,或turn=0,都能让P0进入
  • 有限等待:P0要求进入,flag[0]=true;后面的P1不可能一直进入,因为P1执行一次会让turn=0

面包店算法

仍是标记和轮转的结合:
  • 轮转:每个进程获得一个序号,序号最小的进入;
  • 标记:进程离开时序号为0,不为0的序号即标记
notion image
满足互斥进入,有空让进,有限等待,适用于多个程序

关中断

notion image
阻止调度,阻止中断:关中断(中断寄存器INTR)。但是不适于多CPU(多核)

硬件原子指令法

notion image