操作系统

操作系统学习(七)—— 死锁

2017-09-23  本文已影响36人  曲谐_

死锁的定义

进程之间互相等待资源又都不能向前推进的情况,即造成进程相互死等的局面。即每个进程“抓住”一些为其他进程所等待的资源不放。其结果是谁也得不到它所申请的全部资源,导致这些进程都无法继续运行。

产生死锁的原因

死锁产生的必要条件:

死锁的预防(静态策略)

上面说了死锁产生的必要条件,那么只要打破其中一个,死锁就不会发生。

银行家算法(死锁的动态策略)

1)安全序列
我们首先引入安全序列的定义:所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{P1,P2,...,Pn}就是安全序列。如果存在这样一个安全序列,则系统是安全的;如果系统不存在这样一个安全序列,则系统是不安全的。
安全序列{P1,P2,...,Pn}是这样组成的:若对于每一个进程Pi,它需要的附加资源可以被系统中当前可用资源加上所有进程Pj当前占有资源之和所满足,则{P1,P2,...,Pn}为一个安全序列,这时系统处于安全状态,不会进入死锁状态。  
虽然存在安全序列时一定不会有死锁发生,但是系统进入不安全状态(四个死锁的必要条件同时发生)也未必会产生死锁。当然,产生死锁后,系统一定处于不安全状态。
这是一个著名的避免死锁的算法,是由Dijstra首先提出来并加以解决的。

[背景知识]
一个银行家如何将一定数目的资金安全地借给若干个客户,使这些客户既能借到钱完成要干的事,同时银行家又能收回全部资金而不至于破产,这就是银行家问题。这个问题同操作系统中资源分配问题十分相似:银行家就像一个操作系统,客户就像运行的进程,银行家的资金就是系统的资源。

[问题的描述]
一个银行家拥有一定数量的资金,有若干个客户要贷款。每个客户须在一开始就声明他所需贷款的总额。若该客户贷款总额不超过银行家的资金总数,银行家可以接收客户的要求。客户贷款是以每次一个资金单位(如1万RMB等)的方式进行的,客户在借满所需的全部单位款额之前可能会等待,但银行家须保证这种等待是有限的,可完成的。

例如:有三个客户C1,C2,C3,向银行家借款,该银行家的资金总额为10个资金单位,其中C1客户要借9各资金单位,C2客户要借3个资金单位,C3客户要借8个资金单位,总计20个资金单位。某一时刻的状态如图所示。

银行家算法实例.png

解答
1)选取客户C2,银行家手上资源大于C2请求的资源,C2借款完毕,返还3个资源。
2)选取客户C3,银行家手上资源等于C3请求的资源,C3借款完毕,返还4个资源。
3)选取客户C1,银行家手上资源大于C1请求的资源,C1借款完毕,返还9个资源。
最后返还10个资源,银行家保本。

综上所述,银行家算法是从当前状态出发,逐个按安全序列检查各客户谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作的客户,......。如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。

银行家算法允许死锁必要条件中的:
1)互斥条件(资源被一个人申请其他人无法申请)
2)占有且申请条件(进程占有一部分资源,完成之前继续占有并申请资源)
3)不可抢占条件(占有资源后不能强制解除,只能自己完成后释放)
这样,它与预防死锁的几种方法相比较,限制条件少了,资源利用程度提高了。

死锁的恢复

2.死锁的恢复

一旦在死锁检测时发现了死锁,就要消除死锁,使系统从死锁状态中恢复过来。

上一篇下一篇

猜你喜欢

热点阅读