死锁概念,死锁产生的四个必要条件,如何避免和预防死锁
一、死锁概念
死锁是指两个或多个进程在执行的过程中,因为竞争资源而造成互相等待的现象,若无外力作用,它们都无法推进下去。-
1.在等待对方时占有不可抢占的资源-
举个例子,假设有P1,P2两个进程,都需要A和B两个资源,两个都等待另一个资源而不肯释放资源,就这样无限等待中,这就形成死锁。这只是死锁的一种情况,就是在等待对方时占有不可抢占的资源。-
2.竞争可消耗资源引起死锁-
有P1,P2,P3三个进程,P1向P2发送消息并接受P3消息,P2向P3发送消息并接受P2消息,P3向P1发送消息并接受P2消息,如果设置是先接到消息后发送消息,则所有的消息都不能发送,也造成了死锁。-
3.进程推进顺序不当引起死锁-
有进程P1,P2,都需要资源A,B,本来可以P1运行A,P1运行B,P2运行B,P2运行A,P2运行B,但顺序换了,P1运行A时P2运行B,容易引发死锁,属于第一种的资源抢占问题。
二、产生死锁的四个必要条件
1.互斥条件-
一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所使用。此时如果有其他进程请求该资源,则请求进程只能等待。-
2.请求与保持条件-
进程中已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其他进程占有,此时请求进程被阻塞,但对自己已经获得资源保持不放。-
3.不可剥夺条件-
进程未使用完的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。-
4.循环等待条件-
若干进程间形成首尾相接循环等待资源的关系。在发生死锁时必然存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请。
注意:这四个条件是死锁的必然条件,只要系统发生死锁,这些条件必然成立。只要有上述条件有一条不满足,就不会发生死锁。
三、死锁的预防
我们可以通过破坏产生死锁的四个必要条件来预防死锁,由于资源互斥是固有特性无法改变的。-
1.破坏“请求与保持”条件-
方法一:静态分配,每个进程在开始执行时就申请他所需要的全部资源。-
方法二:动态分配,每个进程在申请所需要的资源时他本身不占用系统资源。-
2.破坏“不可剥夺”条件-
一个进程不可获得其所需要的全部资源便处于等待状态,等待期间他占用的资源将被隐式的释放重新加入到系统的资源列表中,可以被其他进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。-
3.破坏“循环等待”条件-
采用资源有序分配的基本思想。将系统中的资源顺序进行编号,将紧缺的、稀少的资源采用较大的编号,申请资源时必须按照编号的顺序执行,一个进程只有较小编号的进程才能申请较大编号的进程。
四、死锁的避免
基本思想:系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则分配。这是一种动态策略。典型的避免死锁的算法试银行家算法。
五、死锁的检测及解除
无需采取任何措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时的检测出死锁的发生,然后采取某种措施解除死锁。
死锁的预防和避免都属于事先预防策略,但预防死锁的限制条件较为严格,实现起来较为简单,但往往导致资源利用率低。避免死锁的限制条件相对宽松,资源分配后需要通过算法来判断是否进入不安全状态,实现起来较为复杂。