实验名称:死锁的检测与解除 姓名:杨秀龙
学号: 1107300432
指导老师:霍林
实验题目
死锁的检测与解除
实验目的
为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁
设计思想
首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释放它们占用的资源。
主要数据结构
和银行家算法类似,需要建立相应的数组 int allocation[M][M]; int request[M][M]; int available[M];
int line[M]; //管理不占用资源的进程 int no[M]; //记录造成死锁的进程 int work[M];
流程图
否
运行结果
图(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];
intn,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
scanf("%d", &allocation[i][j]); printf("输入进程的请求矩阵request:\n"); for(i=0;i
scanf("%d",&request[i][j]);
printf("输入系统可利用资源available:\n"); for (j=0;j
scanf("%d", &available[j]); show(); check(); f=1; for(i=0;i
if(f==0) {
printf("该系统将发生死锁!\n"); printf("造成死锁的进程为:"); for(i=0;i
void check()//死锁检测 { int k,; int x; int work[M]; for(i=0;i
f=1; //空置条件是否满足
for (j=0;j
if (request[i][j]>work[j])
f=0;
if (f==1) //找到满足条件的进程 { line[i]=1; for (j=0;j
work[j]=work[j]+allocation[i][j]; //释放资源 available[j]=work[j];
} } } k--; }while(k>0); }
void remove() //死锁解除 { for(i=0;i
void show() { printf("进程"); printf(" "); printf("allocation"); printf(" "); printf("request"); printf(" "); printf("available"); printf("\n");
for (i=0;i
printf(" "); for(j=0;j
printf("%2d",allocation[i][j]); printf(" "); for(j=0;j
printf("%2d",request[i][j]); printf(" printf("\n");
}
"); for(j=0;j0) break; printf("%2d",available[j]); } }
实验名称:死锁的检测与解除 姓名:杨秀龙
学号: 1107300432
指导老师:霍林
实验题目
死锁的检测与解除
实验目的
为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁
设计思想
首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释放它们占用的资源。
主要数据结构
和银行家算法类似,需要建立相应的数组 int allocation[M][M]; int request[M][M]; int available[M];
int line[M]; //管理不占用资源的进程 int no[M]; //记录造成死锁的进程 int work[M];
流程图
否
运行结果
图(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];
intn,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
scanf("%d", &allocation[i][j]); printf("输入进程的请求矩阵request:\n"); for(i=0;i
scanf("%d",&request[i][j]);
printf("输入系统可利用资源available:\n"); for (j=0;j
scanf("%d", &available[j]); show(); check(); f=1; for(i=0;i
if(f==0) {
printf("该系统将发生死锁!\n"); printf("造成死锁的进程为:"); for(i=0;i
void check()//死锁检测 { int k,; int x; int work[M]; for(i=0;i
f=1; //空置条件是否满足
for (j=0;j
if (request[i][j]>work[j])
f=0;
if (f==1) //找到满足条件的进程 { line[i]=1; for (j=0;j
work[j]=work[j]+allocation[i][j]; //释放资源 available[j]=work[j];
} } } k--; }while(k>0); }
void remove() //死锁解除 { for(i=0;i
void show() { printf("进程"); printf(" "); printf("allocation"); printf(" "); printf("request"); printf(" "); printf("available"); printf("\n");
for (i=0;i
printf(" "); for(j=0;j
printf("%2d",allocation[i][j]); printf(" "); for(j=0;j
printf("%2d",request[i][j]); printf(" printf("\n");
}
"); for(j=0;j0) break; printf("%2d",available[j]); } }