银行家算法
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int work,progress,available[100],mmax[100][100],allocation[100][100],need[100][100]; 6 int p[100]; 7 void init() 8 { 9 int i,j; 10 printf("请输入多少系统资源数\n"); 11 scanf("%d",&work); 12 printf("请输入总共有多少进程\n"); 13 scanf("%d",&progress); 14 for(i=1;i<=work;i++) 15 { 16 printf("第%d类资源有的资源实例:",i); 17 scanf("%d",&available[i]); 18 } 19 for(i=1;i<=progress;i++) 20 for(j=1;j<=work;j++) 21 { 22 printf("进程p[%d]当前分配第%d类资源数: ",i,j); 23 scanf("%d",&allocation[i][j]); 24 } 25 int sum; 26 for(j=1;j<=work;j++) 27 { 28 sum=0; 29 for(i=1;i<=progress;i++) 30 { 31 sum+=allocation[i][j]; 32 33 } 34 available[j]-=sum; 35 } 36 for(i=1;i<=progress;i++) 37 for(j=1;j<=work;j++) 38 { 39 printf("进程p[%d]对第%d类资源的最大需求量: ",i,j); 40 scanf("%d",&mmax[i][j]); 41 } 42 for(i=1;i<=progress;i++) 43 for(j=1;j<=work;j++) 44 { 45 need[i][j]=mmax[i][j]-allocation[i][j]; 46 } 47 printf("当前的状态:\n"); 48 printf(" Max Allocation Need\n"); 49 printf("进程"); 50 for(i=1;i<=3;i++) 51 { 52 for(j=1;j<=work;j++) 53 printf(" %d类",j); 54 } 55 for(i=1;i<=progress;i++) 56 { 57 printf("\nP[%d]",i); 58 for(j=1; j<=work; j++) 59 { 60 printf(" %d ",mmax[i][j]); 61 } 62 for(j=1; j<=work; j++) 63 { 64 printf(" %d ",allocation[i][j]); 65 } 66 for(j=1; j<=work; j++) 67 { 68 printf(" %d ",need[i][j]); 69 } 70 } 71 printf("\n\n系统剩余资源量: "); 72 for(i=1; i<=work; i++) 73 { 74 printf(" %d ",available[i]); 75 } 76 printf("\n"); 77 } 78 bool safe() 79 { 80 int w[100],finish[100],i,j,k,l=0; 81 memset(finish,0,sizeof(finish)); 82 for(i=1;i<=work;i++) 83 w[i]=available[i]; 84 printf("\n"); 85 for(i=1;i<=progress;i++) 86 { 87 if(finish[i]==1) 88 continue; 89 for(j=1;j<=work;j++) 90 { 91 if(need[i][j]>w[j]) 92 break; 93 } 94 if(j==work+1) 95 { 96 finish[i]=1; 97 for(k=1;k<=work;k++) 98 w[k]+=allocation[i][k]; 99 p[l++]=i; 100 i=0; 101 } 102 else 103 continue; 104 if(l==progress) 105 { 106 printf("系统是安全的\n"); 107 printf("安全序列:\n"); 108 for(i=0;i<l;i++) 109 { 110 printf("%d",p[i]); 111 if(i!=l-1) //最后一项不输--> 112 { 113 printf("-->"); 114 } 115 } 116 printf("""\n"); 117 return true; 118 } 119 } 120 printf("系统是不安全的\n"); 121 return false; 122 } 123 void Request() 124 { 125 int m,i,request[100],flag=0,j; 126 printf("请输入申请资源的进程:"); 127 scanf("%d",&m); 128 for(i=1;i<=work;i++) 129 { 130 printf("请输入进程p[%d]对%d类资源的申请量:",m,i); 131 scanf("%d",&request[i]); 132 } 133 for(j=1;j<=work;j++) 134 { 135 if(request[j]>need[m][j]) 136 { 137 flag=1; 138 } 139 } 140 if(flag) 141 printf("请求的资源数超过了需求的最大值\n"); 142 else 143 { 144 for(j=1;j<=work;j++) 145 if(request[j]>available[j]) 146 flag=1; 147 if(flag) 148 printf("尚无足够资源,P[%d]须等待\n",m); 149 else 150 { 151 for(j=1;j<=work;j++) 152 { 153 available[j]=available[j]-request[j]; 154 allocation[m][j]=allocation[m][j]+request[j]; 155 need[m][j]=need[m][j]-request[j]; 156 } 157 printf("\n"); 158 if(safe()) 159 { 160 printf("可以分配给进程p[%d]\n",m); 161 } 162 else 163 { 164 printf("aaa\n"); 165 printf("让进程p[%d]等待",m); 166 for(j=1;j<=work;j++) 167 { 168 available[j]=available[j]+request[j]; 169 allocation[m][j]=allocation[m][j]-request[j]; 170 need[m][j]=need[m][j]+request[j]; 171 } 172 } 173 } 174 } 175 176 } 177 int main() 178 { 179 int cas; 180 printf("★★★★★★★★欢迎使用本程序★★★★★★★★\n"); 181 printf("\n\n"); 182 init(); 183 for(;;) 184 { 185 Request(); 186 printf("输入0程序运行结束,输入其他继续执行"); 187 scanf("%d",&cas); 188 if(cas==0) 189 break; 190 } 191 return 0; 192 }