死锁产生条件以及预防和处理算法

  一、死锁的概念

  在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。

  二、死锁产生的原因

  产生死锁的原因主要是: 

  (1) 因为系统资源不足。 

  (2) 进程运行推进的顺序不合适。 

  (3) 资源分配不当等。 

  如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

  产生死锁的四个必要条件: 

  (1) 互斥条件:一个资源每次只能被一个进程使用。 

  (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 

  (3) 非抢占:进程已获得的资源,在末使用完之前,不能强行抢占。 

  (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

  三、死锁处理方法:

  (1)可使用协议以预防或者避免死锁,确保系统不会进入死锁状态;

  (2)可允许系统进入死锁状态,然后检测他,并加以恢复;

  (3)可忽视这个问题,认为死锁不可能发生在系统内部。

  四、死锁预防

  1、互斥:对于非共享资源,必须要有互斥条件;

  2、占有并等待:

  为了确保占有并等待条件不会出现在系统中,必须保证:当一个进程申请一个资源时,它不能占有其他资源。一种可以使用的协议是每个进程在执行前申请并获得所有资源,可以实现通过要求申请资源的系统调用在所有的其他系统调用之前执行。

  3、非抢占:

  为了确保第三个条件不成立,可以使用如下协议:如果一个进程占有资源并申请另一个不能立即分配的资源,那么其现已分配资源都可被抢占;

  4、循环等待:

  为了确保循环等待条件不成立,一种可行的算法是:对所有资源进程排序,且要求每个进程按照递增顺序来申请进程。

  五、死锁避免:

  死锁避免算法只介绍一种:银行家算法

  1、数据结构设计:

  (一)可利用资源向量矩阵AVAILABLE。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果AVAILABLE [j]= K,则表示系统中现有R类资源K个 
  (二)最大需求矩阵MAX。这是一个n*m的矩阵,用以表示每一个进程对m类资源的最大需求。如果MAX =K,则表示进程i需要R类资源的数目为K。 
  (三)分配矩阵ALLOCATION。这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果ALLOCATION =K,则表示进程i当前已分得R类资源的数目为K。 (四)需求矩阵NEED。这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果NEED =K,则表示进程i还需要R类资源K个,才能完成其任务。 上述矩阵存在下述关系: NEED = MAX-ALLOCATION

  2、算法实现

  (一) 初始化 由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。 
  (二)银行家算法 在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。 银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。 设进程cusneed提出请求REQUEST ,则银行家算法按如下规则进行判断。 
  (1)如果REQUEST [cusneed] <= NEED[cusneed],则转(2);否则,出错。 
  (2)如果REQUEST [cusneed] <= AVAILABLE[cusneed],则转(3);否则,出错。

  (3)系统试探分配资源,修改相关数据: 
AVAILABLE-=REQUEST[cusneed]; ALLOCATION[cusneed]+=REQUEST[cusneed]; 
NEED[cusneed]-=REQUEST[cusneed]; 
  (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 

  六、安全性检查算法 
  (1)设置两个工作向量Work=AVAILABLE;FINISH 
  (2)从进程集合中找到一个满足下述条件的进程, 
  FINISH==false; 
  NEED<=Work; 
  如找到,执行(3);否则,执行(4) 
  (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 Work+=ALLOCATION; Finish=true; GOTO 2 
  (4)如所有的进程Finish= true,则表示安全;否则系统不安全。

  七、死锁恢复算法:

  1、进程终止

  有两种方法可以通过终止进程来取消死锁:

  (1)终止所有死锁进程:这种算法简单,粗暴,直接,但是代价很大;

  (2)一次终止一个进程直到取消死循环为止:这种方法开销大,这是因为每结束一个进程,都必须调用死锁检测算法来确定进程是否处于死锁;

  2、资源抢占

  通过抢占资源以取消死锁,逐步从进程中抢占资源给其他进程使用,直到死锁被打破;

原文地址:https://www.cnblogs.com/PIRATE-JFZHOU/p/8145146.html