1. 死锁的定义
(1)概念
一个进程组内的每一个进程都在等待仅由该组进程内的其他进程才能引发的事件,那么该进程是死锁的。
如:小A与小B一起去吃饭,桌子上只有两根筷子。小A拿一根筷子,小B拿起另一根筷子,当菜上桌时,小A需要小B的那根筷子才能够迟到饭,小B需要小A的那根筷子才能吃到饭,但是他们彼此又都不愿意将自己的筷子给对方,从而两人就会无休止的等下去,都吃不了饭。这种现象就是死锁。
在上述例子中,把人比作进程,把筷子比作资源。则A进程拥有a资源,需要B进程拥有的b资源;B进程拥有b资源,需要A进程拥有的a资源。双方都希望对方能释放自己所需要的资源,但是又都因为无法得到自己需要的资源而释放不了自己所占有的资源,一直处于这样的僵持状态就造成了“死锁”。
(2)死锁产生的原因
- 资源有限,不能满足并发进程对资源的需求
- 进程推进顺序不合适:资源有限也不一定差生死锁,只要进程的推进顺序合适即可。如对面两人过独木桥:
情景1:两人都想先过桥:结果在桥上堵住都过不了桥
情景2:若一人在对面看有人在桥上正往这边走就不上桥,等对端的人走完了再上桥:结果两人都能过桥
所以, 如果程序设计得不合理,造成进程推进的顺序不当,也会出现死锁。
2. 产生死锁的必要条件
产生进程死锁必须同时具备以下四个必要条件:
- 互斥条件:一个资源在同一时间段内只能被一个进程所拥有。若其他进程要请求该资源,只能先等待,直到占有该资源的进程释放该资源。
- 请求和保持条件:进程拥有了至少一个资源后要继续请求其他资源,而该资源也被其他进程所占有,则请求被阻塞,但它所拥有的资源也不释放
- 不可抢占条件:一旦资源被进程所拥有,其他进程不能抢,除非该进程自己释放了这份资源。
- 循环等待:在一个进程组{A1,A2,......,An}中,A1等待A2的资源,A2等待A3的资源,......,An等待A1的资源,形成资源的循环列
注:以上四个必要条件只要任意一个条件不满足,则不会发生死锁。
3. 处理死锁的方法
目前处理死锁的方法有:预防死锁、避免死锁、检测死锁和解除死锁
3.1 预防死锁
破坏死锁产生的必要条件的一个或多个,避免发生死锁。
(1)破坏互斥条件:即允许一个资源一段时间内被多个进程访问。但是互斥条件是某些非共享设备所具有的属性,不能破坏,所以此条件的实施比较不可行。
(2)破坏请求和保持条件:允许一个进程在只获得运行初期所需要的资源后就开始运行。运行过程中再逐步释放已分配给自己的、且已用完的资源,然后再请求新的所需要的资源。
- 优点:使进程快速完成任务,提高设备利用率,减少进程发生饥饿的机率。
(3)破坏不可抢占条件:一个进程已经保持了不可抢占的资源,当他再次申请资源而得不到满足时,就应该释放已经保持的资源供其他进程用,等到之后需要时再重新申请。即已占有的资源会被暂时释放。
- 缺点:实现复杂、增加系统开销,降低系统吞吐量(反复申请和释放资源导致进程的执行被无限推迟)
(4)破坏循环等待条件:对资源事先分类编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,进程占用了小资源才能申请大号资源,这样就使得进程在进行资源请求和占用时不会形成环路,避免了死锁。
- 优点:改善资源利用率与系统吞吐量
- 缺点:资源使用顺序与系统规定顺序不同,造成对资源的浪费
3.2 避免死锁
避免死锁的思想是:资源在动态分配过程中,防止系统进入不安全状态,以避免死锁的发生。即每次动态分配资源时都要动态计算资源分配后是否发生死锁,如果发生就不这样分配资源,如果不会进继续进行。
(1)安全状态:系统中的每个进程能按一定次序分配资源,直至满足每个进程对资源的最大需求量,使得每个进程都顺利完成。这个次序称为安全序列。若系统中存在这个安全序列,则成系统处于安全状态。否则系统处于不安全状态。
(2)安全状态举例
假设系统有3个进程A、B、C,12个可用资源。A进程总共需要10个资源,B进程总共需要4个资源,C进程总共需要9个资源,T0时刻A、B、C分别已经获得的资源个数有5、2、2,还有3个空闲资源,如下表所示:
进程 | 最大需求 | 已占有 | 可用 |
A | 10 | 5 |
|
B | 4 | 2 |
|
C | 9 | 2 |
|
上图在T0时刻系统是安全的。将3个空闲资源给B进程2个,则还剩1个空闲资源;等B进程完成则释放4个资源,此时有5个空闲资源。将这5个空闲资源都分配给A进程,等A进程完成后释放10个空闲资源。再将这10个空闲资源给C进程分配7个,C进程完成并释放资源。使得ABC三个进程都能顺利完成。
(3)如果不按照安全序列分配资源,系统有可能从安全序列转到不安全序列。如上述例子若一开始就给C进程分配1个资源,则系统进入不安全状态。此时无法找到一个安全序列。如把剩余两个资源分给B进程,B进程完成后释放4个进程;既不满足A进程需要5个资源的要求,也不满足C进程需要6个资源的要求,彼此都不能推进到完成,又彼此都在等待对方释放资源,从而造成死锁。
(4)系统处于安全状态,就一定不会发生死锁;但是只要系统进入不安全状态,则有可能发生死锁。
3.3 检测死锁与解除死锁
如果在系统中,既没有死锁预防措施,也没有死锁避免算法,则很有可能发生死锁。在这种情况下,应提供死锁检测算法与死锁解除算法。
允许进程在运行过程中发生死锁,但是可以通过死锁检测算法及时检测出系统中是否有死锁的发生。当认定系统有死锁发生时,要利用死锁解除算法将系统从从死锁中解救出来。常用的解除死锁的两种方法是:
(1)抢占资源:从一个或多个进程中抢占足够多的资源分配给发生死锁的进程,以解除死锁状态
(2)终止进程:终止系统中的一个或多个死锁进程,打破循环环路,解除死锁状态。