銀行家演算法實現
阿新 • • 發佈:2018-11-29
#include <iostream> using namespace std; #define n 4 //程序數 #define m 3//資源種類數 typedef struct{ int resource[m]; //不變 int avaliable[m]; int claim[n][m];//不變 int alloc[n][m]; int need[n][m]; int flag[n];//=1完成 }state; void init(state *S){ cout << "請輸入resource向量:" << endl; for(int i = 0; i < m; i++){ cin >> S->resource[i]; S->avaliable[i] = S->resource[i]; } cout << "請輸入claim向量:" << endl; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin >> S->claim[i][j]; cout << "請輸入alloc向量:" << endl; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++){ cin >> S->alloc[i][j]; S->avaliable[j] -= S->alloc[i][j]; } for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) S->need[i][j] = S->claim[i][j] - S->alloc[i][j]; for(int i = 0; i < n; i++) S->flag[i] = 0; } void print_state(state *S){ cout << endl; cout << "************************當前狀態*****************************" << endl; system("pause"); int count = 0; for(int i = 0; i < n; i++){ count = 0; if(S->flag[i] == 0){ for(int j = 0; j < m; j++) count += S->need[i][j]; if(count == 0){ cout << i << " progress completed!!!" << endl; S->flag[i] = 1; for(int j = 0; j < m; j++){ S->avaliable[j] += S->claim[i][j]; S->claim[i][j] = 0; S->alloc[i][j] = 0; } } } } cout << "claim vector:" << endl; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++) cout << S->claim[i][j] << " "; cout << endl; } cout << "alloc vector:" << endl; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++) cout << S->alloc[i][j] << " "; cout << endl; } cout << "need vector:" << endl; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++) cout << S->need[i][j] << " "; cout << endl; } cout << "avaliable vector:" << endl; for(int i = 0; i < m; i++) cout << S->avaliable[i] << " "; cout << endl; cout << "*************************************************************" << endl; } bool safe(int p, int request[], state *S){ int count = 0, finish[n] = {0}, complete = 0, no_find = 0, path[n], num = 0; state X; cout << "先給" << p << "程序分配要求的資源" << endl << endl; for(int i = 0; i < m; i++){//先分配 S->need[p][i] -= request[i]; S->alloc[p][i] += request[i]; S->avaliable[i] -= request[i]; } cout << "開始執行safe演算法...." << endl; X = *S; //先判斷p程序能否執行完 for(int j = 0; j < m; j++) count += S->need[p][j];//計算need向量 if(count == 0){//可以結束 // cout << "process" << p << "可以執行完畢" << endl; // cout << "釋放" << p << "程序資源..." << endl; for(int j = 0; j < m; j++){//release resource X.avaliable[j] += X.claim[p][j]; X.claim[p][j] = 0; X.alloc[p][j] = 0; } finish[p] = 1; complete++; // cout << p << "process complete !!!!!!!!!" << endl; path[num++] = p; } for(int k = 0; k < n; k++){//外層迴圈必須要 ,應該也能用while實現 for(int i = 0; i < n; i++){//從剩下沒結束的程序裡找可以執行的,只找1個,然後跳出內層迴圈 if(finish[i] == 0){//找到沒有結束的 count = 0; for(int j = 0; j < m; j++) if(X.avaliable[j] >= X.need[i][j]) count++; if(count == 3){//這個沒有結束的程序能利用現有資源執行完畢的 // cout << "找到" << i << "程序可以利用現有資源執行完畢" << endl; // cout << "給" << i << "程序分配資源...." << endl; for(int j = 0; j < m; j++){ X.avaliable[j] -= X.need[i][j];//分配資源 X.need[i][j] = 0;//更新need } // cout << "分配資源後的avaliable向量:" << endl; for(int x = 0; x < m; x++) cout << X.avaliable[x] << " "; cout << endl; // cout << i << "process complete !!!!!!!!!" << endl; finish[i] = 1;complete++;path[num++] = i; // cout << "釋放" << i << "程序資源..." << endl; for(int j = 0; j < m; j++){//release resource X.avaliable[j] += X.claim[i][j]; X.claim[i][j] = 0; X.alloc[i][j] = 0; } // cout << "釋放資源後的avaliable向量:" << endl; // for(int x = 0; x < m; x++) // cout << X.avaliable[x] << " "; // cout << endl; break;//必須跳出 } } } } if(complete == n){ cout << endl << "完畢!" << endl << "yes! 安全狀態,程序都能執行完畢" << endl; cout << "安全序列為:" << endl; for(int i = 0; i < n; i++) cout << path[i] << " "; cout << endl; return true; } else{ cout << endl << "完畢!" << endl << "oh! no! 判斷出不安全狀態,程序不能都執行完畢" << endl; return false; } } int resource_alloc(int p, int request[], state *S){ for(int i = 0; i < m; i++){ if(S->alloc[p][i] + request[i] > S->claim[p][i]){ cout << "request + alloc > claim!!! error!!!" << endl; return -1;//-1表示錯誤 } else if(request[i] > S->avaliable[i]){ cout << "request > avaliable!!! suspend process!!!" << endl; return -1;// } } if(safe(p, request, S)) return true;//表示狀態安全,資源分配成功 else return false; //資源分配失敗 } int main() { state S; int p = 0, temp; init(&S); print_state(&S); int request[m]; while(1){ cout << endl << "輸入請求程序:" << endl; cin >> p;// 0 1 2 if(p == -1) return 0; cout << "輸入請求資源向量:" << endl; for(int i = 0; i < m; i++) cin >> request[i]; temp = resource_alloc(p, request, &S); if(temp == true){ cout << "resource alloc success!!!" << endl; print_state(&S); } else if(temp == false){ cout << "resource alloc denied!!!" << endl << "Initialize state...." << endl; for(int i = 0; i < m; i++){ S.need[p][i] += request[i]; S.alloc[p][i] -= request[i]; S.avaliable[i] += request[i]; } print_state(&S);//print updated state } } return 0; }
注:此程式在DEV C++下執行成功。