您的位置:首页 > 其它

死锁四个必要条件及死锁的预防、检测、避免、解除

2017-04-04 23:26 691 查看

死锁:

我们先来思考一个问题:我们加锁以后,再次进行加锁,这样会发生什么?

当我们第二次申请锁的时候,这个时候锁已经被占用了,该线程就会被挂起,但是刚好这个线程就是拥有锁的线程了,那么这个线程就永远挂起等待了,这个我们就叫死锁。

1.死锁发生的情形:

(1)一个线程两次申请锁。

(2)两个线程互相申请对方的锁,但是对方都不释放锁。

2.死锁产生的必要条件:

(1) 互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。

(2)占有且等待:当一个进程在等待分配得到其他资源时,其继续占有已分配得到的资源。

(3)非抢占:不能强行抢占进程中已占有的资源。

(4)循环等待:存在一个封闭的进程链,使得每个资源至少占有此链中下一个进程所需要的一个资源。

3.处理死锁的四种方法:

(1)死锁预防:通过确保死锁的一个必要条件不会满足,保证不会发生死锁

(2)死锁检测:允许死锁的发生,但是可以通过系统设置的检测结构及时的检测出死锁的发生,采取一些措施,将死锁清除掉

(3)死锁避免:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁

(4)死锁解除:与死锁检测相配套的一种措施。当检测到系统中已发生死锁,需将进程从死锁状态中解脱出来。

常用方法:撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程。

4.处理死锁的具体细节:

一、死锁预防:破坏死锁的四个条件中的一个或几个

(1)互斥:它是设备的固有属性所决定的,不仅不能改变,还应该加以保证。

(2)占有且等待:为预防占有且等待条件,可以要求进程一次性的请求所有需要的资源,并且阻塞这个进程直到所有请求都同时满足。这个方法比较低效。

(3)不可抢占:预防这个条件的方法:
*如果占有某些资源的一个进程进行进一步资源请求时被拒绝,则该进程必须释放它最初占有的资源。
*如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另外一个进程,要求它释放资源。

(4)循环等待:通过定义资源类型的线性顺序来预防。
*如果一个进程已经分配了R类资源,那么接下来请求的资源只能是那些排在R类型之后的资源类型。该方法比较低效。

二、死锁避免:

两种死锁避免算法:

*进程启动拒绝:如果一个进程的请求会导致死锁,则不启动该进程。

*资源分配拒绝:如果一个进程增加的资源请求会导致死锁,则不允许此分配(银行家算法)。 

银行家算法:

1.如果request<=need,转向步骤2;否则认为出错,因为请求资源大于需要资源。

2.如果request<=available,转向步骤3,;否则尚无足够资源,进程p阻塞;

3.系统尝试为把资源分配给进程P,并修改available、allocation和need的数值。

4.系统执行安全性算法,检查此次分配后系统是否处于安全状态,若安全,才正式将资源分配给进程P,否则将本次试探性分配作废,让进程P等待。
*安全状态:系统能按照某种进程顺序,为每个进程分配资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利完成。

三、死锁检测

一个简单的死锁检测算法:

每个进程、每个资源制定唯一编号      设定一张资源分配表,记录各进程与占用资源之间的关系      设置一张进程等待表,记录各进程与要申请资源之间的关系

 资源分配表

资源进程
r1p2
r2p5
r3p4
r4p1
....
 进程等待表
资源进程
p1r1
p2r3
p4r4
....

分析: 

p1-r1-p2-r3-p4-r4-p1 出现环路引起死锁

(四)、死锁的解除:

*两种常用的死锁解除方法:

1) 资源剥夺法。挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。

2) 撤销进程法。强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: