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

posted on
浙公网安备 33010602011771号