银行家算法
操作系统上机实习课,简单地实现了一下银行家算法==具体的算法流程就不写了==
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