| 算法的實現 一、初始化 由用戶輸入數據,分別對可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。 二、銀行家算法 在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統性能。在該方法中把系統的狀態分為安全狀態和不安全狀態,只要能使系統始終都處於安全狀態,便可以避免發生死鎖。 銀行家算法的基本思想是分配資源之前,判斷系統是否是安全的;若是,才分配。它是最具有代表性的避免死鎖的算法。 設進程cusneed提出請求REQUEST [i],則銀行家算法按如下規則進行判斷。 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],則轉(2);否則,出錯。 (2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],則轉(3);否則,出錯。 (3)系統試探分配資源,修改相關數據: AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; (4)系統執行安全性檢查,如安全,則分配成立;否則試探險性分配作廢,系統恢復原狀,進程等待。 三、安全性檢查算法 (1)設置兩個工作向量Work=AVAILABLE;FINISH (2)從進程集合中找到一個滿足下述條件的進程, FINISH==false; NEED<=Work; 如找到,執行(3);否則,執行(4) (3)設進程獲得資源,可順利執行,直至完成,從而釋放資源。 Work+=ALLOCATION; Finish=true; GOTO 2 (4)如所有的進程Finish= true,則表示安全;否則系統不安全。 各算法流程圖 初始化算法流程圖:  銀行家算法流程圖: 安全性算法流程圖: 源程序清單 #include <iostream> using namespace std; #define MAXPROCESS 50 /*最大進程數*/ #define MAXRESOURCE 100 /*最大資源數*/ int AVAILABLE[MAXRESOURCE]; /*可用資源數組*/ int MAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩陣*/ int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩陣*/ int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩陣*/ int REQUEST[MAXPROCESS][MAXRESOURCE]; /*進程需要資源數*/ bool FINISH[MAXPROCESS]; /*系統是否有足夠的資源分配*/ int p[MAXPROCESS]; /*記錄序列*/ int m,n; /*m個進程,n個資源*/ void Init(); bool Safe(); void Bank(); int main() { Init(); Safe(); Bank(); } void Init() /*初始化算法*/ { int i,j; cout<<"請輸入進程的數目:"; cin>>m; cout<<"請輸入資源的種類:"; cin>>n; cout<<"請輸入每個進程最多所需的各資源數,按照"<<m<<"x"<<n<<"矩陣輸入"<<endl; for(i=0;i<m;i++) for(j=0;j<n;j++) cin>>MAX[i][j]; cout<<"請輸入每個進程已分配的各資源數,也按照"<<m<<"x"<<n<<"矩陣輸入"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) { cin>>ALLOCATION[i][j]; NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; if(NEED[i][j]<0) { cout<<"您輸入的第"<<i+1<<"個進程所擁有的第"<<j+1<<"個資源數錯誤,請重新輸入:"<<endl; j--; continue; } } } cout<<"請輸入各個資源現有的數目:"<<endl; for(i=0;i<n;i++) { cin>>AVAILABLE[i]; } } void Bank() /*銀行家算法*/ { int i,cusneed; char again; while(1) { cout<<"請輸入要申請資源的進程號(注:第1個進程號為0,依次類推)"<<endl; cin>>cusneed; cout<<"請輸入進程所請求的各資源的數量"<<endl; for(i=0;i<n;i++) { cin>>REQUEST[cusneed][i]; } for(i=0;i<n;i++) { if(REQUEST[cusneed][i]>NEED[cusneed][i]) { cout<<"您輸入的請求數超過進程的需求量!請重新輸入!"<<endl; continue; } if(REQUEST[cusneed][i]>AVAILABLE[i]) { cout<<"您輸入的請求數超過系統有的資源數!請重新輸入!"<<endl; continue; } } for(i=0;i<n;i++) { AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; } if(Safe()) { cout<<"同意分配請求!"<<endl; } else { cout<<"您的請求被拒絕!"<<endl; for(i=0;i<n;i++) { AVAILABLE[i]+=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]-=REQUEST[cusneed][i]; NEED[cusneed][i]+=REQUEST[cusneed][i]; } } for(i=0;i<m;i++) { FINISH[i]=false; } cout<<"您還想再次請求分配嗎?是請按y/Y,否請按其它鍵"<<endl; cin>>again; if(again=='y'||again=='Y') { continue; } break; } } bool Safe() /*安全性算法*/ { int i,j,k,l=0; int Work[MAXRESOURCE]; /*工作數組*/ for(i=0;i<n;i++) Work[i]=AVAILABLE[i]; for(i=0;i<m;i++) { FINISH[i]=false; } for(i=0;i<m;i++) { if(FINISH[i]==true) { continue; } else { for(j=0;j<n;j++) { if(NEED[i][j]>Work[j]) { break; } } if(j==n) { FINISH[i]=true; for(k=0;k<n;k++) { Work[k]+=ALLOCATION[i][k]; } p[l++]=i; i=-1; } else { continue; } } if(l==m) { cout<<"系統是安全的"<<endl; cout<<"安全序列:"<<endl; for(i=0;i<l;i++) { cout<<p[i]; if(i!=l-1) { cout<<"-->"; } } cout<<""<<endl; return true; } } cout<<"系統是不安全的"<<endl; return false; } |