银行家算法避免死锁

系统安全状态的定义

  1.安全状态

  在避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,令进程等待。

  虽然并非所有的不安全状态都必然会转为死锁状态,但当系统进入不安全状态后,便有可能进而进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态。

因此,避免死锁的实质在于:系统在进行资源分配时,如何使系统不进入不安全状态。

利用银行家算法避免死锁

  1.银行家算法中的数据结构

  (1) 可利用资源向量Available。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。

  (2) 最大需求矩阵Max。这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

  (3) 分配矩阵Allocation。这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得R j类资源的数目为K。

  (4) 需求矩阵Need。这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要R j类资源K个,方能完成其任务。

上述三个矩阵间存在下述关系:

Need[i, j]=Max[i, j]-Allocation[i, j]

2.银行家算法

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

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

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

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

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

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

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

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

3.安全性算法

  系统所执行的安全性算法可描述如下:

  (1) 设置两个向量:

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

  ② 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都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

4.银行家算法实例

  假定系统中有五个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况如图示。 (先忽略P1第二行的括号)

 (1) T0时刻的安全性:利用安全性算法对T0时刻的资源分配情况进行分析如下图可知,在T0时刻存在着一个安全序列{P1,P3,P4,P2,P0},故系统是安全的。

(2) ?P1请求资源:P1发出请求向量Request1(1,0,2),系统按银行家算法进行检查:

  ① Request1(1,0,2)≤Need1(1,2,2)

  ② Request1(1,0,2)≤Available1(3,3,2)

  ③ 系统先假定可为P1分配资源,并修改Available,Allocation1和Need1向量,形成的资源变化情况如下图圆括号所示

④ 再利用安全性算法检查此时系统是否安全。如图所示。

  (3) ?P4请求资源:P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:

  ① Request4(3,3,0)≤Need4(4,3,1);

  ② Request4(3,3,0)≥Available(2,3,0),让P4等待。(附:操作系统第三版这里写成了≤符号,需更正)

  (4) ?P0请求资源:P0发出请求向量Requst0(0,2,0),系统按银行家算法进行检查:

  ① Request0(0,2,0)≤Need0(7,4,3);

  ② Request0(0,2,0)≤Available(2,3,0);

  ③ 系统暂时先假定可为P0分配资源,并修改有关数据,如图所示。

  (5) 进行安全性检查:可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。

本文由Cout_Sev 搜集整理

自《计算机操作系统(第三版)》(西安电子科技大学出版社),

转载注明出处。

谢谢!

银行家算法避免死锁

时间: 2024-10-25 15:36:40

银行家算法避免死锁的相关文章

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

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

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

一.数据结构 1.多个进程: { P0,P1,P2,P4 } 代表1,2,3,4四个需要临界资源的进程 2.几种资源:{ A, B ,C } 代表A,B,C三种临界资源 3.Max:最大需求矩阵(进程完成执行需要的各资源总量)   Allocation:分配矩阵(某个进程现在已经拥有的各资源量)   Need:需求矩阵(某个进程仍需要的各资源量)   Available:可利用资源向量 (系统保有的供分配的资源量)   其中:Need = Max - Allocation ,很容易理解嘛,仍然需

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中也可它来实现避免死锁. 算法概述: 为实现银行家算法,每一个进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量,当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程.若有,再进一步计算在

银行家算法实例(转)

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

避免死锁的银行家算法C++程序实现

 本篇博文为追忆曾经写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家算法的计算机程序化,使其更实用.同时也加深了有关自愿申请.避免死锁等概念,体会避免死锁的实际实现过程与方法. 要求: 1.设定进程p对各类资源r合理的最大需求max及初值确定:2.设定系统提供资源初始状况allocation:3.设定每次某个进程对各类资源的申请表示need:4.编制C++程序,基于

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

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

死锁的避免——银行家算法

银行家把一定数量的资金供多个用户周转使用.当顾客对资金的最大申请量不超过银行家现金时,就可接纳一个新顾客:顾客可以分期借款:但借款总数不能超过最大申请量:银行家对顾客的借款可以推迟支付,但一定是顾客总能在有限的时间里得到借款:当顾客得到全部资金后,他一定能在有限时间里面归还所有资金. 采用银行家算法分配资源时候,测试进程对资源的最大需求量,如果系统现存的资源可以满足他的最大需求量时,就满足进程当前的申请,否则就推迟分配.这样做,能保证至少有一个进程可得到需要的全部资源而执行到结束,然后归还资源供

预防死锁之银行家算法

如果转载请注明出处:http://blog.csdn.net/gophers 银行家算法是一种可以用来预防死锁的检测算法,正像这种算法的名字一样,系统在分配资源情况就和银行家管理银行资金的情况是相似的.银行家要在贷款的时候协调各个客户之间的业务,最好的情况就是就是把当前的资金合理的分配出去,让余下来的资金依然足够应付近期的其他业务,而且能够确保在有新客户要贷款时之前贷出去的资金已经被收回.操作系统在协调各个进程之间的资源占用关系时也可以套用这种方法. 银行家算法主要由两个部分构成,一个是Safe