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

  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 2014-11-19 10:10  fengcl_matrix  阅读(919)  评论(0)    收藏  举报