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

银行家算法

学习操作系统中的关于死锁的一节,银行家算法,是如何防止死锁的一个很重要的算法

  1 #include <stdio.h>  2 #define MAX_M 50//最大进程数  3 #define MAX_N 100//最大资源数  4 int m;    //总进程数  5 int n;    //资源种类  6 int i,j;   7 int p[MAX_M];  //记录序列  8 int Request[MAX_M][MAX_N]; //进程需要的资源  9 int Available[MAX_N]; //系统可用资源数 10 int Need[MAX_M][MAX_N]; //进程需要的资源数 11 int MAX[MAX_M][MAX_N];  //最大需求矩阵  12 int Allocation[MAX_M][MAX_N]; //分配矩阵 13 int init();  //初始化 14 int bank(); //银行家算法 15 bool safe();  //安全检测 16  17  18 int init() 19 { 20     printf("输入总进程数:\n"); 21     scanf("%d",&m); 22     printf("输入资源种类:\n"); 23     scanf("%d",&n); 24     printf("输入最大需求矩阵\n"); 25     for(i=0;i<m;i++) 26         for(j=0;j<n;j++) 27             scanf("%d",&MAX[i][j]); 28     printf("输入分配矩阵\n"); 29     for(i=0;i<m;i++) 30         for(j=0;j<n;j++) 31         { 32             scanf("%d",&Allocation[i][j]); 33             Need[i][j]=MAX[i][j]-Allocation[i][j]; 34         } 35     printf("输入各资源现有的数目\n"); 36     for(j=0;j<n;j++) 37     { 38         scanf("%d",&Available[j]); 39     } 40     return 0; 41 } 42 int bank() 43 { 44     int p; 45     while(1) 46     { 47         printf("\n输入需要申请资源的进程号\n"); 48         scanf("%d",&p); 49         printf("输入请求各资源的数量\n"); 50         for(j=0;j<n;j++) 51             scanf("%d",&Request[p][j]); 52         for(j=0;j<n;j++) 53         { 54             if(Request[p][j]<=Need[p][j]) 55                 if(Request[p][j]<=Available[j]) 56                 { 57                     Available[j]=Available[j]-Request[p][j]; 58                     Allocation[p][j]=Allocation[p][j]+Request[p][j]; 59                     Need[p][j]=Need[p][j]-Request[p][j]; 60                 } 61                 else 62                     printf("输入数据有误\n"); 63         } 64         if(safe()) 65             printf("同意分配\n"); 66         else 67         { 68             printf("恢复原来状态\n"); 69             for(j=0;j<n;j++) 70             { 71                 Available[j]=Available[j]+Request[p][j]; 72                 Allocation[p][j]=Allocation[p][j]-Request[p][j]; 73                 Need[p][j]=Need[p][j]+Request[p][j]; 74             } 75         } 76     } 77     return 0; 78 } 79  80 bool safe() 81 { 82     int l=0; 83     int k; 84     bool finish[MAX_M];   //表示系统是否有足够的资源分配给进程, 85     int work[MAX_N];  //系统可以提供给进程运行所需的各类资源数目 86     for(j=0;j<n;j++) 87         work[j]=Available[j]; 88     for(i=0;i<m;i++) 89         finish[i]=false; 90     for(i=0;i<m;i++) 91     {     92         if(finish[i]==true) 93         { 94             continue; 95         } 96         else 97         { 98             for(j=0;j<n;j++) 99             {100                 if(Need[i][j]>work[j])101                 {102                     break;103                 }104             }105         }106         if(j==n)   //n个资源同时分配好            107         {108             finish[i]=true;109             for(k=0;k<n;k++)110                 work[k]=work[k]+Allocation[i][k];111             p[l++]=i;112             i=-1;    //找到一个可以分配的后,重新从第一个再次遍历113         }114         else115         {116             continue;117         }118         if(l==m)119         {120             printf("\n******************\n");121             printf("系统是安全的\n");122             printf("安全序列为:\n");123             for(i=0;i<m;i++)124             {125                 printf("%d",p[i]);126                 if(i!=m-1)127                     printf("-->");128             }129             printf("\n******************\n");130             return true;131         }132     }133     printf("系统不安全\n");134     return false;135 }136 int main()137 {138     init();139     safe();140     bank();141     return 0;142 }

主要就是如何判断系统是否安全。

银行家算法