操作系统概念学习笔记 第八章 死锁

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

 

系统模型:

  在正常操作模式下,进程按如下顺序使用资源:

    1 申请:如果申请不能立即被允许,那么申请进程必须等待直到它获得该资源为止。

    2 使用:进程对资源进行操作

    3 释放

  

 

 

死锁特点

  引起死锁的4个条件:

    1 互斥,至少有一个资源必须处于非共享模式

    2 占有并等待,一个进程必须占有至少一个资源,并等待另一资源。而该资源为其他进程所占有

    3 非抢占,资源不能被抢占,只有进程完成其任务后,才会释放资源

    4 循环等待,有一组进程,互相等待资源

  资源分配图:

    死锁问题可用称为系统资源分配图的有向图进行更为精确地描述。

    根据资源分配图的定义,可以证明:如果图没有环,那么系统就没有进程死锁,如果图有环,那么可能存在死锁。

 

 

 

死锁处理方法:

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

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

  3 可忽视这个问题,认为死锁不可能在系统内发生。这种方法为绝大多数操作系统如unix所使用。

 

 

 

死锁预防

  互斥:

    对于非共享资源,必须要有互斥条件。

    共享资源不要求互斥访问,因此不会涉及死锁。

    通常不能通过否定互斥条件来预防死锁,有的资源本身是非共享的。

  占有并等待:

    为了确保占有并等待条件不会在系统内出现,必须保证:当一个进程申请一个资源时,它不能占有其他资源。

    有两种协议可以实现这种方案:

      1 每个进程在执行前申请并获得所有资源。

      2 允许进程在没有资源时才可申请资源  

    这两种协议的缺点:

      1 资源利用率可能比较低

      2 可能发生饥饿

  非抢占

    第三个必要条件是对已分配的资源不能抢占。为了确保这一条件不成立,可使用如下协议:

    如果一个进程占有资源并申请另一个不能立即分配的资源,那么其现已分配的资源都被抢占。

    当一个进程处于等待时,其部分资源可以被抢占。

    这个协议通常应用于其状态可以保存和恢复的资源,如CPU寄存器和内存空间。

  循环等待

    死锁的第四个也是最后一个条件是循环等待。

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

    当一个进程申请资源类型为最高序列时,它必须先释放所有资源。

 

 

死锁避免:

  死锁预防算法中通过限制资源申请的方法来预防死锁,确保四个必要条件之一不会发生,但是设备使用率低和系统吞吐率低。

  避免死锁的另一种方法要求有关如何申请资源的附加信息。根据每个进程可能申请的每种资源类型实例的最大需求的事先信息,可以构造一个算法以确保系统决不会进入死锁状态。这种算法定义了死锁避免方法。

  安全状态:

    如果系统能按某个顺序为每个进程分配资源(不超过其最大值)并能避免死锁,那么系统状态就是安全的

 

 

死锁检测:

  如果一个系统既不采用死锁预算算法也不采用死锁避免算法,那么可能出现死锁。

  系统应提供:

    1 一个用来检查系统状态从而确定是否出现了死锁的算法

    2 一个用来从死锁状态中恢复的算法

  检测恢复方案会有额外开销,包括维护所需信息和执行检测算法的运行开销,而且也包括死锁恢复所引起的损失。

  每种资源类型只有单个实例:

    等待图:从图中检测环的算法需要n^2级别操作,其中n为图中的节点数

  每种资源类型的多个实例:

    类似银行家算法

  应用检测算法:

    应何时调用检测算法,答案取决于两个因素:

      1 死锁可能发生的频率是多少

      2 当死锁发生时,有多少进程会受影响

 

 

死锁恢复:

  进程终止:

    1 终止所有死锁进程:代价大

    2 一次只终止一个进程直到取消死锁循环为止:开销大

  资源抢占:

    1 选择一个牺牲品:

    2 回滚

    3 饥饿

    原文作者:褐色键盘
    原文地址: https://www.cnblogs.com/liulanle/p/3348470.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞