在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种状态时,若无外力作用,他们都无法在向前推进。要预防死锁,有摒弃“请求和保持”条件,摒弃“不剥夺”条件,摒弃“循环等待”条件等方法。但是,在预防死锁的几种方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统状态分为安全状态和不安全状态,便可避免死锁的发生。
而最具代表性的避免死锁的算法,便是Dijkstra的银行家算法。利用银行家算法,我们可以来检测CPU为进程分配资源的情况,决定CPU是否响应某进程的请求并为其分配资源,从而很好避免了死锁的产生。
(1)互斥条件。进程对所分配到的资源进行排他性的使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其他进程请求该资源,则请求只能等待,直至占有该资源的进程用完释放。
(2)请求和保持条件。进程已经占有了至少一个资源,但是又提出了新的资源请求,而该被请求的资源已被其他进程占有,此时请求进程被阻塞,同时其对自己已占有的资源保持不放。
(3)不可占有条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时自己释放。
(4)循环等待条件。该条件指在发生死锁时,必然存在一个“进程-资源”循环链,即进程集合中p0正在等待已被p1占用的资源,p1正在等待已经被p2占用的资源,......,pn正在等待p0占用的资源。
(1)预防死锁。这是一中较为简单和直观的事先预防方法。该方法是通过设置某些限制条件,去破坏产生死锁的必要条件中的一个或多个来预防死锁的。预防死锁是一种较易实现的方法,已被广泛使用。
(2)避免死锁。该方法同样属于事先预防方法,但是它并不需要事先采取各种限制措施来破坏产生死锁的条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁。
(3)检测死锁。这种方法无须事先采取任何限制措施,允许进程在运行过程中发生死锁。但可以通过检测机构及时地检测出死锁的发生,然后采取适当的措施把进程从死锁中解脱出来。
(4)解除死锁。该方法是指,当检测到系统已经发生死锁时就采取相应的措施,将进程从死锁状态中解脱出来。通常采用的措施是撤销一些进程,回收他们的资源,将回收的资源分配给已处于阻塞状态的进程,使用这些进程能够继续运行。
上述四种方法,从(1)到(4)对死锁的防范措施逐渐降低,但相应的资源利用率逐渐提高,且进程因资源因素而阻塞的频率逐渐下降。(即进程并发程度逐渐提高)
本文研究死锁避免,即死锁处理方法的第三种,主要使用银行家算法进行死锁避免。
银行家算法是一种具有代表性的死锁避免算法,是由Dijkstra提出的。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。为了了解系统的资源分配情况,假定系统的任何一种资源在任意时刻只能被一个进程使用,任何进程已经占用的资源只能由进程自己释放,而不能由其他进程抢占。当进程申请的资源数大于进程所需宣布的最大资源数时,系统会认为出错。
当进程申请的资源大于目前系统拥有的资源时,该进程必须等待。只有进程申请的资源合法,并且系统当前拥有的资源足够分配时,系统会将这些资源试分配给这些进程,然后进行安全性检测,若安全,则实际分配给进程,否则本次试分配作废,回复原来的资源分配情况,让此进程等待。
在避免死锁方法中,把系统的状态分为安全状态和不安全状态两种。当系统处于安全状态时可避免死锁,而系统处于不安全状态时,则可能会进入死锁状态。
在避免死锁方法中,允许进程动态的申请资源,但系统在进行资源分配之前,应该计算此次资源分配的安全性。若此次资源分配不会导致系统进入不安全状态,则可以将资源分配给进程。否组,令进程等待。所谓的安全状态,是系统可以按照某种进程推进顺序(P0,P1,P2,…,Pn),为每个进程Pi分配其所需的资源,直至满足进程对资源的最大需求,进而使每个进程都可以顺利完成的一种系统状态。此时顺序(P0,P1,P2,…,Pn)称为安全序列。如果系统找不到这样一个序列,则称为不安全序列。虽然不是所有的不安全状态都会引起死锁,但是当系统进入不安全状态后就有可能进入死锁。而只要系统处于安全状态,就不可能会进入死锁。因此,避免,避免死锁的实质在于,让系统在分配资源时不进入不安全状态。
假设系统有3个进程P1、P2、P3,共有12台打印机。进程P1总共需要10台,进程P2,P3分别需要4台和9台。假设在t0时刻,进程P1,P2,P3分别已经获得5,2,2台打印机,还有3台打印机为分配。如表1所示
表1 t0时刻资源分配表
进程 |
最大需求 |
已分配 |
可用资源 |
P1 |
10 |
5 |
3 |
P2 |
4 |
2 |
|
P3 |
9 |
2 |
分析:首先将可用资源分配给P2,因为P2已分配资源加系统可用资源之和大于等于P2最大需求资源,等P2进程完毕释放资源即可用资源变成5,同理在分配给P1,P1结束释放资源即可用资源变为10,最后系统将资源分配给P3,P3结束,系统可用资源变成12,系统中所有的进程执行完毕,存在一个