【操作系统】银行家算法
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.实例测试