码迷,mamicode.com
首页 > 编程语言 > 详细

银行家算法

时间:2014-11-19 10:54:33      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   sp   for   数据   on   

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

  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         else
115         {
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 }

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

bubuko.com,布布扣

银行家算法

标签:style   blog   http   io   color   sp   for   数据   on   

原文地址:http://www.cnblogs.com/Fchengli/p/4107555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!