如何使用java实现简单银行家算法
创始人
2024-12-24 18:01:39
0次

具体内容如下

题目:

初始时,Allocate[i,j]=0,表示初始时没有进程得到任何资源。假定进程对资源的请求序列为:

Request(1)[M]=(1,0,0);Request(2)[M]=(2,1,0);Request(2)[M]=(2,0,1);Request(3)[M]=(2,1,1);Request(4)[M]=(0,0,2);Request(2)[M]=(1,0,1);Request(1)[M]=(1,0,1);

请用 Banker 算法判断每一次资源请求是否接受,如果接受请求,请给出请求接受后的资源分配状态,即 Allocate 矩阵、Need 矩阵和 Available 向量。

大致思路:

(1):判断该进程资源请求是否小于Need需求矩阵,小于则进第二步(2):判断该进程资源请求向量是否小于剩余资源向量Available,小于则进入第三步(3):备份下资源状态矩阵,假设接收该需求,求出相应的资源状态矩阵,需求矩阵,剩余资源向量(4):判断接收请求后的状态是否是安全状态A:初始该状态下的进程标识都为false,work为资源剩余向量B;循环该状态下的进程,如果满足标识为false,并且该进程的需求向量小于work 则进入C,当循环完毕都没有满足条件的进入D。C:work+Allocate(对应进程的状态),将该进程对应的进程状态标识为true,将B的循环数变为0,从头开始循环(进入B)D:循环遍历该状态下的进程标识,如果都为true则判断状态安全,否则判断状态不安全(5):如果状态是安全的输入该状态下的各个矩阵与向量,如果不安全,则利用刚刚备份的资源状态矩阵,回滚。

源代码

package Banker;public class Banker { public static int N = 4;// 线程个数 public static int M = 3;// 资源个数 public static int[] Resource = { 9, 3, 6 };// 资源向量; public static int[][] Cliam = { { 3, 2, 2 }, { 6, 1, 3 }, { 3, 1, 4 }, { 4, 2, 2 } }; public static int[][] Allocate = new int[N][M]; public static int[][] Need = { { 3, 2, 2 }, { 6, 1, 3 }, { 3, 1, 4 }, { 4, 2, 2 } }; public static int[] Available = { 9, 3, 6 }; public int[][] state = new int[N][M];   public static void main(String args[]) { Banker ban = new Banker(); //请求序列数组,包含第几个请求,那条进程,请求资源向量。 int[][][] re={{{1},{1,0,0}},{{2},{2,1,0}},{{2},{2,0,1}},{{3},{2,1,1}},{{4},{0,0,2}},{{2},{1,0,1}},{{1},{1,0,1}}}; for(int j=0;jwork[k]) {   return false;  }  }  return true;//返回状态 }  // 判断该进程请求向量是否小于请求矩阵中对应的向量请求资源 public boolean judgementrequest(int[] Request, int i) {  for (int j = 0; j < M; j++) {  if (Request[j] > Need[i][j]) {  return false;  } }  return true; } // 判断该进程请求向量是否小于剩于资源向量 public boolean judgementAvali(int[] Request) { for (int j = 0; j < M; j++) {  if (Request[j] >Available[j]) {  return false;  } } return true; } // 假设分配后修改资源分配矩阵 public int[][] addrequest(int[][] Allocate, int[] Request, int i) { for (int h = 0; h < M; h++) {  Allocate[i][h] = Allocate[i][h] + Request[h]; } return Allocate; } // 假设分配后修改资源的需求矩阵 public int[][] reducerequest(int[][] Need, int[][] state) { for (int j = 0; j < N; j++) {  for (int h = 0; h < M; h++) {  Need[j][h] = Cliam[j][h] - state[j][h];  } } return Need; } // 假设分配后修改资源剩余矩阵 public int[] AvaileReduceRequest(int[] Available, int[][] Allocate) { Available = yiweicopy(Available, Resource); for (int j = 0; j < N; j++) {  for (int h = 0; h < M; h++) {  Available[h] = Available[h] - Allocate[j][h];  } } return Available; }  // 二维数组拷贝 public int[][] erWeiCopy(int[][] x1, int[][] y1) { for (int j = 0; j < N; j++) {  for (int h = 0; h < M; h++) {  x1[j][h] = y1[j][h];  } } return x1; } // 一维数组拷贝 public int[] yiweicopy(int[] x1, int[] y1) { for (int j = 0; j < M; j++) {  x1[j] = y1[j]; } return x1; } // 打印向量 public static void PrintXianglaing(String id, int[] x) { System.out.println(id); for (int j = 0; j < x.length; j++) {  System.out.print(x[j] + " "); } System.out.println(""); } // 打印矩阵 public static void printJuzhen(String id, int[][] y) { System.out.println(id); for (int j = 0; j < N; j++) {  for (int h = 0; h < M; h++) {  System.out.print(y[j][h] + " ");  }  System.out.println(); } }}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...