临界区保护信号量,信号量完成进程间的同步;
- 为什么要保护信号量?
- 实际中如何保护信号量?
竞争条件(Race Condition)
共享数据在内核中会因为调度顺序引发主义错误。
解决竞争条件的直接想法:(加锁)一段代码一次只允许一个进程进入
临界区(Critical Section)
基本保护原则
- 互斥进入
好的保护原则
- 有空让进:若干进程要求进入空闲临界区时应尽快使一进程进入
- 有限等待
轮换法
满足互斥进入要求,但不满足有空让进
标记法
满足互斥进入,但是可能会死锁
比如执行序列为:
- flag[0]=true;
- flag[1]=true;
- while (flag[1]);
- while (flag[0]);
Peterson算法
结合了标记和轮转两种方法,满足互斥进入、有空让进,但只适用两个程序
- 互斥进入:如果两个进程都进入则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的序号即标记
满足互斥进入,有空让进,有限等待,适用于多个程序
关中断
阻止调度,阻止中断:关中断(中断寄存器INTR)。但是不适于多CPU(多核)