1. 系統安全狀態
系統在進行資源分配之前,應先計算此次資源分配的安全性,即判斷系統當前擁有的資源數,是否滿足該進程目前所需要的資源數,若滿足則將該進程運行完畢,並將在此之前分配給該進程的資源釋放,然后繼續推進,該推進順序為安全序列;若無法滿足,則稱當前系統處於不安全狀態。
2. 銀行家算法中的數據結構
- 可用資源向量Available。其中含有 m 個元素(m 即為資源種類),Available[ j ] 的值表示,當前資源 j 所擁有的個數。
- 最大需求矩陣Max。這是一個n * m的矩陣(n 即為進程個數),Max[ i ][ j ] 的值表示,進程 i 對於 資源 j 的最大需求值。
- 分配矩陣Allocation。這是一個n * m的矩陣,Allocation[ i ][ j ] 的值表示,當前系統對於進程 i 已分配資源 j 的個數。
- 需求矩陣Need。這是一個n * m的矩陣,Need[ i ][ j ] 的值表示,當前進程 i 對於 資源 j 的需求個數。
上述三個矩陣滿足如下關系:
Need[ i ][ j ] = Max[ i ][ j ] - Allocation[ i ][ j ]
3. 銀行家算法
設 Requesti 是進程 Pi 的請求向量,如果 Requesti[ j ] = K, 表示進程 Pi 需要K個 Rj 類的資源。當 Pi 發出資源請求后,系統按下述步驟進行檢查:
- 如果 Requesti[ j ] <= Need[ i ][ j ] ,便轉向步驟(2);否則認為出錯,因為它所需要的資源超過所宣布的最大值。
- 如果 Requesti[ j ] <= Available[ j ],便轉向步驟(3);否則,表示尚無足夠資源,Pi需等待。
- 系統嘗試着把資源分配給進程Pi,並修改下面數據結構中的數值:
Available[ j ] -= Requesti[ j ];
Allocation[ i ][ j ] += Requesti[ j ];
Need[ i ][ j ] -= Requesti[ j ];
4. 系統執行安全性算法,檢查此次資源分配后是否安全。若安全才正式將資源分配給進程 Pi,以完成本次分配;否則將此次請求視為作廢,恢復原來分配狀態,讓 Pi 等待。
4. 代碼實現
4.1 銀行家算法之例
4.2 安全性檢驗函數
1 //安全性檢驗及輸出安全序列 2 vector<int> CountSafeOrder( vector<int> Ava, vector<vector<int> > Max, 3 vector<vector<int> > All, vector<vector<int> > Need){ 4 int pro_number = Max.size(); 5 int res_number = Ava.size(); 6 vector<bool> Finish(pro_number,false); 7 vector<int> SafeOrder; 8 vector<int> temp; 9 vector<vector<int> >work(pro_number,temp); 10 11 queue<int> q; 12 int count = 0; //用來記錄循環是否超過次數; 13 for(int i = 0; i < pro_number; i ++) 14 q.push(i); 15 while( !q.empty() ){ 16 int num = q.front(); 17 bool arg = true; 18 q.pop(); count ++; 19 //判斷當前可用資源是否大於需求 20 for(int j = 0; j < res_number ; j ++){ 21 if(Ava[j] < Need[num][j] ){ 22 q.push(num); arg = false; break; 23 } 24 } 25 //將當前可用資源增加,並記錄工作向量 26 if( arg ){ 27 for(int j = 0; j < res_number && arg; j ++){ 28 work[num].push_back(Ava[j]); 29 Ava[j] += All[num][j]; 30 } 31 SafeOrder.push_back(num); 32 count = 0; 33 } 34 //如果循環次數超時,則跳出循環 35 if( count > q.size()) 36 break; 37 } 38 return SafeOrder; 39 }
4.3 資源請求函數
1 void RequestRes(vector<int> &Ava, vector<vector<int> > &All, 2 vector<vector<int> > &Need, vector<vector<int> >Request, int num){ 3 int res_number = Ava.size(); 4 bool arg = true; 5 // 判斷請求的資源是否滿足條件 6 for(int i = 0; i < res_number; i ++ ){ 7 if(Request[num][i] > Need[num][i] || Request[num][i] > Ava[i] ){ 8 cout << "需求過大,無法滿足請等待!\n"; arg = false; break; 9 } 10 } 11 // 若滿足條件,則修改向量值 12 if( arg ){ 13 for(int i = 0; i < res_number; i ++){ 14 Ava[i] -= Request[num][i]; 15 Need[num][i] -= Request[num][i]; 16 All[num][i] += Request[num][i]; 17 } 18 } 19 }