实验题目
死锁的检测与解除
实验目的
为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁
设计思想
首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的
进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使
之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一
个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有
进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释
放它们占用的资源。
主要数据结构
和银行家算法类似,需要建立相应的数组
int allocation[M][M];
int request[M][M];
int available[M];
int line[M];
int no[M];
int work[M];
//管理不占用资源的进程
//记录造成死锁的进程
流程图
开始
输入总进程
数
输入资源数
输入 Allocation
矩阵
输入 Request
矩阵
输入 available
矩阵
是否发生死
锁
是
否
死锁解除
结束
附录
源代码如下:
# 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
if(f==0)
{
printf("该系统将发生死锁!\n");
printf("造成死锁的进程为:");
for(i=0;i
for (j=0;j
work[j])
f=0;
if (f==1)
//找到满足条件的进程
line[i]=1;
for (j=0;j0);
}
void remove() //死锁解除
{
for(i=0;ifor (i=0;i0)
break;
printf("%2d",available[j]);
}
printf("\n");
}
}