L17 信号量临界区保护

为什么要保护信号量和临界区?
在现实中如何保护信号量和临界区?

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种很方便。

另外一个临界区保护-----硬件原子指令法

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38173631/article/details/104576563
今日推荐