银行家算法

操作系统上机实习课,简单地实现了一下银行家算法==具体的算法流程就不写了==

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 using namespace std;
  7 #define n 5//进程个数
  8 #define m 3//资源种类
  9 string safety;
 10 int Available[m]={2,3,3};//可用资源向量
 11 int Request[m];//进程请求向量
 12 int Work[m];
 13 bool Finish[n];
 14 int Alloc[n][m]={
 15     {2,1,2},
 16     {4,0,2},
 17     {3,0,5},
 18     {2,0,4},
 19     {3,1,4},
 20 };//已分配资源数量
 21 int Need[n][m]={
 22     {3,4,7},
 23     {1,3,4},
 24     {0,0,3},
 25     {2,2,1},
 26     {1,1,0},
 27 };//资源需求量
 28 
 29 //判断是否合法
 30 bool Is_legal(int index)
 31 {
 32     bool flag=true;
 33     for(int i=0;i<m;i++){
 34         if(Request[i]>Available[i]||Request[i]>Need[index][i]){
 35             flag=false;break;
 36         }
 37     }
 38     if(!flag)return false;
 39     return true;
 40 }
 41 
 42 //试探性分配
 43 void Change(int index)
 44 {
 45     for(int i=0;i<m;i++){
 46         Available[i]-=Request[i];
 47         Alloc[index][i]+=Request[i];
 48         Need[index][i]-=Request[i];
 49     }
 50 }
 51 
 52 //取消试探性分配
 53 void Rechange(int index)
 54 {
 55     for(int i=0;i<m;i++){
 56         Available[i]+=Request[i];
 57         Alloc[index][i]-=Request[i];
 58         Need[index][i]+=Request[i];
 59     }
 60 }
 61 
 62 //安全性检查
 63 bool Check(int index)
 64 {
 65     memset(Finish,false,sizeof(Finish));
 66     bool flag=true;
 67     safety="";safety+=index+'0';
 68     for(int i=0;i<m;i++){
 69         Work[i]=Available[i];
 70         if(Work[i]<Need[index][i])flag=false;
 71     }
 72     if(!flag)return false;
 73     for(int i=0;i<m;i++)Work[i]+=Alloc[index][i];
 74     Finish[index]=true;
 75     for(int i=0;i<n;i++)
 76     {
 77         if(Finish[i]==false){
 78             flag=true;
 79             for(int j=0;j<m;j++){
 80                 if(Work[j]<Need[i][j]){ flag=false;break; }
 81             }
 82             if(flag){
 83                 for(int j=0;j<m;j++){
 84                     Work[j]+=Alloc[i][j];
 85                 }
 86                 safety+=i+'0';
 87                 Finish[i]=true;
 88                 i=-1;
 89             }
 90         }
 91     }
 92     for(int i=0;i<n;i++){
 93         if(Finish[i]==false)return false;
 94     }
 95     return true;
 96 }
 97     
 98 
 99 int main()
100 {
101     int index;
102     while(scanf("%d",&index),--index>=0&&index<n)
103     {
104         for(int i=0;i<m;i++)
105             scanf("%d",&Request[i]);
106         if(!Is_legal(index)){ puts("不合法");continue; }
107         Change(index);
108         if(Check(index))
109         {
110             for(int i=0;i<n;i++){
111                 printf("%d ",safety[i]-'0'+1);
112             }
113             puts("");
114         }else puts("安全性检查失败");
115         Rechange(index);
116     }
117     return 0;
118 }
119 
120 
121 
122 
123         
124         
125 
126         
127         
View Code

 

posted @ 2013-06-07 21:18  ihge2k  阅读(236)  评论(0编辑  收藏  举报