• 利用银行家算法避免死锁的介绍与举例


    一、数据结构

      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

     

  • 相关阅读:
    反向传播错漏百出小推导
    使用git遇到的
    Cost Function in Logistic Regression and Neural Network
    鼠标左键长按功能的实现
    同类控件的统一操作(以TCHECKBOX为例)
    HLP帮助文件源文件RTF文件的编写
    FORMAT 的用法
    DELPHI6中DSGNINTF.DCU找不到时的解决方法
    使窗体处于可“移动”,可改变“大小”状态中
    系统菜单的控制,使菜单项灰显及恢复功能
  • 原文地址:https://www.cnblogs.com/RB26DETT/p/9937860.html
Copyright © 2020-2023  润新知