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.實例測試