【操作系統】銀行家算法


1.算法原理

     安全性檢查算法:用於檢查系統進行資源分配后是否安全。在系統試分 配資源后,算法從現有進程列表尋找出一個可執行的進程進行執行,執行完 成后回收進程占用資源;進而尋找下一個可執行進程。當進程需求量大於系 統可分配量時,進程無法執行。當所有進程均可執行,則產生一個安全執行 序列,系統資源分配成功。若進程無法全部執行,即無法找到一條安全序列, 所以此次分配失敗。

    銀行家算法:用來避免死鎖。實現銀行家算法,每個新進程在進入系統時它必須申明在運行過程中,可能需要的每種資源類型的最大單元數目,其數目不應超過系統所擁有的資源總量。當某一進程請求時,系統會自動判斷請求量是否小於進程最大所需,同時判斷請求量是否小於當前系統資源剩余量。若兩項均滿足,則系統試分配資源並執行安全性檢查算法。

 

2.實現思路

    利用3個二維數組分別表示最大需求量矩陣,allocation矩陣,need矩陣,利用一維數組存放available初始值。

 3個核心函數:輸入函數,安全檢查函數,請求資源檢驗函數。

 

3.代碼實現

  1 #include<iostream>
  2 using namespace std;
  3 #define p 4
  4 #define r 3
  5 
  6 //a-max,b-allocation,c-need,d-available
  7 void input(int a[p][r],int b[p][r],int c[p][r],int d[r])
  8 {
  9     int i,j;
 10     cout<<"請輸入allocation矩陣數據:";
 11     for(i=0;i<p;i++){
 12         cout<<"進程p"<<i+1<<":  " ;
 13         for(j=0;j<r;j++)
 14             cin>>b[i][j];
 15     }
 16         
 17             
 18     cout<<"請輸入 need 矩陣數據:";
 19     for(i=0;i<p;i++){
 20         cout<<"進程p"<<i+1<<":  " ;
 21         for(j=0;j<r;j++)
 22             cin>>c[i][j];
 23     }
 24         
 25 //    cout<<"max data:";
 26     for(i=0;i<p;i++)
 27         for(j=0;j<r;j++){
 28             a[i][j]=b[i][j]+c[i][j];
 29         }
 30         
 31     cout<<"請輸入初始available:";
 32     for(j=0;j<r;j++)
 33         cin>>d[j];
 34 }
 35  //比較函數,用於比較兩個數組中所有數字大於第二個矩陣中所有數字,正確return 1 
 36 int equ(int m[r],int n[r])
 37 {
 38     int i,flag=0;
 39     for(i=0;i<r;i++)
 40         if(m[i]<n[i])
 41         {
 42             flag=1;
 43             break;
 44         }
 45     if(flag==1)    
 46     return 0;
 47     else 
 48     return  1;
 49 }
 50   
 51 //申請資源,第n個進程申請資源
 52 void banktest(int b[p][r],int c[p][r],int d[r],int req[r],int n)
 53 {
 54     int i,j;
 55     int t[r];
 56     n=n-1;
 57     for(i=0;i<r;i++)
 58         t[i]=c[n][i];//需要的資源 
 59     if(equ(d,req)&&equ(t,req))//對available,request進行比較
 60     {
 61         for(j=0;j<r;j++)
 62         {
 63             b[n][j]=b[n][j]+req[j];
 64             c[n][j]=c[n][j]-req[j];
 65             d[j]=d[j]-req[j];
 66         }
 67         if(stest(b,c,d))
 68             cout<<"允許第"<<n+1<<"個進程申請資源!";
 69         else 
 70         {
 71             cout<<"不允許第"<<n+1<<"個進程申請資源!";
 72  
 73         cout<<"恢復以前狀態!";
 74         for(j=0;j<r;j++)
 75         {
 76             b[n][j]=b[n][j]-req[j];
 77             c[n][j]=c[n][j]+req[j];
 78             d[j]=d[j]+req[j];
 79         }
 80         }
 81     }
 82  
 83     else cout<<"申請資源量出錯!";
 84 }
 85  
 86 //系統的安全性檢測 
 87 int stest(int b[p][r],int c[p][r],int d[r])
 88 {
 89     int i,j,k,l,flag=0,flag1=0;
 90     int t[r],finish[p],dd[r];
 91     for(i=0;i<p;i++)
 92         finish[i]=0;//finish為1即表示available滿足某一進程並讓其實現
 93  
 94     for(i=0;i<r;i++)
 95         dd[i]=d[i];
 96     cout<<"輸出分配序列:";
 97     cout<<"      allocation        need       avilable"<<endl;
 98     for(k=0;k<p;k++)            //全搜索    {
 99         for(i=0;i<p;i++)
100         {
101             if(finish[i]==1)
102             continue;
103             else
104             {
105                 for(j=0;j<r;j++)
106                     t[j]=c[i][j];
107                 if(equ(dd,t))
108                 {
109                     finish[i]=1;
110                     cout<<endl;
111                     //cout<<i+1<<'\t';輸出矩陣 
112                     cout<<"p"<<i+1<<":";
113                     for (j =0;j<r; j++)
114                     {
115                         printf("  %2d ", b[i][j]);
116                     }
117                     cout<<"     ";
118                     for (j = 0; j < r; j++)
119                     {
120                         //Allocation[i][j]=Pause[j]-Need[i][j];
121                         printf("  %2d ", c[i][j]);
122                     }
123                     cout<<"     ";
124                     for (j = 0; j <r; j++)
125                     {
126                         printf("  %2d ", dd[j] +b[i][j]);
127                     }
128                     
129                     flag=1;
130                     for(l=0;l<r;l++)
131                         dd[l]=dd[l]+b[i][l];
132                     break;
133                 }
134             }
135             if(flag==1)break;
136         }    
137     }
138     cout<<endl;
139     for(l=0;l<p;l++)
140     {
141         //cout<<finish[l]<<endl;
142         if(finish[l]==0)
143         flag1=1;
144     }
145     
146        cout<<"當前系統還剩余的資源:"<<endl; 
147        for(i=0;i<r;i++){
148            cout<<dd[i]<<"   "<<endl;
149        }
150        
151         //cout<<flag1<<endl;
152     if(flag1==0)
153     Return 1;    //flag1為記錄finish是否有0存在的標記,當flag1=0時,安全
154     else 
155     Return 0;
156 }
157 
158 int main()
159 {
160     cout<<"當前資源種類數為:" <<r<<endl;
161     cout<<"當前進程總數為: " <<p<<endl;
162     int j,n;                   //n-第n個資源申請
163     int max[p][r],allocation[p][r],need[p][r];
164     int available[r],request[r];
165     input(max,allocation,need,available);
166  
167     if(stest(allocation,need,available)==1)
168         cout<<"初始狀態安全!";
169     else 
170     cout<<"初始狀態不安全!";
171  
172     cout<<" input request data:";
173     for(j=0;j<r;j++)cin>>request[j];
174  
175     cout<<"第n個進程申請資源——n的值";
176     cin>>n;
177  
178     banktest(allocation,need,available,request,n);
179     return 0;
180 }

4.實例測試

 


免責聲明!

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



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