zoukankan      html  css  js  c++  java
  • 利用银行家算法避免死锁的介绍与举例

    一、数据结构

      1.多个进程: { P0,P1,P2,P4 } 代表1,2,3,4四个需要临界资源的进程

      2.几种资源:{ A, B ,C } 代表A,B,C三种临界资源

      3.Max:最大需求矩阵(进程完成执行需要的各资源总量)

        Allocation:分配矩阵(某个进程现在已经拥有的各资源量)

        Need:需求矩阵(某个进程仍需要的各资源量)

        Available:可利用资源向量 (系统保有的供分配的资源量)

        其中:Need = Max - Allocation ,很容易理解嘛,仍然需要的量等于总需求量减去拥有的量

    二、银行家算法

      设 Request是进程 P的请求向量,如果 Request[j] = K,表明进程需要K个Rj类型的资源。当Pi发出资源请求后,系统按照如下步骤进行检查:

      (1)如果 Requesti [j] <= Need[i,j],便转向步骤(2),否则认为出错,因为它所需要的资源数已经超过它所宣布的最大值。

      (2)如果 Request[j] <= Available[j],便转向步骤(3),否则表示尚无足够资源,Pi 需等待。

      (3)系统试探性的把资源分配给进程Pi ,并修改下面数据结构中的数值:

        Available[j] = Available[j] - Request[j];

        Allocation[i,j] = Allocation[i,j] + Request[j];

        Need[i,j] = Need[i,j] -  Request[j];

      (4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态(不会产生死锁),若安全,才正式将资源分配给进程Pi ,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi 等待。

    三、安全性算法

      (1)设置两个向量:

        1> 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行算法开始时,Work = Available;

            2>  Finish:它表示系统是否有足够的资源分配给进程,使之完成运行。开始时先做Finish[i] = false;当有足够资源分配给进程时,再令Finish[i] = true;

      (2)从进程集合中找到一个能满足下述条件的进程:

          ①Finish[i] = false;

          ②Need[i,j] <= Work[j];

        若找到,执行步骤(3),否则,执行步骤(4)

      (3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

        Work[j] = Work[j] + Allocation[i,j];

        Finish[i] = true;

        go to step 2;

      (4)如果所有进程的Finish[i] = true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

    四、银行家算法举例

    在银行家算法中,若出现下述分配情况,试问:

    Process Allocation Need Available
    P0 0, 0, 3, 2 0, 0, 1, 2 1, 6, 2, 2
    P1 1, 0, 0, 0 1, 7, 5, 0  
    P2 1, 3, 5, 4 2, 3, 5, 6  
    P3 0, 3, 3, 2 0, 6, 5, 2  
    P4 0, 0, 1, 4 0, 6, 5, 6  

     

     

     

     

     

     

      

     

    (1)该状态是否安全?

      答:安全,可以按照P0 - P3 - P4 - P1 - P2或者P0 - P3 - P1 - P4 - P2又或者P0 - P3 - P1 - P2 - P4的顺序,可以顺利执行完所有进程,并不会出现死锁的情况

    (首先看表发现 Available > Need 的进程只有P0,所以先执行P0,P0执行完成后回收资源(1,6,2,2)+ (0,0,3,2), 现在Available变成了(1,6, 5,4),再看发现只有P3可以执行,再执行P3,Available增加到了(1,9,8,6),可以执行P1和P4,两者都可以,这里选择先执行P4,后Available变成了(1,9,9,10),再执行P1,Available增到(2,9,9,10),最后执行P2)

    (2)若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?

      答:不能,按照银行家算法,首先检查Request[j] 是否小于等于 Need[i,j],在这里(1,2,2,2) < (2,3,5,6)满足条件,则再判断Request[j] 是否小于等于 Available[j],这里1,2,2,2) <(1,6,2,2)满足!然后便试探性的将资源分配给P2,此时P2的Allocation项变为(2,5,7,6),Need项变为(1,1,3,4),Available项变为(0,4,0,0),执行安全性算法,第一步就发现找不到一个进程使得Need[i,j] <= Work[j];所以安全性检查失败,这个Request请求会造成死锁,系统将处于不安全状态,故本次试探分配作废,恢复原来的资源分配状态,让进程P2等待

     

    笔记

    若有m个资源,n个进程,各进程至少需要1个资源(到底需要几个不确定),那么保证系统无死锁的条件是:ni=1Max < m+n-1

     

  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/RB26DETT/p/9937860.html
Copyright © 2011-2022 走看看