1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 操作系统银行家算法(课程设计报告)JAVA实现

操作系统银行家算法(课程设计报告)JAVA实现

时间:2019-05-29 09:00:05

相关推荐

操作系统银行家算法(课程设计报告)JAVA实现

操作系统银行家算法(课程设计报告)JAVA实现

1月4号更新,这篇文章是当时学习操作系统的时候第一次用java写代码,代码质量经不住推敲,待这两天期末考试结束定会重写。

文件目录

bankerclass.java

import java.util.Scanner;public class bankerclass{int x = 5,y = 3;int Maxneed[][] = new int [x][y];int Allocation [][] = new int [x][y];int Need[][] = new int [x][y];int Available [] = new int[y];int Work [] = new int [y];Scanner in = new Scanner(System.in);int cnt2 = 0;public void init(){System.out.println("请先输入您有几个进程,每个进程最多需要几种资源:");// x = in.nextInt();y = in.nextInt(); //扩展进程模式System.out.printf("您有%d个进程,每个进程最多需要%d种资源.\n",x,y);System.out.println("请输入您所拥有的最大资源:");for (int i = 0; i < y; i++){Available[i] = in.nextInt();}System.out.println("请输入每个进程所需要的最大资源:");for (int i = 0; i < x; i++){System.out.println("请输入P" + i +"进程所需资源");for (int j = 0; j < y; j++)Maxneed[i][j] = in.nextInt();}System.out.println("请输入目前已经分配好的资源:");for (int i = 0; i < x; i++){System.out.println("请输入P"+i+"进程已经分配好的资源");for (int j = 0; j < y; j++)Allocation[i][j] = in.nextInt();}// System.out.println("更新每个进程的需求资源");for (int i = 0; i < x; i++)for (int j = 0; j < y; j++){Need[i][j] = Maxneed[i][j] - Allocation[i][j];Available[j] -= Allocation[i][j];}for (int i = 0; i < y; i++)Work[i] = Available[i];System.out.print("您目前还剩余的资源为:");for(int i = 0; i < y; i++)System.out.printf("%d ",Work[i]);System.out.println();Print();Security();for(int i = 0; i < y; i++)//将Work初始化Work[i] = Available[i];}public void Request(){for(int i = 0; i < y; i++)//将Work初始化Work[i] = Available[i];System.out.println("目前需求为:");for (int i = 0; i < x; i++){for (int j = 0; j < y; j++){System.out.print(Need[i][j]+ " ");}System.out.println();}System.out.print("Work 资源为:");for (int i = 0; i < y; i++){System.out.print(Work[i]+" ");}System.out.println("\n请输入需要分配资源的进程号:");int num;num = in.nextInt();// System.out.println("请输入请求资源的数量:");int request[] = new int[y];/* for (int i = 0; i < y; i++){request[i] = in.nextInt();}*/while(true){int cnt = 0;System.out.println("请输入请求资源的数量:");for (int i = 0; i < y; i++){request[i] = in.nextInt();}for (int i = 0; i < y; i++){if (request[i] > Need[num][i]){System.out.printf("您超出了进程P%d自身最大需求量,请重新输入\n",num);cnt = 0;break;}elsecnt++;}if (cnt == y) break; //三次输入都满足符合条件}for (int i = 0; i < y; i++)if(request[i] > Work[i]){System.out.printf("进程P%d的需求暂时无法满足,请重新输入\n",num);break;}while(true){int cnt = 0;System.out.println("请再次输入请求资源的数量:");for (int i = 0; i < y; i++){request[i] = in.nextInt();}for (int i = 0; i < y; i++){if(request[i] > Work[i]){System.out.printf("进程P%d的需求仍然无法满足,请重新输入\n",num);cnt = 0;break;}elsecnt++;}if(cnt==y) break;}for(int i = 0; i < y; i++){Available[i] -= request[i];Allocation[num][i] += request[i];Need[num][i] -= request[i];}Print();boolean flag = Security();if(flag == false)//如果没有找到安全序列,就将将原先分配的资源返还{for (int i = 0; i < y; i++){Available[i]+= request[i];Allocation[num][i] -= request[i];Need[num][i] += request[i];}}}public boolean Security() {for(int i = 0; i < y; i++)//将Work初始化Work[i] = Available[i];boolean flag = false;//进行安全性检测System.out.printf("T%d时刻安全性检测中......\n",cnt2++);int cnt = 0;boolean Finish[] = new boolean[x];for (int i = 0; i < x; i++)Finish[i] = false;int Order[] = new int[x]; //确定序列int k = 0;int count = 0;System.out.println("进程 Work Need Allocation Work+Allo Finish");while (cnt < x) {for (int i = 0; i < x; i++) {//找到一个可分配的进程boolean flag1 = true;for (int j = 0; j < y; j++) {if (Need[i][j] > Work[j])flag1 = false;}if (flag1 && Finish[i] == false) {System.out.print("P" + i + "|");for (int j = 0; j < y; j++) {System.out.print(Work[j] + " ");}System.out.print("|");for (int j = 0; j < y; j++) {System.out.print(Need[i][j] + " ");}System.out.print("|");for (int j = 0; j < y; j++) {System.out.print(Allocation[i][j] + " ");Work[j] += Allocation[i][j];}System.out.print("|");cnt++;Order[k++] = i;Finish[i] = true;for (int j = 0; j < y; j++) {System.out.print(Work[j] + " ");}System.out.print("|");System.out.print("TRUE\n");}}count++; //每经历一次循环,增加一次标记,当cnt和circle同步增加时每一步才是安全的if (cnt == x) {System.out.print("恭喜你找到了安全序列:");for (int j = 0; j < x; j++) {if (j != 0) System.out.print("->");System.out.print("P" + Order[j]);}System.out.println();flag = true;break;} else if (cnt < count) //cnt比count小就代表至少有一次for循环没有找到安全序列{System.out.printf("未找到安全序列,继续分配将导致系统进入不安全状态,进而可能引发死锁,不予分配资源!!\n");flag = false;break;}}return flag;}public void Print(){System.out.println("目前已经分配好的资源情况是:");System.out.println("进程 MaxNeedNeed Allocation Avaliable");for (int i = 0; i < x; i++){System.out.print("P"+i+"|");for (int j = 0; j < y; j++){System.out.print(Maxneed[i][j]+" ");}System.out.print("|");for (int j = 0; j < y; j++){System.out.print(Need[i][j]+" ");}System.out.print("|");for (int j = 0; j < y; j++){System.out.print(Allocation[i][j]+" ");}System.out.print("|");if(i==0){for (int j = 0; j < y; j++){System.out.print(Available[j]+" ");}}System.out.println();}}}

main.java

import java.util.Scanner;public class main {public static void main(String args[]){bankerclass B = new bankerclass();Scanner in = new Scanner(System.in);B.init();while (true){B.Request();System.out.println("您还需要继续执行吗Y/N");char ch;ch = in.next().charAt(0);if(ch == 'N' || ch == 'n')break;}}}

输入数据

按照以上数据读入即可。

运行结果

实际内容更加丰富,感兴趣的话可以私聊。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。