操作系统 银行家算法
来源:互联网 发布:手机简谱软件 编辑:程序博客网 时间:2024/05/21 09:30
【问题阐述】
数据结构
- 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当前已分得Rj类资源的 - 4)数目为K。 4)需求矩阵Need。
这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
Need[i,j]=Max[i,j]-Allocation[i,j]
安全性检查算法
- (1)设置两个工作向量Work=AVAILABLE;FINISH
- (2)从进程集合中找到一个满足下述条件的进程, FINISH==false; NEED<=Work; 如找到,执行(3);否则,执行(4)
- (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 Work=Work+ALLOCATION; Finish=true; GOTO
2 - (4)如所有的进程Finish= true,则表示安全;否则系统不安全。
【详细代码】
package banker;import java.util.Scanner;public class BankerMath { static int available[]=new int[3]; //资源数 static int max[][]=new int[5][3]; //最大需求 static int allocation[][]=new int[5][3]; //分配 static int need[][]=new int[5][3]; //需求 static int request[]=new int[3]; //存放请求 Scanner scanner=new Scanner(System.in); int thread; //线程号 //初始化 public void getResources(){ System.out.println("请输入A,B,C三类资源的数目:"); //输入A,B,C三类资源数量 for(int i=0;i<3;i++){ available[i]=scanner.nextInt(); } //输入进程对三类资源的最大需求 for(int i=0;i<5;i++){ System.out.println("请输入进程"+i+"对A,B,C三类资源的最大需求"); for(int j=0;j<3;j++){ max[i][j]=scanner.nextInt(); } } //输入进程分配的三类资源数 for(int i=0;i<5;i++){ System.out.println("请输入进程"+i+"已分配的A,B,C三类资源数"); for(int j=0;j<3;j++){ allocation[i][j]=scanner.nextInt(); } } //计算进程还需要的三类资源数 for(int i=0;i<5;i++){ for(int j=0;j<3;j++){ need[i][j]=max[i][j]-allocation[i][j]; } } //重新计算available for(int i=0;i<3;i++){ for(int j=0;j<5;j++){ available[i]-=allocation[j][i]; } } } //用户输入要申请资源的线程和申请的资源,并进行判断 public void getThread(){ System.out.println("请输入申请资源的线程"); int thread=scanner.nextInt(); //线程 if(thread<0||thread>4){ System.out.println("该线程不存在,请重新输入"); getThread(); }else{ this.thread=thread; System.out.println("请输入申请的资源(三种,若某种资源不申请则填0)"); for(int i=0;i<3;i++){ request[i]=scanner.nextInt(); } if(request[0]>need[thread][0]||request[1]>need[thread][1]||request[2]>need[thread][2]){ System.out.println(thread+"线程申请的资源超出其需要的资源,请重新输入"); getThread(); }else{ if(request[0]> available[0]||request[1]> available[1]||request[2]> available[2]){ System.out.println(thread+"线程申请的资源大于系统资源,请重新输入"); getThread(); } } changeResources(thread); if(check(thread)){ getThread(); }else{ recoverResources(thread); getThread(); } } } //thread线程请求响应后,试探性分配资源 public void changeResources(int thread){ for(int i=0;i<3;i++){ //重新调整系统资源数 available[i]-=request[i]; //计算各个线程拥有资源 allocation[thread][i]+=request[i]; //重新计算需求 need[thread][i]-=request[i]; } } //安全性检查为通过,分配失败时调用,恢复系统原状 public void recoverResources(int thread){ for(int i=0;i<3;i++){ //重新调整系统资源数 available[i]+=request[i]; //计算各个线程拥有资源 allocation[thread][i]-=request[i]; //重新计算需求 need[thread][i]+=request[i]; } } //对线程thread安全性检查 public boolean check(int thread){ boolean finish[]=new boolean[5]; int work[]=new int[3]; int queue[]=new int[5]; //由于存放安全队列 int k=0;//安全队列下标 int j; //要判断的线程 int i; //是否分配的标志 for(i=0;i<5;i++) finish[i]=false; j=thread; for(i=0;i<3;i++){ work[i]=available[i]; } while(j<5){ for( i=0;i<3;i++){ if(finish[j]){ j++; break; }else if(need[j][i]>work[i]){ //System.out.println(need[j][i]+"*"+i+work[i]); j++; break; }else if(i==2){ for(int m=0;m<3;m++){ work[m]+=allocation[j][m]; } finish[j]=true; queue[k]=j; k++; j=0; //从最小线程再开始判断 } } } //判断是否都属于安全状态 for(int p=0;p<5;p++){ if(finish[p]=false){ System.out.println("系统不安全,资源申请失败"); return false; } } System.out.println("资源申请成功,安全队列为:"); for(int q=0;q<5;q++){ System.out.println(queue[q]); } return true; } //打印need和available,需要时调用 public void showResources(){ System.out.println("need"); for(int i=0;i<5;i++){ for(int j=0;j<3;j++){ System.out.print(need[i][j]+" "); } } System.out.println("available"); for(int j=0;j<3;j++){ System.out.print(available[j]+" "); } } public static void main(String[] args) { BankerMath bk=new BankerMath(); bk.getResources(); bk.getThread(); } }
阅读全文
0 0
- 操作系统之银行家算法
- 操作系统--银行家算法设计
- 操作系统之银行家算法
- 操作系统课程设计银行家算法
- 操作系统之银行家算法
- 操作系统 之 银行家算法
- 操作系统课程设计银行家算法
- 操作系统之银行家算法
- 操作系统::银行家算法
- 操作系统银行家算法
- 操作系统之银行家算法
- 操作系统 银行家算法
- 操作系统算法 之 银行家算法
- 操作系统之--银行家算法1
- 操作系统之--银行家算法2
- JavaScript 编写银行家算法【操作系统】
- 操作系统实验之银行家算法
- 【操作系统】银行家算法避免死锁
- Android开发 设置tablayout下划线长度和内容保持一致
- 这个数据的分析就差一个find_if
- spring aop的五种通知类型
- 入警, 铁警生涯的第一次转变——灵宝西所第一警务区: 陈静
- EC2实例在不同账户间共享
- 操作系统 银行家算法
- C语言三子棋实现
- 关于本机“网络连接”名词区分
- 代码的开发标准和规范<一>
- Mac下my eclipse
- 监管禁新开贷款公司,审批被拒后想买拍照竟需6千万
- openCV学习笔记(二)---openCV系列基本操作
- LeetCode--Excel Sheet Column Number(Excel表格的列名转数字)Python
- 指针