操作系统-银行家算法(Java实现)
一、银行家算法思想
银行家算法是最著名的死锁避免算法,其思想是:将操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。进程运行之前先声明对各种资源的最大需求量,当进程在执行继续申请资源是,先测试该进程已占用的资源数与本次申请的资源数之和是否超过该进程声明的最大需求量。若超过则拒绝分配资源,若未超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前申请量分配资源,否则也要推迟分配。
二、银行家算法所需数据结构
m为资源种类,n为进程的数量。
1、可利用资源向量 Available:
int Available[m]
2、最大需求矩阵 Max :
int Max[n][m]
3、分配矩阵 Allocation :
int Allocation[n][m]
4、需求矩阵 Need:
int need[i][j]=Max[i][j]- Allocation[i][j]
5、申请资源向量 Request:
int Request [m]
三、银行家算法描述(bank()函数)
四、安全性算法描述(safe()函数)
五、程序设计结构
程序共有以下五个部分:
(1)、初始化init():输入进程数量、资源种类、资源可利用量、进程资源已分配量、进程最大需求量;
(2)、当前安全性检查safe():用于判断当前状态安全;
(3)、银行家算法bank():进行银行家算法模拟实现的模块;
(4)、显示当前状态showdata():显示当前资源分配详细情况;
(5)、主程序main():逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行。
六、代码实现
import java.util.Scanner;
public class Banker {String NAME[]=new String[100];//资源的名称int Max[][]= new int[100][100];//最大需求矩阵int Allocation[][]=new int[100][100];//系统已分配矩阵int Need[][]=new int[100][100];//还需要资源矩阵int Available[]=new int[100];//可用资源矩阵int Request[]=new int[100];//请求资源向量int Work[]=new int[100];//存放系统可提供资源量int Finish[]=new int[100]; //标记系统是否有足够的资源分配给各个进程 int Security[]=new int[100];//存放安全序列int M=100;//进程的最大数int N=100;//资源的最大数Scanner sc=new Scanner(System.in);//初始化各类数据public void init(){int i,j,m,n;int number;boolean flag;String name;//输入资源名称int temp[]=new int[100];//统计已分配资源//输入系统资源数目及各资源初试个数System.out.print("系统可用资源种类为:");n=sc.nextInt();N=n;for(i=0;i<n;i++){sc.nextLine();//清空缓冲区否则可能导致无法输入报出异常System.out.println("资源"+i+"名称为:");name=sc.nextLine();NAME[i]=name;System.out.println("资源"+name+"初始化个数为:");number=sc.nextInt();Available[i]=number;}//输入进程数及各进程的最大需求矩阵 System.out.println("请输入进程的数量:");m=sc.nextInt();M=m;System.out.println("请输入各进程的最大需求矩阵的值[Max]:");do {flag=false;for(i=0;i<M;i++){for(j=0;j<N;j++){Max[i][j]=sc.nextInt();if(Max[i][j]>Available[j]){flag=true;}}}if(flag){System.out.println("资源最大需求量大于系统中资源最大量,请重新输入!");}}while(flag);//输入各进程已经分配的资源量,并求得还需要的资源量 do {flag=false;System.out.println("请输入各进程已经分配的资源量[Allocation]:");for(i=0;i<M;i++){for(j=0;j<N;j++){Allocation[i][j]=sc.nextInt();if(Allocation[i][j]>Max[i][j]){flag=true;}Need[i][j]=Max[i][j]-Allocation[i][j];temp[j]+=Allocation[i][j];//统计已经分配给进程的资源数目}}if(flag){System.out.println("分配的资源大于最大量,请重新输入!");}}while(flag);//求得系统中可利用的资源量 for(j=0;j<N;j++){Available[j]=Available[j]-temp[j];}}//显示资源分配矩阵public void showdata(){int i,j;System.out.println("*************************************************************");System.out.println("系统目前可用的资源[Available]:");for(i=0;i<N;i++){System.out.print(NAME[i]+" ");}System.out.println();for(j=0;j<N;j++){System.out.print(Available[j]+" ");}System.out.println();System.out.println("系统当前的资源分配情况如下:");System.out.println(" Max Allocation Need");System.out.print("进程名 ");//输出与进程名同行的资源名,Max、Allocation、Need下分别对应for(j=0;j<3;j++){for(i=0;i<N;i++){System.out.print(NAME[i]+" ");}System.out.print(" ");}System.out.println();//输出每个进程的Max、Allocation、Need for(i=0;i<M;i++){System.out.print("P"+i+" ");for(j=0;j<N;j++){System.out.print(Max[i][j]+" ");}System.out.print(" ");for(j=0;j<N;j++){System.out.print(Allocation[i][j]+" ");}System.out.print(" ");for(j=0;j<N;j++){System.out.print(Need[i][j]+" ");}System.out.println();}}//尝试分配资源public int test(int i){for(int j=0;j<N;j++){Available[j]=Available[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j];Need[i][j]=Need[i][j]-Request[j];}return 1;}//试探性分配资源作废,与test操作相反public int retest(int i){for(int j=0;j<N;j++){Available[j]=Available[j]+Request[j];Allocation[i][j]=Allocation[i][j]-Request[j];Need[i][j]=Need[i][j]+Request[j];}return 1;}//安全性算法public int safe(){int i,j,k=0,m,apply;for(j=0;j<N;j++)//初始化work {Work[j]=Available[j];}for(i=0;i<M;i++)//初始化Finish{Finish[i]=0;}for(i=0;i<M;i++){apply=0;for(j=0;j<N;j++){if(Finish[i]==0&&Need[i][j]<=Work[j]){apply++;//直到每类资源尚需数都小于系统可利用资源数才可分配if(apply==N){for(m=0;m<N;m++){Work[m]=Work[m]+Allocation[i][m];//更改当前可分配资源}Finish[i]=1;Security[k++]=i;i=-1; //保证每次查询均从第一个进程开始}}}}for(i=0;i<M;i++){if(Finish[i]==0){System.out.println("系统不安全!");return 0;}}System.out.println("系统安全!");System.out.println("存在一个安全序列:");for(i=0;i<M;i++){System.out.print("P"+Security[i]);if(i<M-1){System.out.print("->");}}System.out.println();return 1;}//银行家算法处理申请资源public void bank(){boolean flag=true;int i,j;System.out.println("请输入请求分配资源的进程号(0~"+(M-1)+"):");i=sc.nextInt();System.out.println("请输入进程P"+i+"要申请的资源个数:");for(j=0;j<N;j++){System.out.print(NAME[j]+":");Request[j]=sc.nextInt();//输入需要申请的资源}//判断银行家算法的前两条件是否成立for(j=0;j<N;j++){if(Request[j]>Need[i][j]){System.out.print("进程P"+i+"申请的资源大于系统现在可利用的资源");System.out.println("分配不合理,不予分配!");flag=false;break;}else{if(Request[j]>Available[j]){System.out.print("进程"+i+"申请的资源大于系统现在可利用的资源");System.out.println();System.out.println("系统尚无足够资源,不予分配!");flag=false;break;}}}if(flag){test(i);showdata();if(safe()!=1){retest(i);showdata();}}}//主函数public static void main(String[] args) {Banker b=new Banker();Scanner sc=new Scanner(System.in);String choice;System.out.println("*************************************************************");System.out.println(" 银行家算法的实现 ");System.out.println("*************************************************************");b.init();b.showdata();if(b.safe()!=1){System.exit(0);}do{System.out.println("*************************************************************");System.out.println(" R(r):请求分配 ");System.out.println(" E(e):退出 ");System.out.println("*************************************************************");System.out.print("请选择:");choice=sc.nextLine();switch(choice){case "r":case "R":b.bank();break;case "e":case "E":System.exit(0);//System.exit(0)是正常退出程序,System.exit(1)表示非正常退出程序。default:System.out.println("请正确选择!");break;}}while(choice!=""); }
}
七、程序运行展示
申请资源成功:
申请资源失败:
操作系统-银行家算法(Java实现)相关推荐
- 银行家算法JAVA版本
银行家算法 摘要:银行家算法来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还.在操作系统中研究资源分配策略时也有类似 ...
- 操作系统——银行家算法(银行家和房地产开发商的爱恨情仇)
操作系统--银行家算法 什么是银行家算法 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避 ...
- 【南邮操作系统实验】银行家算法Java版
这个是南邮通达的操作系统实验,实验内容相对比较简单,就是实现一下银行家算法. 我没有参考任何源码,纯属 made by myself,如果差错,欢迎指出. import java.util.*; /* ...
- 计算机操作系统 --- 共享资源分配与银行家算法java篇
共享资源分配与银行家算法 课程设计的要求 主菜单 添加进程 1.手动输入进程 2.直接文件读入 算法实现 安全性算法 银行家算法 随机分配算法 实现效果 彩蛋 Applicaion.java Proc ...
- 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)
java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法. 直接上代码:①界面展示方法: public void ShowFrame() ...
- 操作系统银行家算法计算机四级,【NCRE四级网络工程师】操作系统多选题
友情提示:此篇文章大约需要阅读 7分钟54秒,不足之处请多指教,感谢您的阅读. 保存在进程控制块中的是 进程标识符 进程当前状态 代码段指针 PCB的内容可以分为调度信息和现场信息两大部分.调度信息供 ...
- 操作系统 | 银行家算法及代码实现
参考博客 [操作系统]死锁避免之银行家算法_少侠露飞的学习笔记-CSDN博客 [操作系统]避免死锁--银行家算法_明昕ztoy的博客-CSDN博客_银行家算法避免死锁 实现思路 当一个进程申请使用资源 ...
- [操作系统] 银行家算法
文章目录 安全序列 通俗理解模型 初始借完钱 分析借钱的安全序列 银行家算法 核心思想 资源表示 安全性算法分析系统状态 银行家算法实现 思路分析 银行家算法步骤 安全性算法步骤 升华思维 安全序列 ...
- c语言银行家算法模拟程序,C语言实现 操作系统 银行家算法
/**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin, 可能存在多类资 ...
最新文章
- solaris11学习必用工具及ISO
- Linux下使用Opencv打开笔记本摄像头
- 利用深度学习的点云语义分割(一)
- 园林系统优秀党员推荐材料_昆山合纵生态科技有限公司——园林废弃物循环利用“昆山合纵模式”的探索和实践者...
- 软考-信息系统项目管理师-量化的项目管理
- SpikeSource公司的CEO-Kim Polese访谈
- tourist取模模板
- Python基础-List找重复数
- Python 数据全部显示,去掉中间省略号(pandas、...)
- 列表解析(list comprehension) 与三目运算符
- python表达式3and5_表达式 3 and 5 的值为____________。(5.0分)_学小易找答案
- java蓝牙串口调试,HC-05蓝牙串口调试
- 前端实习4个月的心得(uniapp)
- Layui实现多条件查询
- myql GROU_CONCAT 与FIND_IN_SET查询结果为空问题解决
- matlab画六面体,MATLAB绘制平行六面体
- Java 编写程序打印以下图形_怎么用java编写如下程序在屏幕上输出如下图形 * *** *** * 循环语句做(if语句)...
- 手把手教你在阿里云服务器上安装Java环境(图文教程)
- c语言10B,C++程序语言10B_C.ppt
- html中头向下的箭头怎么打出来,向下的箭头怎么打,最简单实用的电脑知识
热门文章
- C语言程序设计第四版 苏小红 习题答案 3.5
- Spark流计算(一)
- java byte 释放内存_java java.nio.ByteBuffer.allocateDirect 导致内存泄露
- 一图看懂React diff
- YUV,BGR,RGB图像在内存中占用大小计算
- html--图片的链接使用
- 生菜出现叶焦病?全是连作惹的祸!!!
- 【说明书】二甲基亚砜 DMSO (细胞级)
- Android Loader LoaderManager 总结(一)
- 24.重学webpack——loader的原理及常用loader的实现(高频面试题)