📄 deadlock.c
字号:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
struct process
{ int max[10];
int allocation[7];
int need[10];
int done; /*判断进程是否完成*/
int finish; /*银行家算法中判断是否完成*/
};
struct process pro[5]; /*五个进程*/
int source[7]={0}; /*资源的总数*/
int available[7]={0}; /*可利用的资源*/
int request[5][7]={0}; /*产生的请求*/
void main()
{ int i,j,flag,sum;
char ch;
time_t t;
void out();
int bank();
int fun();
int fun2();
srand((unsigned) time(&t));
for(i=0;i<5;i++) /*初始化数据*/
{ for(j=0;j<7;j++)
{ pro[i].max[j]=rand()%5;
pro[i].allocation[j]=0;
pro[i].need[j]=pro[i].max[j];
}
pro[i].done=0;
pro[i].finish=0;
}
for(i=0;i<7;i++)
{source[i]=rand()%5+5;
available[i]=source[i];
}
out();
while(!fun()) /*进程是否执行完*/
{ do
{ i=rand()%5;
}while(pro[i].done==1);
do
{for(j=0;j<7;j++) /*产生进程资源需求向量*/
{ do
{request[i][j]=rand()%5;
}while(request[i][j]>pro[i].need[j]);
}
}while(fun2(i));
for(j=0;j<7;j++)
if(request[i][j]>available[j]) flag=2;
while(flag==2) /*没有可利用的资源,换其它进程*/
{ flag=0;
out();
printf("request[%d]: ",i+1);
for(j=0;j<7;j++)
printf("%d ",request[i][j]);
printf("\n");
printf("资源缺乏,请等待!\n");
do
{i=rand()%5;
}while(pro[i].done==1);
do
{for(j=0;j<7;j++) /*产生资源需求*/
{ do
{request[i][j]=rand()%5;
}while(request[i][j]>pro[i].need[j]); /*fun2()判断产生的资源需求是否全0*/
}
}while(fun2(i));
for(j=0;j<7;j++)
if(request[i][j]>available[j]) flag=2;
}
/*请求符合要求,用银行家算法判断是否安全*/
if(bank(i))
{ sum=0;
for(j=0;j<7;j++)
{ available[j]-=request[i][j];
pro[i].allocation[j]+=request[i][j];
pro[i].need[j]-=request[i][j];
sum+=pro[i].max[j]-pro[i].allocation[j];
}
if(sum==0)
{ pro[i].done=1;
pro[i].finish=1;
for(j=0;j<7;j++)
{ available[j]+=pro[i].allocation[j];
pro[i].allocation[j]=0;
pro[i].need[j]=0;
}
}
out();
printf("request[%d]: ",i+1);
for(j=0;j<7;j++)
printf("%d ",request[i][j]);
printf("\n");
printf("请求不会导致死锁,资源请求已满足!\n");
}
else
{ out();
printf("request[%d]: ",i+1);
for(j=0;j<7;j++)
printf("%d ",request[i][j]);
printf("\n");
printf("资源请求会引起死锁,不允许!\n");
}
}
//printf("程序已经执行完毕,按回车退出!\n");
ch=getch();
}
void out()
{ int i,j;
printf(" allocation max need\n");
printf(" ");
printf("A B C D E F G ");
printf("A B C D E F G ");
printf("A B C D E F G \n");
for(i=0;i<5;i++)
{ if(1)
{ printf(" Process %d: ",i+1);
for(j=0;j<7;j++)
printf("%d ",pro[i].allocation[j]);
printf(" ");
for(j=0;j<7;j++)
printf("%d ",pro[i].max[j]);
printf(" ");
for(j=0;j<7;j++)
printf("%d ",pro[i].need[j]);
printf("\n");
}
}
printf("资源总数: ");
for(j=0;j<7;j++)
printf("%d ",source[j]);
printf("\n");
printf("available: ");
for(j=0;j<7;j++)
printf("%d ",available[j]);
printf("\n");
}
int fun()
{ int sum=1,i;
for(i=0;i<5;i++)
sum*=pro[i].finish;
return sum;
}
int bank(int x)
{ int work[7]={0},i,j,g,all,sign=0,ret,count=0,sum=0;
for(i=0;i<7;i++) /*假设已经分配了*/
{ pro[x].allocation[i]+=request[x][i];
available[i]-=request[x][i];
sum+=pro[x].max[i]-pro[x].allocation[i];
work[i]=available[i];
}
/* 判断是否已经满足了所有的需求*/
if(sum==0)
{ for(i=0;i<7;i++)
{
pro[x].allocation[i]-=request[x][i];
available[i]+=request[x][i];
}
return 1;
}
else
{
while(!fun()&&count<6)
{ for(i=0;i<5;i++)
{ all=0;
if(pro[i].finish==0)
{ for(j=0;j<7;j++)
if(pro[i].need[j]<=work[j])
all++; /*统计是否7个资源的请求都能满足*/
if(all==7)
{ for(g=0;g<7;g++)
work[g]+=pro[i].allocation[g];
pro[i].finish=1;
}
}
}
count++;
}
for(j=0;j<5;j++)
if(pro[j].finish==1)
sign++;
for(j=0;j<5;j++)
if(pro[j].done==0)
pro[j].finish=0;
for(i=0;i<7;i++)
{ pro[x].allocation[i]-=request[x][i];
available[i]+=request[x][i];
}
if(sign==5) return 1;
else return 0;
}
}
int fun2(int x)
{ int j,n=0;
for(j=0;j<7;j++)
if(request[x][j]==0) n++;
if(n==7) return 1;
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -