QUESTION:银行家算法总结及实现?
目录
QUESTION:银行家算法总结及实现?
ANSWER:
一:银行家算法介绍
1.1什么是银行家算法
1.2背景
1.3数据结构
1.4算法分析
二:安全状态和不安全状态
2.1概念
2.2安全性检查
三:算法实现
3.1流程图
3.2代码实现
ANSWER:
一:银行家算法介绍
1.1什么是银行家算法
银行家算法(Banker's Algorithm)是一种关于操作系统分配资源时避免死锁(Deadlock)产生的安全性检测算法,它类似于银行中贷款的分配策略,由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。
1.2背景
在银行中,客户为了完成某个项目需要向银行进行贷款申请,客户已经拥有部分资金,客户给出最大资金需求,银行进行对客户的贷款申请检查,如果客户完全满足申请条件,并且客户申请的资金小于银行拥有的资金总额,则完成对客户的贷款。在这一过程中,银行就像操作系统,客户就像进程,资金就像要申请的资源。
1.3数据结构
1.资源种类数R:
是一个定量,R=n代表有n种资源。
2.进程数P:
也是一个定量,P=n代表有n个进程。
3.可利用的资源数向量Available:
是一个一维向量,Available[n]=k,代表n类资源可利用资源数为k。
4.最大需求矩阵Max:
是一个二维矩阵,Max[n][m]=k,代表第n个进程需要m类的最大数目为k。
5.已经分配的资源数目矩阵Allocation:
是一个二维矩阵,Allocation[n][m]=k,代表n个进程已经分配m类资源的数目为k。
6.需求矩阵Need:
是一个二维向量,Need[n][m]=k,代表进程n还需要m类资源的数目为k。
Need[n][m]=Max[n][m]-Allocation[n][m]。
1.4算法分析
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
Allocation Max AvailableABCD ABCD ABCDP1 0014 0656 1520 P2 1432 1942 P3 1354 1356P4 1000 1750
我们会看到一个资源分配表,要判断是否为安全状态,首先先找出它的Need,Need即Max(最多需要多少资源)减去Allocation(原本已经分配出去的资源),计算结果如下:
NEEDABCD0642 051000020750
FINISHfalsefalsefalsefalse
接下来找出Need比Available小的(千万不能把它当成4位数 他是4个不同的数):
NEED AvailableABCD ABCD0642 15200510<-00020750
P2的需求小于能用的,所以分配给他再回收:
NEED AvailableABCD ABCD0642 15200000 +14320002-------0750 2952
此时P2 FINISH的false要改成true(己完成):
FINISHfalsetruefalsefalse
接下来继续往下找,发现P3的需求为0002,小于能用的2952,所以资源配置给他再回收:
NEED AvailableABCD A B C D0642 2 9 5 20000 +1 3 5 40000----------0750 3 12 10 6
依此类推,做完P4→P1,当全部的FINISH都变成true时,就是安全状态。
二:安全状态和不安全状态
2.1概念
如果所有过程有可能完成执行(终止),则一个状态(如上述范例)被认为是安全的。由于系统无法知道什么时候一个过程将终止,或者之后它需要多少资源,系统假定所有进程将最终试图获取其声明的最大资源并在不久之后终止。在大多数情况下,这是一个合理的假设,因为系统不是特别关注每个进程运行了多久(至少不是从避免死锁的角度)。此外,如果一个进程终止前没有获取其它能获取的最多的资源,它只是让系统更容易处理。
基于这一假设,该算法通过尝试寻找允许每个进程获得的最大资源并结束(把资源返还给系统)的进程请求的一个理想集合,来决定一个状态是否是安全的。不存在这个集合的状态都是不安全的。
安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。
不存在一个安全序列。不安全状态不一定导致死锁。
2.2安全性检查
1)设置两个工作向量Work=AVAILABLE;FINISH
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<=Work;
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work=Work+ALLOCATION;
Finish=true;
GOTO 2
(4)如所有的进程Finish= true,则表示安全;否则系统不安全。
三:算法实现
3.1流程图
3.2代码实现