目录
2.4.1死锁的定义
Def:死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都无法继续向前推进。例如:
某系统中只有一台打印机和一台输入设备,进程P1占用着打印机,进程P2占用输入设备,进程P1未释放打印机前提出请求使用输入设备,与此同时进程P2在未释放输入设备前又提出请求使用打印机,P1,P2最后均因无止境的等待无法执行下去。
2.4.2死锁产生的原因及必要条件
(1)死锁产生的原因
根据死锁的定义分析,产生死锁的根本原因是竞争系统资源和进程推进顺序不当:
①竞争系统资源:由于不可剥夺资源无法满足多个进程运行的需要,因此这些进程对不可剥夺资源竞争陷入僵局,进而产生死锁,例如打印机,磁带机等。
②进程推进非法:当两个进程P1,P2分别占有资源1,2,若P1再申请资源2,P2再申请资源1,则两个进程都会因为缺少资源陷入僵局,即进程运行过程中的请求和释放资源顺序的不当也会导致死锁。
(2)死锁产生的必要条件(同时满足以下四个条件)
①互斥:同一时间间隔内只有一个进程占有资源,其他进程请求后只能处于等待状态
②不可剥夺:进程获得的资源只能由自己主动释放,不能被其他进程强行占有
③请求和保持:已经拥有资源的进程提出新的资源请求,但该资源已被其他进程占有,则该进程被阻塞,但以获得的资源依旧保持不放
④循环等待:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被下一个进程所请求
2.4.3死锁的处理方法
(1)死锁预防
设置某些条件,破坏产生死锁的四个必要条件的其中一个或几个,从源头防止死锁发生
①破坏互斥:允许资源共享使用,则系统不会进入死锁状态。
有些资源如打印机不可能同时访问,只能互斥使用,而且必要时还应该保护互斥,所以不太可行。
②破坏不剥夺:对于一个已经获得某些资源的进程,如果请求新资源不能得到满足,则该进程必须释放已经获得的所有资源,有需要时再重新申请。
如此一方面会导致之前的工作失效,另一方面会增加系统的开销,降低系统吞吐量。所以一般情况适用于可剥夺资源(like CPU),,不适用于不可剥夺资源(like 打印机)。
③破坏请求并保持:采取静态分配法,在进程处于就绪态时,就一次性申请进程运行时所需要的全部资源(except CPU),若全部资源申请完成立即运行进程,且所有资源运行期间只归当前进程所有,不再被其他进程请求。
会出现资源的浪费,还可能导致部分进程出现“饥饿”现象。
④破坏循环等待:采用顺序资源分配,按序给资源编号,规定进程按照编号递增的顺序请求资源,同类资源一次申请完毕。
会给编程带来不便,当顺序不当会造成资源的浪费,而且限制了新设备的增加。
(2)死锁避免
死锁避免是在系统动态分配资源的过程中,先计算此次资源分配的安全性,若此次分配处于安全状态,则允许分配,否则进程等待,从而避免死锁的发生。
①安全状态
安全状态是在某一时刻,系统能够按某种顺序or序列(eg:P1,P2,..Pn)来为每个进程分配其所需的资源,直至每个进程都能获得最大资源的需求,保证所有进程都顺序完成,此时称该序列为安全序列。只要能找出一个安全序列,系统就为安全状态;如果系统中一个安全序列都不存在,则该系统处于不安全状态。
如果系统处于安全状态,就一定不会发生死锁,如果系统处于不安全状态,就可能发生死锁(不安全状态不一定会发生死锁,但是死锁一定发生在不安全状态)。
假设系统中有三个进程,在某时刻进程P1,P2,P3的分配如图,该时刻是否安全:
②银行家算法
核心思想:进程运行之前先声明对各种资源的最大需求量,当进程在执行中继续申请资源时,先测试该进程己占用的资源数与本次申请的资源数之和是否超过该进程声明的最大需求量。若超过则拒绝分配资源、若未超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
数据结构:
Available:长度为m的一维数组,表示还有多少可用资源
Max:n*m矩阵,表示各进程对资源的最大需求数
Allocation:n*m矩阵,表示已经给各进程分配了多少资源
Need:n*m矩阵=Max - Allocation,表示各进程最多还需要多少资源(一般求出need是解题的第一步)
Request:长度为m的一维数组,表示进程此次申请的各种资源数
算法步骤:
1) 检查此次申请是否超过了之前声明的最大需求数:Request<=Need,turn to 2)
2) 检查此时系统剩余的可用资源是否还能满足这次请求:Request<=Avaiable,turn to 3)else wait
3) 试探着分配,更改各数据结构:
Available=Available-Request; Allocation=Allocation+Request; Need=Need-Request;
4) 用安全性算法检查此次分配是否会导致系统进入不安全状态,若安全才正式分配;否则作废恢复之前的分配状态
安全性算法步骤:
1) 设置一个长度为m的向量Work和长度为n的向量Finisho Work用于保存进程继续运行所需的各类资源数目,Finish用于判断是否有足够的资源分配给进程。其初始值表示为: Work=Available; Finish[i]=false(i=1, 2, 3,.. n) (若为true,资源足够分配)。
2) 从进程集合查找满足下列条件的进程:
Finish[i]=false;
Need<=Work;若找到, 执行3),否则,执行4)。
3) 如果进程P获将资源并进入了安全序列, 可顺利执行,直至完成,并梓放出分配给该进程的所有费源,并进行一下操作:
Work=Work+Allocation;
Finish[i]=true;
go to step 2)
4) 若所有进程都能得到资源,即Finish[i]=true;,则表示系统处于安全状态,否则系统处于不安全状态。
【例题】:假设系统中有3种类型的资源A、B、C和5个进程PO PI、P2、P3、P4. A资源的数量为10,B资源的数量为5. C资源的数量为7。在T0时刻系统状基如表所列。系统采用银行家算法实施死锁避免策略。完成对以下问题的分析:
问:1.T0时刻是否为安全状态?若是,请给出安全序列。
2.在T0时刻若进程P1发出资源请求Request(1, 0, 2),是否能够实施资源分配?
3.在②的基础上P4发出资源请求Request(3.3, 0).是否能够实施资源分配?
4.在③的基础上PO发出资源请求Request(0.2.0).是否能够实施资源分配?
(3)死锁检测和解除
死锁预防和死锁避免都是事先预防的措施,在系统分配资源时施加限制条件,若此时不采取任何措施,则应提供死锁检测和接触手段。
①资源分配图
死锁可用资源分配图来描述:
图中进程P1分得了一个R1资源,又申请一个R2资源;进程P2分得了一个R1和一个R2资源,又请求一个R1资源。
②死锁定理
死锁状态可以用资源分配图简化的方法来检测:
在资源分配图中,找出既不阻塞又不孤点的进程(即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有的空闲资源数量),若所有连接该进程的边均满足条件,则该进程能继续运行直至完成,然后释放它占有的所有资源。消去它所有的请求边和分配边,使之成为孤立的结点。判断某种资源是否有空间,应用它的资源数量减去它在资源分配图中的出度。
进程释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。在上图中,进程P2就满足这样的条件。根据上述方法进行一系列简化后,若能消去图中所有的边,则称该图是可完全简化的。
所以死锁定理的必要条件便是当且仅当某状态的资源分配图不可完全简化。
③死锁的解除
根据死锁定理的检测,一旦检测出不可完全简化状态,系统进入死锁,则采取相应的解除方法:
a.资源剥夺法。强占某些进程的资源分配给死锁进程来解除其死锁状态,进而使系统正常运行,但剥夺资源时应防止被强占资源的进程长期处于等待状态。
b.撤销进程法。采用某种算法强制结束部分或者全部死锁进程,释放资源强来解除死锁。
c.进程回退法。采取某种算法让部分进程回退到足以回避死锁的地步,要求进程在运行过程中保存历史信息,设置还原点,退回过程中自动释放资源,解除死锁状态。
【习题】:
1.某系统中有三个并发进程都需要四个同类资源,则该系统必然不会发生死锁的最少资源 B
A.9 B.10 C 11 D.12
···资源数为9时,当三个进程分别占有三个资源时,三个进程均处于等待状态,系统死锁;
资源数为10时,必定会有一个进程得到四个资源,顺利执行完成后其他进程也可以完成
2.某系统中共有11台磁带机,X个进程共享此磁带机设备,每个进程最多请求使用3个
则系统必然不会死锁的最大X值是( ).B
A.4 B.5 C. 6 D.7
···极端情况下,当每个进程分配了2台磁带机,此时任意进程只要再获得一个资源就可以执行完成,然后释放资源给其他进程使用。这种情况下即有:2X+1=11,解得X=5,系统最大可以有5个进程并发不产生死锁
3.死锁的四个必要条件中,无法破坏的是( ).
A.环路等待资源 B.互斥使用资源 C.占有且等待资源 D.非抢夺式分配
···有些资源例如打印机只能互斥使用,所以破坏互斥的方法不太可行,有些场合甚至需要保护这种互斥性
4.系统的资源分配图在下列情况下,无法判断是否处于死锁状态的有( )。AD
A 出现了环路 B.没有环路
C.每种资源只有一个,并出现环路
D.每个进程结点至少有一条请求边
····资源分配图出现环路说明产生了循环等待,但只满足循环等待不一定导致死锁,因为同类资源数是不确定的,所以只是死锁的必要条件;而没有环路,即破坏了循环等待条件,一定不会发生死锁;系统每种资源只有一个,且出现环路是系统出现死锁的充分必要条件,可以确定是否发生死锁;每个结点至少有一条请求边,当资源数足够时则不会发生死锁,资源不足时可能发生死锁
5.假设具有5个进程的进程集合P= {P0.P1,P2,P3,P4},系统中有三类资源A,B,C. 假设在某时刻有如下状态,见下表:
请问当xyz取下列哪些值时。系统是处于安全状态的? A
A. 1,4.0 B. 0,6,2 C.1,1,1 D.0,4,7
6.[2011统考真题]某时刻进程的资源使用情况见下表,此时的安全序列是( ). D
A. P1,P2,P3,P4. B. P1.P3.P2,P4. C.P1,P4,P3,P2 D.不存在
7.[2015统考真题]若系统S1采用死锁避免方法,S2采用死锁检测方法。下列叙述中,正确的是( )。A. S1会限制用户申请资源的顺序,而S2不会
B. S1需要进程运行所需的资源总量信息,而S2不需要
C. S1不会给可能导致死锁的进程分配资源,而S2会
··A中限制用户申请资源的顺序是“破坏循环等待”条件的手段,属于死锁预防的范畴;B中当执行银行家算法时,检测系统安全状态时需要对进程的资源总量进行分析;C在死锁的检测和解除中,系统为进程分配资源时不采取任何措措施,只是提供死锁检测和解除手段
8.[2018统考真题]假设系统中有4个同类资源,进程P1,P2和P3需要的资源数分别为4,3和1, P1,P2和P3已申请到的资源数分别为2, 1和0,则执行安全性检测算法的结果是( )。A
A.不存在安全序列,系统处于不安全状态
B.存在多个安全序列,系统处于安全状态
C.存在唯一安全序列P3,P1,P2,系统处于安全状态
D.存在唯一安全序列P3, P2,P1.系统处于安全状态