避免死锁同样是属于事先预防的策略,但并不是事先采取某种限制措施,破坏产生死锁必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。这种方法所施加的限制条件较弱,可能获得较好的系统性能,目前常用此方法来避免发生死锁。
1.系统安全状态
在避免死锁的方法中,允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则进程必须等待。
所谓安全状态,是指系统能按某种进程顺序(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台空闲未分配,如下表所示:
在T0时刻是安全的,因为存在一个安全序列P1,P2,P3,只要系统按此进程序列分配资源,那么每个进程都能顺利完成。也就是说,当前可用磁带机为3台,先把3台磁带机分配给P2以满足其最大需求,P2 结束并归还资源后,系统有5 台磁带机可用;接下来给P1分配5 台.磁带机以满足其最大需求,P1结束并归还 资源后,剩余10台磁带机可用;最后分配7 台磁带机给P3,这样P3也能顺利完成。
若在T0时刻后,系统分配1 台磁带机给P3,系统剩余可用资源数为2 , 此时系统进入不安全状态,因为此时已无法再找到一个安全序列。当系统进入不安全状态后,便可能导致死锁。例如,把剩下的2 台磁带机分配给P2,这样,P2完成后只能释放4 台磁带机,既不能满足P1又不能满足P3,致使它们都无法推进到完成,彼此都在等待对方释放资源,陷入僵局,即导致死锁
2.银行家算法
(1)银行家算法的数据结构
最有代表性的避免死锁的算法是 Dijkstra 的银行家算法。由于该算法原本是为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能 满足所有客户需要的情况。
为了实现银行家算法,必须设置四个数据结构,分别用来描述系统中可利用的资源、所有进程对资源的最大需求、系统中的资源分配,以及所有进程还需要多少资源的情况。
无
登录后开始许愿
暂无评论,来抢沙发