资源描述
实验名称:实验名称:死锁的检测与解除死锁的检测与解除 姓姓 名:名:杨秀龙杨秀龙 学学 号:号:1107300432 专业班级:专业班级:创新实验班创新实验班 111 指导老师:指导老师:霍林霍林 实验题目实验题目死锁的检测与解除实验目的实验目的为了更清楚系统对死锁是如何检测和当死锁发生时如何解除死锁设计思想设计思想首先需要建立和银行家算法类似的数组结构,先把孤立的进程(没有占用资源的进程)放入一个数组中,根据死锁原理,找出既不阻塞又非独立的进程结点,使之成为孤立的结点并放入孤立数组中,再释放该进程的占用资源,继续寻找下一个孤立结点,如果所有进程都能放入孤立数组中,则系统不会发生死锁,如果有进程不能放入,则系统将发生死锁,并进行死锁解除,撤消所有的死锁进程,释放它们占用的资源。主要数据结构主要数据结构和银行家算法类似,需要建立相应的数组int allocationMM;int requestMM;int availableM;int lineM;/管理不占用资源的进程int noM;/记录造成死锁的进程int workM;流程图流程图开始结束输入总进程数输入资源数输入 Request矩阵输入 Allocation矩阵是否发生死锁死锁解除否是输入 available矩阵运行结果运行结果图(1)不会发生死锁时图(1)当发生死锁时附录附录源代码如下:源代码如下:#include stdio.h#define M 50int allocationMM;int requestMM;int availableM;int lineM;int noM;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;in;i+)for(j=0;jm;j+)scanf(%d,&allocationij);printf(输入进程的请求矩阵 request:n);for(i=0;in;i+)for(j=0;jm;j+)scanf(%d,&requestij);printf(输入系统可利用资源 available:n);for(j=0;jm;j+)scanf(%d,&availablej);show();check();f=1;for(i=0;in;i+)if(linei=0)f=0;noa+=i;/记录死锁序号 if(f=0)printf(该系统将发生死锁!n);printf(造成死锁的进程为:);for(i=0;in;i+)printf(%2d,noi);printf(n);remove();show();elseprintf(不会发生死锁!n);void check()/死锁检测 int k,;int x;int workM;for(i=0;in;i+)linei=0;for(i=0;in;i+)/(2)x=0;for(j=0;jm;j+)if(allocationij=0)x+;if(x=m)linei=1;for(j=0;jm;j+)/(3)workj=availablej;k=n;do for(i=0;in;i+)if(linei=0)f=1;/空置条件是否满足 for(j=0;jworkj)f=0;if(f=1)/找到满足条件的进程 linei=1;for(j=0;j0);void remove()/死锁解除for(i=0;in;i+)if(linei=0)for(j=0;jm;j+)availablej+=allocationij;allocationij=0;requestij=0;printf(死锁解除!n);void show()printf(进程);printf();printf(allocation);printf();printf(request);printf();printf(available);printf(n);for(i=0;in;i+)printf(%2d,i);printf();for(j=0;jm;j+)printf(%2d,allocationij);printf();for(j=0;jm;j+)printf(%2d,requestij);printf();for(j=0;j0)break;printf(%2d,availablej);printf(n);
展开阅读全文