当前位置:文档之家› 死锁的检测与解除C语言代码

死锁的检测与解除C语言代码

实验名称:死锁的检测与解除*名:***
学号:**********
专业班级:创新实验班111 指导老师:**
实验题目
死锁的检测与解除
实验目的
为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁
设计思想
首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释放它们占用的资源。

主要数据结构
和银行家算法类似,需要建立相应的数组
int allocation[M][M];
int request[M][M];
int available[M];
int line[M]; //管理不占用资源的进程
int no[M]; //记录造成死锁的进程
int work[M];
流程图
开始
结束
输入总进程

输入资源数
输入Request
矩阵
输入Allocation
矩阵
是否发生死锁
死锁解除


输入available
矩阵
运行结果
图(1)不会发生死锁时
图(1)当发生死锁时
附录
源代码如下:
# include "stdio.h"
# define M 50
int allocation[M][M];
int request[M][M];
int available[M];
int line[M];
int no[M];
int n,m,i,j,f,a=0;
main()
{
void check();
void remove();
void show();
printf("输入进程总数:");
scanf("%d", &n);
printf("输入资源种类数量:");
scanf("%d", &m);
printf("输入进程已占用的资源Allocation:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d", &allocation[i][j]);
printf("输入进程的请求矩阵request:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&request[i][j]);
printf("输入系统可利用资源available:\n");
for (j=0;j<m;j++)
scanf("%d", &available[j]);
show();
check();
f=1;
for(i=0;i<n;i++)
{
if(line[i]==0)
{f=0;
no[a++]=i;//记录死锁序号
}
}
if(f==0)
{
printf("该系统将发生死锁!\n");
printf("造成死锁的进程为:");
for(i=0;i<n;i++)
printf("%2d",no[i]);
printf("\n");
remove();
show();
}
else{
printf("不会发生死锁!\n");
}
}
void check()//死锁检测
{
int k,;
int x;
int work[M];
for(i=0;i<n;i++)
line[i]=0;
for(i=0;i<n;i++) //(2)
{ x=0;
for(j=0;j<m;j++)
{
if(allocation[i][j]==0)
x++;
if(x==m)
line[i]=1;
}
}
for(j=0;j<m;j++)//(3)
work[j]=available[j];
k=n;
do{
for (i=0;i<n; i++)
{
if(line[i]==0)
{
f=1; //空置条件是否满足
for (j=0;j<m; j++)
if (request[i][j]>work[j])
f=0;
if (f==1) //找到满足条件的进程
{ line[i]=1;
for (j=0;j<m; j++)
work[j]=work[j]+allocation[i][j]; //释放资源
available[j]=work[j];
}
}
}
k--;
}while(k>0);
}
void remove() //死锁解除
{
for(i=0;i<n;i++)
{
if(line[i]==0)
{
for(j=0;j<m;j++)
{
available[j]+=allocation[i][j];
allocation[i][j]=0;
request[i][j]=0;
}
}
}
printf("死锁解除!\n");
}
void show()
{
printf("进程");
printf(" ");
printf("allocation");
printf(" ");
printf("request");
printf(" ");
printf("available");
printf("\n");
for (i=0;i<n; i++)
{
printf("%2d",i);
printf(" ");
for(j=0;j<m; j++)
printf("%2d",allocation[i][j]);
printf(" ");
for(j=0;j<m; j++)
printf("%2d",request[i][j]);
printf(" ");
for(j=0;j<m; j++){
if(i>0)
break;
printf("%2d",available[j]);
}
printf("\n");
}
}。

相关主题