死锁的检测与解除C语言代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称:死锁的检测与解除
姓名:杨秀龙
学号: 1107300432 专业班级:创新实验班111
指导老师:霍林
实验题目
死锁的检测与解除
实验目的
为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁
设计思想
首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释放它们占用的资源。
主要数据结构
和银行家算法类似,需要建立相应的数组
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];
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 for(j=0;j scanf("%d", &allocation[i][j]); printf("输入进程的请求矩阵request:\n"); for(i=0;i for(j=0;j 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(line[i]==0) {f=0; no[a++]=i;//记录死锁序号 } } if(f==0) { printf("该系统将发生死锁!\n"); printf("造成死锁的进程为:"); for(i=0;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 line[i]=0; for(i=0;i { x=0; for(j=0;j { if(allocation[i][j]==0) x++; if(x==m) line[i]=1; } } for(j=0;j work[j]=available[j]; k=n; do{ for (i=0;i { if(line[i]==0) { 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 { if(line[i]==0) { for(j=0;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");