避免死锁
目录
参考资料:
避免死锁同样是属于事先预防的策略,但并不是事先采取某种限制措施,破坏产生死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。这种方法所施加的限制条件较弱,可能获得较好的系统性能,目前常用此方法来避免发生死锁。
系统安全状态
在死锁避免方法中,把系统的状态分为安全状态和不安全状态。当系统处于安全状态时,可避免发生死锁。反之,当系统处于不安全状态时,则可能进入到死锁状态。
安全状态
在该方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,才可将资源分配给进程,否则,令进程等待。
所谓安全状态,是指系统能按某种进程推进顺序(P1,P2,...,Pn)为每个进程 Pi 分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。此时称(P1,P2,...,Pn)为安全序列。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
虽然并非所有不安全状态都必然会转为死锁状态,但当系统进入不安全状态后,就有可能进入死锁状态。反之,只要系统处于安全状态,系统就不会进入死锁状态。因此,避免死锁的实质在于,系统在进行资源分配时,应使系统不进入不安全状态。
安全状态之例
假定系统中有三个进程 P1、P2 和 P3,共有 12 台磁带机。
进程 P1 总共要求 10 台磁带机,P2 和 P3 分别要求 4 台和 9 台。
假设在 T0 时刻,进程 P1、P2 和 P3 已分别获得 5 台、2 台和 2 台磁带机,尚有 3 台空闲未分配,如下表所示:
进程 | 最大需求 | 已分配 | 可用 |
---|---|---|---|
P1 | 10 | 5 | 3 |
P2 | 4 | 2 | |
P3 | 9 | 2 |
经分析发现,在 T0 时刻系统是安全的,因为这时存在一个安全序列(P2,P1,P3),即只要系统按此进程序列分配资源,就能使每个进程都顺利完成。
例如,将剩余的磁带机取 2 台分配给 P2,使之继续运行,待 P2 完成便可释放出 4 台磁带机,于是可用资源增至 5 台;以后再将这些全部分配给进程 P1,使之运行,待 P1 完成后,将释放出 10 台磁带机,P3 便能获得足够的资源,从而使 P1、P2、P3 每个进程都能顺利完成。
利用银行家算法避免死锁
银行家算法的思想:每当一个新进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将这些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它,否则让进程等待。