1、实验二 死锁的检测与解除一、 实验目的:当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,为此,系统必须做到:(1)保存有关资源的请求和分配信息;(2)提供一种算法,以利用这些信息来检测系统是否已进入死锁状态。某一状态为死锁状态的充分条件是:当且仅当某一状态的资源分配图是不可完全简化的。通过该实验,可以充分理解死锁的检测与解除的基本原理。二、 实验题目:设计一个 m 个并发进程共享 n 个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。要求用死锁检测算法检测当某一进程提出资源分配请求时,系统会不会陷入死锁状态;如若陷入死锁状态要
2、求用某种算法解除死锁三实验源程序文件名:sisuo .cpp执行文件名:sisuo.exe四、实验分析1)本实验采用死锁检测算法检测死锁,死锁检测的数据结构如下 (1)可利用资源向量 available,它表示了 n 类资源中每一类资源的可用数目。(2)把不占用资源的进程用 finishi=true 标示(3)从进程集合中找到一个 requesti0|requestij0)Finish=falseJudge()开始(1) 主函数流程图检测函数 judge()开始Flag=check()Flag=true 提示不会发生死锁程序结束Flag=false,显示死锁进程 pi=0调用解锁函数jiesu
3、o()(2)judge 函数流程图Check()函数开始while(flag=TRUE)反复判断finishi=FALSE if(K0) return FALSE; if(K=0) return TRUE;(3) check 函数流程图解锁函数 jiesuo()开始初始化数组 sumi=0统计死锁进程资源 sumi=sumi+allocationij;找出最大死锁进程 iworkj+=allocationflagj;finishflag=TRUE; pflag=FALSEFlag=check()Flag=true 成功解除死锁Flag=false程序结束(4) 解锁函数流程图3)源代码#inc
4、lude#include#includeusing namespace std; /名字空间#define TRUE 1#define FALSE 0 /布尔值int compare(int *request,int *work,int N,int k) /如果 Requestiwork 则返回 falseint j,c=0;for(j=0;jworkj) c+; if(c0) return FALSE;else if(c=0) return TRUE;/判断int check(int *work,int *request,int *allocation,int *finish,int *p,
5、int m,int n)int i,j,flag=TRUE,K=0;while(flag=TRUE) /反复判断,直到无法判断flag=FALSE;for(i=0;i0) return FALSE;else if(K=0) return TRUE;/*/解锁函数void jiesuo(int *work,int *request,int *allocation,int *finish,int *p,int m,int n)int i,j,t,flag;int *sum=new intm;for(i=0;im;coutn;coutavailablei;coutallocationij;coutm
6、axij;coutrequestij;cout0|requestij0) finishi=FALSE; for(j=0;jn;j+) workj=availablej; /初始情况judge(work,request,allocation,finish,p,m,n); /开始判断四、 调试结果:以上显示为未发生死锁的调试结果发生死锁,经解锁算法,撤销占资源最大进程,死锁状况成功解除五、 心得体会:通过该实验熟悉了指针的基本使用方法,死锁的检测与解除和银行家算法的数据结构基本相同,至于实验中所实施的死锁解除算法也只是简单撤销某一引起死锁进程所占有资源的简单释放,该实验只是简单模拟了死锁的检测与解除;最大的收获是对死锁定理的理解和对死锁解除算法的认识与实现机理实记。