OS-李治军-L17-信号量临界区保护
信号量临界区保护
共同修改一个变量,可能会发生问题。

这种情况称为Race Condition,不是编程的问题,是系统调度的问题。
解决问题的直观想法:给信号量上锁。一个程序在操作信号量的时候,确保信号量不能被别人修改。
我们定义临界区:一次只允许一个进程进入的该进程的那一段代码。其他地方叫剩余区

原则
- 互斥
- 有空让进,有位子就让进入
- 有限等待,迟早能进去
方法:
一、轮换法
也叫作值日法,轮到谁,谁进去。

但是有问题哦,P0完成后,必须要等待P1再进去一次,P0才能再进去一次。就是没轮到我值日?我才不进去。
二、标记法
想进去,先打个标记,如果发现别人留了标记,我就先等着。出来了就撕掉自己贴的标签。
不满足有空让进,可能出现的情况:P0留了标记然后切到P1,P1又留了条子,然后一直等P1,切回P0,P0也得等着,形成死锁。
总之就是,只维护一个全局变量,导致整体的灵活性不够;维护两个全局变量,导致有可能出现死锁。
三、非对称标记
带名字的便条+让一个人更加勤劳一些,一个人要一直盯着有没有货,一直没货就自己上。
Peterson算法
融合标记和轮转方法。轮到我了,我就进去。如果里面没有人,我也进去。就不会发生两个星际玩家一直蹲在外面等对方出来,也不会出现没轮到我值日我也不进去的情况。


现在把问题扩展到多进程,为面包店算法,借鉴取号。
如何轮转:每个进程获得一个序号,序号小的进入
如何标记:进程离开时序号为,不为0的序号即标记。

但有点太复杂了,这是一种软件方法。
第二种方法是硬件方法,思路为阻止调度,而中断才能发生调度,所以可以关中断,保证原子操作。
什么情况有问题?多cpu!中断线在cpu上,每个cpu只能管自己的cpu。只能在小系统上做。
第三种方法是硬件方法,硬件原子指令法。用mutex来保护empty,那谁来保护mutex?所以要保证一个修改信号量的原子指令,即用一个硬件指令实现整数赋值。
ps.话说好像一个赋值语句就是原子的吧?所以mutex应该不用保护?重点是要保护那种,需要被一大段语句操作的资源8?


浙公网安备 33010602011771号