java实现简单银行家算法
本文实例为大家分享了java实现银行家算法的具体代码,供大家参考,具体内容如下 题目: 初始时,Allocate[i,j]=0,表示初始时没有进程得到任何资源。假定进程对资源的请求序 Request(1)[M]=(1,0); 请用 Banker 算法判断每一次资源请求是否接受,如果接受请求,请给出请求接受后的资 大致思路: (1):判断该进程资源请求是否小于Need需求矩阵,小于则进第二步 运行截图: 源代码 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,3 },{ 3,4 },{ 4,2 } }; public static int[][] Allocate = new int[N][M]; public static int[][] Need = { { 3,2 } }; public static int[] Available = { 9,6 }; public int[][] state = new int[N][M]; public static void main(String args[]) { Banker ban = new Banker(); //请求序列数组,包含第几个请求,那条进程,请求资源向量。 int[][][] re={{{1},{1,0}},{{2},{2,1}},{{3},{{4},{0,2}},{{1},1}}}; for(int j=0;j<re.length;j++){ /* * re[j][1] 请求向量 * re[j][0][0]-1 第几个进程 * j第几个请求 */ ban.judgeqingqiu(re[j][1],re[j][0][0]-1,j);//输入第几条进程,请求向向量,第几个请求,调用判断是否符合要求函数 } } //判断请求是否符合要求 public void judgeqingqiu(int[] Request,int i,int j) { /*judgementrequest(Request,i)调用函数,判断该进程请求向量是否小于请求矩阵中对应的向量请求资源 * judgementrequest(Request,i)调用函数,判断该进程请求向量是否小于剩于资源向量 */ if (judgementrequest(Request,i) && judgementrequest(Request,i)) { distribute(Request,i);//调用假设分配函数,并将分配状态copy出来 //judgementsafe(Allocate)判断是否是安全状态 if (judgementsafe(Allocate)) { System.out.println("############"); System.out.println("第"+(j+1)+"个请求"+"进程"+(i+1)+"请求资源被允许"); printJuzhen("Allocate",Allocate); printJuzhen("Need",Need); PrintXianglaing("Available",Available); } else { System.out.println("############"); System.out.println("第"+(j+1)+"个请求"+"进程"+(i+1)+"请求资源被拒绝"); erWeiCopy(Allocate,state); } } else { System.out.println("*****************"); System.out.println("第"+(j+1)+"个请求"+"进程"+(i+1)+"请求资源被拒绝"); } } // 假设符合,分配资源,记录下剩余资源 public void distribute(int[] Request,int i) { state = erWeiCopy(state,Allocate);//将资源分配矩阵保留下来,如果不正确方便回滚 Allocate = addrequest(Allocate,Request,i);//分配后的资源分配矩阵 Need = reducerequest(Need,Allocate);//分配后的资源需求矩阵 Available = AvaileReduceRequest(Available,Allocate);//分配后的资源剩余矩阵 } // 判断状态安全函数 public boolean judgementsafe(int[][] Allocate) { int[] work = new int[M];//相当于标记变量,标识进程是否符合,如果符合为true work = yiweicopy(work,Available);//将剩余资源响亮copy到work中 boolean safe = true;//安全状态,默认为true Boolean[] finish = { false,false,false };//相当于标记变量,标识进程是否符合,如果符合为true,初始值都为false //循环遍历该状态中的进程,判断进程的资源需求是否小于剩余资源数 for (int j = 0; j < N; j++) { //进程资源请求是否小于剩余资源work,并且该进程标识为false, if (judgementsafeWork(Need[j],work) && finish[j] == false) { finish[j] = true;//,将该进程标识为true,改变work for (int h = 0; h < M; h++) { work[h] = work[h] + Allocate[j][h]; } j = -1;//,将j=0,再次从头遍历查看进程 } } /* * 当没有进程满足资源请求是否小于剩余资源work,并且该进程标识为false时 * 遍历状态数组,看是否都为true */ for (int m = 0; m < N; m++) { if (finish[m] == false) { safe = false;//如果状态数组中有false那么将safe设置为false } } return safe; } // 判断状态是否安全时进程资源请求是否小于剩余资源work public boolean judgementsafeWork(int[] Request,int[] work) { for (int k = 0; k < M; k++) { // PrintXianglaing("",Request); if (Request[k] >work[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(); } } } 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |