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

一、数据结构

  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

原文地址:https://www.cnblogs.com/sky-line/p/9937860.html

时间: 2024-08-26 22:34:36

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

银行家算法避免死锁

系统安全状态的定义 1.安全状态 在避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性.若此次分配不会导致系统进入不安全状态,则将资源分配给进程:否则,令进程等待. 虽然并非所有的不安全状态都必然会转为死锁状态,但当系统进入不安全状态后,便有可能进而进入死锁状态:反之,只要系统处于安全状态,系统便可避免进入死锁状态. 因此,避免死锁的实质在于:系统在进行资源分配时,如何使系统不进入不安全状态. 利用银行家算法避免死锁 1.银行家算法中的数据结构 (1

操作系统之银行家算法避免死锁

银行家算法避免死锁 要求: 完成程序数据结构的设计,数据的录入. 完成进程需求矩阵的输出,包括最大需求矩阵,尚需资源矩阵,可获得资源显示. 完成某进程请求资源试分配. 完成安全性检查. 1.         试探分配 当进程pi提出资源申请时,系统执行下列步骤: (1)若Request[i][j]≤Need[i][j],转(2): 否则错误返回 (2)若Request[i][j]≤Available[j], 转(3):否则进程等待 (3)试探着把资源分配给进程Pi,则有: Available[j

c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)

#include<iostream> #include<cstdio> #include<vector> #include<ctime> #include<cstring> #include<unistd.h> #include<cstdlib> #define RESTYPE 100 //资源的种类数 #define NTHREAD 50 //线程的数目 using namespace std; pthread_mute

银行家算法学习笔记

     上周操作系统的实验,就是模拟实现银行家算法,首先我们还是应该对银行家算法熟悉一下. 银行家算法是最具代表性的避免死锁的算法.因为该算法原本是为银行系统设计的,以确保银行在发放现金贷款时,不会发生不满足所有客户需求的情况.在OS中也可它来实现避免死锁. 算法概述: 为实现银行家算法,每一个进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量,当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程.若有,再进一步计算在

【操作系统】银行家算法

[操作系统]银行家算法 2017-05-10 若愚 上次介绍了死锁的相关概念,以及各种解决办法.今天讲的是死锁避免里面的银行家算法.请多多指教~ 一.算法的背景 算法由迪杰斯特拉在1965年提出. 在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还.银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要.在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程. 二.算

银行家算法实例(转)

在网上找了一篇不可多的的讲银行家算法的例题的博文,mark下来.作者写的还是不错,简单易懂,比单纯讲含义要实用的多. 转自: 木轩琰的博客 最近开始备考计算机四级,基本没有遇到什么问题,感觉计算机四级就是考理解型记忆力,银行家算法的题算是在计算机四级里少有的计算题. 例1.设系统中有三种类型的资源(A,B,C)和五个进程(P1,P2,P3,P4,P5),A资源的数量是17,B资源的数量是6,C资源的数量为19.在T0时刻系统的状态如下表:   最大资源需求量 已分配资源量   A,B,C A,B

避免死锁的银行家算法

多线程操作系统在进程调度(资源分配)的时候可能会发生死锁. 引起死锁的直接原因是竞争不可抢占的互斥资源.这种资源有可能是临界资源,例如打印机:也有可能是可消耗性资源,例如信号量. 引起死锁的间接原因进程推进顺序不当.即系统单独运行进程P1或者P2都没有问题,但是调度两个进程同时进行时,由于调度顺序导致两个进程竞争资源产生死锁. ----------------------------- 产生死锁的四个必要条件: 1.互斥条件.进程已经分配到的资源具有互斥性,不能同时被其他进程共享. 2.请求和保

《操作系统、预防进程死锁的银行家算法》

预防进程死锁的银行家算法 原文:https://blog.csdn.net/houchaoqun_xmu/article/details/55540792 一.概念介绍和案例解析 银行家算法中的数据结构 可利用资源向量Available:   这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.如果Available[j]=K,则表示系统中现有Rj类资源K个. 最大需求矩阵Max:   

[OS] 死锁相关知识点以及银行家算法详解

因此我们先来介绍一下死锁: 死锁特征 当出现死锁时,进程永远不能完成,并且系统资源被阻碍使用,阻止了其他作业开始执行.在讨论处理死锁问题的各种方法之前,先深入讨论一下死锁的特征. ·必要条件 (1)互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程使用.如果另一进程申请该资源,那么申请进程必须等到该资源被释放为止. (2)占有并等待:一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程所占有. (3)非抢占:资源不能被抢占,即资源只能在进程完成任务后自动释放. (4)循环等待