zoukankan      html  css  js  c++  java
  • 死锁

    死锁描述

        用有向图来描述这种死锁。在这种有向图中,圆圈表示进程,方形表示资源。资源节点到进程节点的边表示该资源被进程占用,由进程指向资源节点的有向边表示进程申请该资源。

         如果形成了如图C所以的环表示死锁了。



    死锁条件

    1、互斥条件

          互斥资源的访问,才有可能导致死锁。

    2、请求和保持条件

        进程已经拥有了某些资源,但是还需申请其他资源才能完成。

    3、不可抢占条件

        进程拥有的资源不可被抢占。

    4、循环等待条件

        进程申请的资源被另一个进程占有,而另一个进程申请的资源被当前进程占有。如上图所示的环形。

    死锁忽略

         鸵鸟算法,遇到死锁当没发生一样。


    死锁恢复

        系统检测到死锁时,需要从死锁中恢复。一下两种处理方法。

    1、挂起/恢复进程

          先将死锁环路中某进程挂起,等死锁环中某进程执行完后,某进程资源被回收后,再将被挂起的进程恢复执行。缺点:想象下这么个情景,如果某个进程写磁带写到一半,被你挂起了,多痛苦。所以选择挂起谁很纠结。

    2、杀死进程

          杀死环中一个进程或多个进程。杀死一个进程检测系统状态,如果还是没达到要求,继续杀死第二个进程。但是检测系统状态本身开销就很大,所以此方法也不妙。

    死锁检测

        根据画的这种资源分配图,得到检测方法。

    1、单种资源类型下的死锁检测

          直接上例子:假设一个系统由A到G七个进程,R到W六中资源,资源关系如下:

    (1)A拥有R资源,需要S资源

    (2)B需要T资源

    (3)C需要S资源

    (4)D拥有U资源,需要S、T资源

    (5)E拥有T资源,需要V资源

    (6)F拥有W资源,需要S资源

    (7)G拥有V资源,需要U资源

    则根据上面的资源关系,可以画出下面的资源图:


          直观的看出:上图形成了一个环形,表示会造成死锁。这种方案编程根据有向图的深度优先搜索,判断有向图中是否形成了环形。

    2、多种资源类型下的死锁检测

          还是直接上例子:


          C矩阵的三行分别对应三个进程P0、P1和P2已经分配的资源,右边表示还需要的资源。由于系统剩下的资源A=[2 1 0 0],所以P2进程是可以完成的,于是分配给P2进程;P2完成后系统剩下的资源A=[4 2 2 0],再分配给P1;最后给P0,系统所有进程都能完成,则没有死锁。(跟银行家算法检测安全状态是一样的


    死锁预防

        破坏死锁的四个条件:

    1、破坏互斥条件

         不切实际,有些资源就必须实现互斥访问。例如打印机。

    2、破坏请求和保持条件

          要求进程一开始声明就期望获得它的全部资源,操作系统会检测进程所需的资源是否全部可用,只有可用的时候进程才执行。如果不是进程放弃目前拥有的资源。

          缺点:进程放弃资源后,也许会有些长的进程长时间占有资源,这样导致系统反应慢。想象一下打印机用到一半被别人抢过去的感觉。

    3、破坏不可抢占条件

          允许当前进程拥有的资源可以被其他进程抢过去。还是上面一个缺点,用到一半的磁带机被别人抢过去了。

    4、破坏循环等待条件

          强制每个进程只能拥有一种资源。进程要想申请资源,必须释放手上目前拥有的资源。实现该方案就是该资源标号,规定进程必须按照资源编号从前往后申请。(进程一开始就获取全部资源的情况不存在


           这样进程如果需要磁带机和打印机,那进程必须先申请磁带机,再申请打印机。这样大家的申请顺序就不会乱。


    死锁避免

          预防死锁正如上面所说,存在着某些困难。操作系统采用一种折中方案,以避免死锁发生,也就是牛逼的银行家算法。直接上例子比较好:


         上面有P0、P1、P2、P3四个进程,左边的表格表示已经分配的资源,右边的表格是仍需要的资源。操作系统系统包含的资源5个磁带机、4个打印机和3个绘图仪。将矩阵A中纵向相加表示已经分配给进程总的资源为4个磁带,3个打印机和2个绘图仪,剩下1个磁带机、1个打印机和1个绘图仪。

           如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。反之如果不存在安全状态,则有死锁发生。

         银行家算法:用当前剩下的资源(1、1、1)去扫描右边的表格,如果这几个进程中,没有一个进程能够利用剩下的资源完成,则系统处于不安全状态。表示有可能发生死锁。如果有几个进程能够利用剩下的资源完成,则将资源分配给某个进程,待进程运行完,把资源还给系统,再继续寻找。如果寻找过程中出现了不安全状态,就不能按照这种方案分配。

          实现:定义系统拥有资源数组Avaliable,进程已经分配资源矩阵Alloc,进程需要资源矩阵Max,Max-Alloc得到需求矩阵Need。每轮都要扫描需求矩阵。

         上面的例子:

        (1)系统剩下的资源1、1、1,看矩阵B,就这点资源可以保证P0、P1、P3中任何一个进程完成,所以认为系统暂时处于安全状态;。

        (2)选择P1,将剩下资源分配给P1,这样P1完成后还回资源,则剩下的资源变为:120+001=121;

        (3)P0、P3都可以完成,选P3,P3完成后,剩下的资源变为:212+010=222;

        (4)P0、P2都满足,选择P1,则P0完成后,剩下的资源变为:300+122=422;

        (5)选择P2,最终所有进程能够完成运行。

    注:在每轮扫描过程中,如果没有进程可以完成运行,则表示出现了不安全状态,则不能分配内存。

  • 相关阅读:
    Microsoft To-Do无法同步问题 ke xue上网导致
    学习希尔排序
    查找docker无法启动的原因
    挂载只读分区为可读写
    批量重建索引脚本
    frp nginx 80 端口共用
    vue部署nginx 404
    阿里云服务器,数据库热备、暖备、冷备实战-镜像篇(域环境下配置)
    码农老婆的网店
    Wcf调用方式
  • 原文地址:https://www.cnblogs.com/pangblog/p/3292160.html
Copyright © 2011-2022 走看看