2.4 死锁
2.4.1 死锁的基本概念
死锁的定义
多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都无法向前推进。
死锁产生的原因
(1)系统资源的竞争
只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。
(2)进程推进顺序非法
进程在运行过程中,请求和释放资源的顺序不当,同样会导致死锁。信号量使用不当也会造成死锁。
(3)死锁产生的必要条件
产生死锁必须同时满足以下4个条件,只要其中任意一个不成立,死锁都不会发生。
- 互斥条件:在一段时间内某资源仅为一个进程所占有。
- 不剥夺条件:进程只能主动释放获得的资源。
- 请求并保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得资源保持不放。
- 循环等待条件:存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。
2.4.2 死锁的处理策略
(1)死锁预防
设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。
(2)避免死锁
在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。
(3)死锁的检测及解除
无需采取任何限制性措施,允许进程在运行过程中发生死锁,通过系统的检测机构及时的检测出死锁的发生,然后采取某种措施解除死锁。
2.4.3 死锁预防
破坏四个必要条件之一即可。
死锁产生的必要条件 | 破坏手段 |
---|---|
互斥条件 | 若允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,所以这种方法不大可行,而且在有的场合应该保持这种互斥性。 |
不剥夺条件 | 当一个以保持了某些不可剥夺资源的进程请求新的资源而得不到满足时,他必须释放已经保持了所有资源,以后需要时再重新申请。常用易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。 |
请求并保持条件 | 采用预先静态分配方法的进程在运行前一次申请完它所需要的全部资源,在他的资源未满足前,不把它投入运行,一旦投入运行,这些资源就一直归他所有,不再提出其他资源请求。 |
循环等待条件 | 采用顺序资源分配法,首先给系统中的资源编号,规定每个进程必须按编号递增的顺序申请资源,同类资源一次申请完。 |
2.4.4 死锁避免
系统安全状态
系统在进行资源分配之前,应先计算计算此次分配资源的安全性,若此次分配不会导致系统进入不安全状态,则将系统资源分配给进程,否则让进程等待。
安全状态是指系统能按某种进程推进顺序P1,P2,…,Pn为每个进程分配起所需的资源。直至满足每个进程对资源的最大需求,使每个进程都可顺序完成。此时称P1,P2,…,Pn安全系列。若系统无法找到一个安全序列,则称系统处于不安全状态。
安全状态一定是没有死锁发生。不安全状态不一定导致死锁。
银行家算法
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。
例、假设系统有5个进程{P0,P1,P2,P3,P4},3类资源{A,B,C},各类资源的数量分别为10,5,7。在T0时刻的资源分配情况如下表:
进程 | 共需资源 A B C | 已分配资源 A B C | 还需要资源 A B C |
---|---|---|---|
P0 | 7 5 3 | 0 1 0 | 7 4 3 |
P1 | 3 2 2 | 2 0 0 | 1 2 2 |
P2 | 9 0 2 | 3 0 2 | 6 0 0 |
P3 | 2 2 2 | 2 1 1 | 0 1 1 |
P4 | 4 3 3 | 0 0 2 | 4 3 1 |
此时系统还剩余资源为3,3,2。将系统剩余资源量分别与“还需要资源”的各行进行比较。如(3,3,2)>(1,2,2), (3,3,2)>(0,1,1),对应的两个进程为P1和P3,可选择P1(也可以选择P3)暂时加入安全序列。
执行完P1后,释放其所占资源,此时系统还剩余资源为(3,3,2)+(2,0,0)=(5,3,2)。继续将(5,2,2)和“还需要资源”的各行进行比较,重复上述步骤,最后可以得到安全序列{P1,P3,P4,P2,P0}。
2.4.5 死锁检测和解除
资源分配图
上图表示,进程P1已得到了2个R1资源,正在请求1个R2资源;进程P2得到了1个R1和1个R2资源,并又请求1个R1资源。
死锁定理
状态为死锁的条件是:当且仅当状态的资源分配图是不可简化的。(简化:若连接到进程上的所有边,其对应的资源的申请数量都小等于系统中共有的资源数量,则可以将该进程上的所有边消去。)
死锁解除
- 资源剥夺法:挂起某些死锁进程,抢占它的资源并分配给其他进程。
- 撤销进程法:强制撤销部分甚至全部死锁进程并剥夺这些进程的资源。
- 进程回退法:让一个或多个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而非被剥夺。