死锁的概念、处理方法

来源:互联网 发布:2016淘宝小号都死完了 编辑:程序博客网 时间:2024/05/30 23:30
1 产生死锁的原因
     (1)竞争资源。进程竞争数量不足的资源。
     (2)进程间推进顺序非法。进程请求和释放资源的顺序不当。

2 产生死锁的必要条件
     (1)互斥条件
          进程对分配到的资源进行排他性使用,即在一段时间内某资源只由一个进程占用。

     (2)请求和保持条件
          进程在保持了至少一个资源的时候提出了新的资源请求,但该资源已被其它进程占有,而自己又对已经获得的资源不释放。

     (3)不剥夺条件
          进程已获得的资源,在未使用完之前,不能被剥夺。

     (4)环路等待条件
          发生死锁时存在一个进程—资源的环形链。进程集合{P0 , P1 , ... , Pn}中,P0等待P1占用的资源,P1等待P2占用的资源,......,Pn等待P0占用的资源。


3 处理死锁的方法

3.1 预防死锁
     设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个条件。

     (1)摒弃“请求和保持条件”条件
          系统规定所有进程在开始运行之前,都必须一次性地申请其在整个运行过程所需的全部资源
     缺点:严重浪费资源,使进程延迟运行。
     
     (2)摒弃“不剥夺”条件
          当一个已经保持了某些资源的进程,再提出新的资源请求而不能立即得到满足时,必须释放它保持了的所有资源,待以后需要时再重新申请。
          缺点:实现复杂,要付出很大代价。资源的释放会造成前段工作实效。

     (3)摒弃“环路等待”条件
          系统将所有资源按类型进行线性排队,并赋予不同的序号。如:输入机1,打印机2,磁带机3,磁盘4。所有进程对资源的请求必须严格按照资源序号递增的次序提出
          缺点:系统中资源的序号必须相对稳定,这就限制了新类型设备的增加。另外,进程使用各类资源的顺序可能和系统规定的申请顺序不同,造成对资源的浪费。

3.2 避免死锁
     防止系统进入不安全状态,从而避免发生死锁。

     安全状态:
          存在一种进程顺序 ,系统能按照此顺序(安全序列)来为每个进程Pi分配其所需要的资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成。
     不安全状态:
          不存在这样的安全序列。

     银行家算法:
          当进程Pi发出资源请求后,系统试探着把资源分配给Pi,并判断分配后的状态是否为安全状态。如果安全,才正式将资源分配给Pi,如果不安全,则恢复原来的资源分配状态,让进程Pi等待。
     判断安全状态的方法:
     从进程集合中找到一个能满足其资源需求的进程,给它分配资源,等其完成后可回收其拥有的资源。然后再不断循环。若最后所有进程都可以顺利执行完成,则当前状态为安全状态,否则为不安全状态。

3.3 检测死锁
     允许系统发生死锁,但可以检测出死锁的发生。
     
     资源分配图
     e={pi, rj}是资源请求边,由进程pi指向资源rj,它表示进程pi请求一个单位的资源rj。e={rj , pi }是资源占有边,由资源rj指向进程pi,它表示进程pi占有一个单位的资源rj。
     每次找出在占有和请求的约束下,能顺利完成的进程Pi,消去其所有的请求和占有资源的边。若最后所有的进程都成为孤立点,则当前状态为安全状态;否则为不安全状态。

3.4 解除死锁
          当检测到系统发生死锁时,撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给处于阻塞状态的进程,使之转为就绪状态,继续运行。