admin 管理员组

文章数量: 887021

银行家算法——Java版本

设计思路

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

本次课程设计通过用JAVA语言编写和调试实现银行家算法的程序,达到进一步掌握银行家算法,理解系统产生死锁的原因以及系统避免死锁的方法,增强理论联系实际的能力的目的。

运行环境

编译工具:Eclipse
jdk1.8

分析设计

可利用资源向量矩阵available[ ]

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

最大需求矩阵max[ ][ ]

这是一个n*m的矩阵,用以表示每一个进程对m类资源的最大需求。如果max[i,j]=K,则表示进程i需要R类资源的数目为K。

分配矩阵allocation[ ][ ]

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

需求矩阵need[ ][ ]

这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果need [i,j]=K,则表示进程i还需要R类资源K个,才能完成其任务。
上述矩阵存在下述关系:
need[i,j]= max[i,j]﹣ allocation[i,j]

算法的实现

初始化

1.创建available[]数组,用以存放系统中可用的资源数目;
2.创建max[][]数组,用以存放各个进程对各类资源的最大需求数目;
3.创建allocation[][]数组,用以存放各个进程已经分得的各类资源数目;
4.创建need[][]数组,用以存放各个进程还需要的各类资源数目;
5.创建 allocation1[][];need1[][];available1[],用以存放系统试分配 资源前系统资源分配情况;

银行家算法

设Requesti是进程Pi的请求向量,Requesti=K表示进程Pi需要K个j类资源。Pi发出资源请求后,按下列步骤进行检查:
1.如果requesti[j]≤need[i,j],转向步骤②;
否则报错,所需要的资源数已超过它所宣布的最大值;
2.如果requesti[j]≤available[j],转向步骤③;
否则报错,尚无足够资源Pi需等待;
3.尝试将资源分配给进程Pi,并修改下面数据结构中的数值:
available[j]:=available[j]-raquesti[j];
allocation[i,j]:=allocation[i,j]+raquesti[j];
need[i,j]:=need[i,j]-raquesti[j];
4. 执行安全性算法,检查此次资源分配后,系统是否出于安全状态。若安全,
才正式将资源分配给进程Pi,已完成本次分配;否则,将本次试探分配作废,
恢复原来的资源分配状态,让Pi等待。

安全性检查算法

1.设置两个向量:
一、工作向量work:表示系统可提供给进程继续运行所需的各类资源数目,执行安全性算法开始时work:=available;
二、finish标志:表示系统是否有足够的资源分配给进程,使之运行完成。初始化finish[i]:=false;有足够资源分配给进程时,令finish[i]:=true。
2.从进程集合中找到一个能满足下述条件的进程
finish[i]=false;Need[i,j]≤work[j];找到执行步骤③,否则执行步骤④
3.当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]:=work[i]+allocation[i,j];
Finish[i]:=true;
Go to step ②;
4.如果所有进程的finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

参考文献

1.汤子瀛,哲凤屏,汤小丹. 计算机操作系统 .西安电子科技大学出版社,2006
2.(美)威尔顿,麦可匹克. Java入门经典(第3版). 施宏斌译. 北京:清华大学出版社,2009
3.(美)Bruce Eckel. Java编程思想. 陈昊鹏译. 北京:机械工业出版社,2007

源码

https://github/cjw7177/Banker-s_Algorithm
github源码地址
在copy源码的同时,顺便来个star呗
测试文件和输出的文件都在里面



觉得不错的话,点个赞再走呗

本文标签: 银行家 算法 操作系统 计算机 java