银行家算法
来源:互联网 发布:正交矩阵和实对称矩阵 编辑:程序博客网 时间:2024/06/10 07:36
1、实验目的
利用java语言编码实现银行家算法,理解死锁概念及系统安全性检测算法的作用,加深对资源申请、避免死锁等概念的理解,最后实现避免死锁的具体实施方法
2、实验内容
实现银行家算法,满足以下要求:
- 设定系统中进程的数量、各类资源的总量、进程对各类资源的初始占有情况、对各类资源最大申请量
- 对当前系统进程进行安全性检测
- 当某个进程对各类资源进行申请时,判断其申请是否能得到满足
3、算法设计
核心代码如下所示。banker(int k)函数在银行家算法中用于判断进程对资源的申请是否能够得到满足,safe( )函数用于检测当前进程对资源的占有情况是否处于安全状态,判断结果以boolean类型值返回。Recover( )函数用于当safe( )算法返回为false时将系统恢复到试分配前的状态
public void banker(int k) { // k表示申请资源的第k个进程 k = k - 1; int i; System.out.println("\n进程 P" + (k + 1) + "尝试申请资源……"); System.out.println("\n进程 P" + (k + 1) + "申请的各类资源量:"); for (int j = 0; j < resourceCount; j++) { System.out.println("申请资源" + (j + 1) + "的数量:" + Request[j]); } for (i = 0; i < resourceCount; i++) { if (Request[i] > Need[k][i]) { System.out.println("\n进程 P" + (k + 1) + "对资源的申请量大于声明的最大值,申请予以否决"); return; } if (Request[i] > Available[i]) { System.out.println("\n进程 P" + (k + 1) + "对资源" + (i + 1) + "的申请量大于可用的数量,申请予以否决"); return; } } for (int j = 0; j < resourceCount; j++) { Available[j] = Available[j] - Request[j]; Allocation[k][j] = Allocation[k][j] + Request[j]; Need[k][j] = Need[k][j] - Request[j]; } if (!safe()) { System.out.println("\n试分配后系统处于不安全状态,不予分配资源!"); recover(k); } else { System.out.println("\n资源申请成功!"); System.out.println("安全序列为:"); for (int j = 0; j < threadCount; j++) { if (j == threadCount - 1) System.out.print("进程 P" + thread[j]); else System.out.print("进程 P" + thread[j] + "——>"); } System.out.println(); } } // 状态安全性判断 public boolean safe() { for (int i = 0; i < resourceCount; i++) { Work[i] = Available[i]; } for (int i = 0; i < threadCount; i++) { Finish[i] = false; } int n = 0; for (int i = 0; i < threadCount; i++) { if (!Finish[i]) { int count = 0; for (int j = 0; j < resourceCount; j++) { if (Need[i][j] <= Work[j]) { count++; } } if (count == resourceCount) { for (int j = 0; j < resourceCount; j++) { Work[j] = Work[j] + Allocation[i][j]; } thread[n++] = i + 1; Finish[i] = true; i = -1; } } } for (int i = 0; i < threadCount; i++) { if (!Finish[i]) { return false; } } return true; } // 恢复各种信息 public void recover(int k) { for (int i = 0; i < Request.length; i++) { Available[i] = Available[i] + Request[i]; Allocation[k][i] = Allocation[k][i] - Request[i]; Need[k][i] = Need[k][i] + Request[i]; } }
4、运行与测试
测试结果如下图所示。
程序开始运行时,首先对当前状态进行安全性检测,由图可以看出系统在初始状态时处于安全状态。当进程P2尝试申请资源,对资源进行试分配,运用safe算法检测出分配后系统仍处于安全状态,资源申请成功,输出安全序列。
将尝试申请资源的进程改为进程P1,申请的资源量不变,由下图可以看出,试分配后系统处于不安全状态,不予分配资源
因此,通过银行家算法实现了对当前系统下的安全性检测,并避免了死锁状况的发生,维护了系统安全。
代码下载地址:银行家算法
0 0
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- 银行家算法
- Unity Android 阴影不显示、阴影显示不正确 解决备忘
- C++10
- 1548-Cannot load from mysql.proc. The table is probably corrupted
- HDU 1181 DFS
- poj 1287 Networking(最小生成树)
- 银行家算法
- JAVA中的Object类
- Minecraft题解
- 个人笔记 html 06 获取验证码之后倒计时功能
- 内联函数详解(未完成)
- 浏览器cannot read property 'msie' of undefined的解决方法
- [LeetCode]159. Longest Substring with At Most Two Distinct Characters
- 图解正向代理、反向代理、透明代理
- 蓝桥杯 历届试题 蚂蚁感冒 (模拟)