首页 > 代码库 > 银行家算法
银行家算法
学习操作系统中的关于死锁的一节,银行家算法,是如何防止死锁的一个很重要的算法
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 }
主要就是如何判断系统是否安全。
银行家算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。