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

Posted sky-line

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用银行家算法避免死锁的介绍与举例相关的知识,希望对你有一定的参考价值。

一、数据结构

  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

 

以上是关于利用银行家算法避免死锁的介绍与举例的主要内容,如果未能解决你的问题,请参考以下文章

银行家算法

死锁避免——银行家算法(简述)

死锁避免——银行家算法(简述)

基于C语言的银行家算法

11.避免死锁之银行家算法

:进程管理 -- 死锁的概念死锁饥饿死循环的区别死锁的处理策略(预防 / 避免死锁 / 死锁的检测和解除)SPOOLing技术银行家算法