【操作系统】银行家算法

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.实例测试

 

posted @ 2019-01-10 16:30  一头  阅读(5381)  评论(0编辑  收藏  举报