解析死锁问题

来源:互联网 发布:微信淘宝客论坛 编辑:程序博客网 时间:2024/05/17 09:14

一、什么是死锁?

死锁,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。

在多道程序设计环境下,多个进程可能竞争一定数量的资源。一个进程申请资源,如果资源不可用,那么进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待进程有可能无法改变状态,这种情况称为死锁。

二、死锁产生的场景以及原因?

(1)死锁产生的场景:

a.多线程申请锁时互相申请对方的锁,彼此申请对方资源不足而导致的死锁,A申请B的锁的时候,因为锁被占用所以会把A挂起等待B释放锁,同时B申请A的锁,同样因为A的锁被占用,B会被挂起等待,AB都被挂起没有机会释放锁,则进入了死锁。

b.单线程有自己的锁,但是还要申请新锁,在申请新锁的时候,因为锁被自己占用,所以会被挂起等待,而自己又被挂起,没机会释放锁,则会进入死锁。

(2)死锁产生的原因:

a.因为系统的资源不足,不能满足进程的资源请求,会导致多个线程同时争夺一个资源。
b.进程运行推进的顺序不合适。
c.资源分配不当,有的进程资源分配太少,会因为争夺资源而陷入死锁。

三、死锁产生的必要条件

死锁产生一共有四个必要条件,如果在计算机系统中同时具备下面四个必要条件时,那么会发生死锁。只要下面四个条件有一个不具备,系统就不会出现死锁。接下来我们来看看这四个必要条件都是什么吧!

(1)互斥条件:

即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有。必须等到占有该资源的进程主动释放它之后,其它进程才能占有该资源。这是由资源本身的属性所决定的。如独木桥就是一种独占资源,两方的人不能同时过桥。

(2)不可抢占条件:

进程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者进程自行释放。

如过独木桥的人不能强迫对方后退,也不能非法地将对方推下桥,必须是桥上的人自己过桥后空出桥面(即主动释放占有资源),对方的人才能过桥。

(3)占有且申请条件:

当进程因请求资源而阻塞时,对已获得的资源保持不放。

还以过独木桥为例,甲乙两人在桥上相遇。甲走过一段桥面(即占有了一些资源),还需要走其余的桥面(申请新的资源),但那部分桥面被乙占有(乙走过一段桥面)。甲过不去,前进不能,又不后退;乙也处于同样的状况。

(4)循环等待条件:

在发生死锁时,必然存在一个进程–资源的环形链。

例如存在一个进程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一资源,……,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环。就像前面的过独木桥问题,甲等待乙占有的桥面,而乙又等待甲占有的桥面,从而彼此循环等待。

四、死锁的解除:

解除死锁主要有两种方法:

1、抢占资源:从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。

2、终止或撤销进程:终止或撤销系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态解脱出来。

五、避免死锁

我们来看看有什么方法可以避免死锁!

(1)破坏循环等待条件:

确保此条件不成立的方法就是对所有资源类型进行完全排序,且要求每个进程按递增顺序来申请资源。

实现方法:资源有序分配法
遵循两种协议:
a.每个进程只按递增顺序申请资源。(第一次可以申请多个,但之后申请编号必须比前面大)
b.进程申请编号比拥有资源编号小时必须先释放大编号资源。

(2)由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。

最具代表性的避免死锁的算法是银行家算法。

接下来让我们看看关于银行家算法的原理吧!

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

为保证资金的安全,银行家规定:

(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;

(2)顾客可以分期贷款,但贷款的总数不能超过最大需求量;

(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;

(4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

原创粉丝点击