中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用java實現銀行家算法的示例

發布時間:2021-04-14 14:01:33 來源:億速云 閱讀:225 作者:小新 欄目:編程語言

小編給大家分享一下使用java實現銀行家算法的示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

具體內容如下

題目:

使用java實現銀行家算法的示例

初始時,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):如果狀態是安全的輸入該狀態下的各個矩陣與向量,如果不安全,則利用剛剛備份的資源狀態矩陣,回滾。

運行截圖:

使用java實現銀行家算法的示例

使用java實現銀行家算法的示例

使用java實現銀行家算法的示例

使用java實現銀行家算法的示例

使用java實現銀行家算法的示例

使用java實現銀行家算法的示例

源代碼

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;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, 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();
 }
 }

}

以上是“使用java實現銀行家算法的示例”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

什邡市| 神农架林区| 勃利县| 静宁县| 米脂县| 江陵县| 莱芜市| 拜泉县| 察隅县| 清流县| 河津市| 益阳市| 普洱| 长沙市| 米泉市| 南平市| 岳池县| 繁峙县| 龙江县| 祁东县| 揭东县| 石泉县| 周至县| 同心县| 吉木萨尔县| 郯城县| 铁力市| SHOW| 尼勒克县| 巴彦县| 喜德县| 上杭县| 长子县| 古蔺县| 荆门市| 顺平县| 嵩明县| 凌源市| 黄平县| 平顺县| 雅安市|