首页 > 代码库 > 银行家算法

银行家算法

  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          else103            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       else143       {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           else150           {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               else163               {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 }

 

银行家算法