为什么要保护信号量和临界区?
在现实中如何保护信号量和临界区?
empty = -1:的含义?
表示有一个进程正在睡眠
为什么要保护?
进程中存在一种调度,使得信号量引发错误。所以要保护!
怎么保护信号量?
要上锁
什么是临界区?
当一个进程在进入一段代码时,另外一个进程不能进入对应的修改信号的代码。所以出现了保护修改信号量的临界区。
临界区代码的保护原则?
临界区怎样设计呢?
方法一
用一个轮换法试试?
这种方法满足互斥要求,但是P0执行之后,没有进程P1了,P0无法继续执行。所以不行!!!
方法二
标记法:
每一个进程都有一个标记,进入的时候把自己的标记标为true,判断
互斥吗?
互斥,P0进入时:flag[0] = true;flag[1] = false;
P1进入时:flag[1] = true;flag[0] = false;
但是有问题
如果按照(1)(2)(3)(4)执行,谁都进不去临界区
还是不行,怎么做呢?
方法三
改一下,非对称标记
进入临界区Peterson算法(这个算法真聪明)
结合了标记和轮转两种思想:(值日加标记·)
多进程怎么办?—面包店算法(不懂)
临界区保护另外一种解法:关中断,和开中断
也存在问题,当出现多CPU时,一个CPU关闭中断,另一个CPU仍然可以执行Pi进程,这种策略不好使,但是在单CPU种很方便。
另外一个临界区保护-----硬件原子指令法
来源:CSDN
作者:qq_1316238389
链接:https://blog.csdn.net/qq_38173631/article/details/104576563