前言
引用博客:操作系统 进程同步-CSDN博客
互斥执行原则
一组并发进程互斥执行时必须满足如下准则:
(1) 空闲让进
当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以便有效地利用临界资源。
(2) 忙则等待
当一个进程正处在某临界区内,为了保证对临界资源的互斥访问,任何试图进入其临界区的进程都必须进入代码连续测试循环,陷入忙等状态。连续测试一个变量直到某个值出现为止,称为忙等。
(3)让权等待
当进程不能进入自己的临界区时,应立即释放处理机(利他),以免进程陷入“忙等”。——不忙碌等待。
(4)有限等待
对要求访问临界资源的进程,应保证在有限的时间内能进入自己的临界区,以免陷入“死锁”状态(利己)——不死等。不互相阻塞。即程序总有机会往下执行,不会一直空转。
解决互斥问题的方法及缺陷
软件实现临界资源访问方法
1.单标志法:
标志依赖对方,然后有一方完成后不需要继续了,另一方就因为标志未修改不能进临界区了违背,“空闲让进”;一直停留在while语句处,违背“让权等待”。
2.双标志法先检查
双方代码同时发现资源空闲,同时进入进程,没有保证对临界资源的互斥访问,违背了“忙则等待”。一直停留在while语句处,违背“让权等待”。
3.双标志法后检查
解决了“忙则等待”;双方代码同时发现资源空闲,同时都想进入临界区,但因为先标记了,所以导致卡外面一直进不去,违背了“空闲让进,有限等待”原则,导致“饥饿”。一直停留在while语句处,违背“让权等待”,
4.皮特森算法
违背“让权等待”,因为while始终占用CPU(处理器)执行权,一直执行代码(“忙等”状态),没有进入阻塞状态(注:有时候“忙等”状态比阻塞状态好,因为阻塞状态要保存现场以及后续转换成本高)
critical section 代表是需要互斥进入的一个区间,比如需要修改一些关键的共享数据,这个时候不能让两个进程同时修改,否则就会出现不可预知的结果了
remainder section 并非关键区域,所做的操作是可以并行操作的,结果互不影响
信号量机制
整型信号量机制
while(S<=0);——如果资源数不够,就一直循环等待,即违背“让权等待”原则,会发生“忙等”。
记录型信号量
为了克服整型信号量机制存在的“忙等” (Busy waiting)现象,调用block原语,进行自我阻塞有效地提高资源的利用率。
利用信号量实现进程互斥
Var mutex:semaphore:=1;
begin
parbegin
P1: repeat P2: repeat
wait(mutex); wait(mutex);
critical section; critical section;
signal(mutex); signal(mutex);
remainder section; remainder section;
until false; until false;
parend
end
信号量集机制
1.AND型信号量集机制
称为同时wait操作,即swait(simultaneous wait)。目的:避免死锁。定义如下:
2.一般信号量机制
一次可给进程分配多种临界资源,且同类临界资源一次可分配多个
一般信号量集的几种特殊情况
(1) swait(s,d,d): 不设下限;
(2) swait(s,1,1): 蜕化为wait(s);
(3) swait(s,1,0): 成为可控开关: s>=1时,所有进程都可进入;s=0时,阻止所有进程进入。