操作系統 銀行家算法(C++實現)


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 類的資源。當 P發出資源請求后,系統按下述步驟進行檢查:

  1. 如果 Requesti[ j ]  <= Need[ i ][ j ] ,便轉向步驟(2);否則認為出錯,因為它所需要的資源超過所宣布的最大值。
  2. 如果 Requesti[ j ]  <= Available[ j ],便轉向步驟(3);否則,表示尚無足夠資源,Pi需等待。
  3. 系統嘗試着把資源分配給進程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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM