1、二死锁的检测与解除实验二 死锁的检测与解除一、 实验目的:当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,为此,系统必须做到:(1)保存有关资源的请求和分配信息;(2)提供一种算法,以利用这些信息来检测系统是否已进入死锁状态。某一状态为死锁状态的充分条件是:当且仅当某一状态的资源分配图是不可完全简化的。通过该实验,可以充分理解死锁的检测与解除的基本原理。二、 实验题目: 设计一个 m个并发进程共享 n个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。要求用死锁检测算法检测当某一进程提出资源分配请求时,系统会不会陷入死锁状态;如
2、若陷入死锁状态要求用某种算法解除死锁三实验源程序文件名:sisuo .cpp 执行文件名:sisuo.exe四、实验分析1)本实验采用死锁检测算法检测死锁,死锁检测的数据结构如下 (1)可利用资源向量available,它表示了n类资源中每一类资源的可用数目。(2)把不占用资源的进程用finishi=true标示(3)从进程集合中找到一个requesti=work的进程,做如下处理:将其资源分配图简化,释放出资源,增加工作向量work:=work+allocationi,并将其finishi置1(4)若不能把所有的进程都标记为finishi=1,则表明该系统状态将发生死锁当发现进程死锁时,便应
3、立即把它们从死锁状态中解脱出来。本实验采用的解除死锁的方法是:撤销进程。本实验采用撤销的进程数目最小的方法,把死锁进程中占有资源最多的进程撤销,如若仍发生死锁,继续撤销下一进程2)流程图:(1) 主函数流程图(2)judge函数流程图 (3) check函数流程图(4) 解锁函数流程图3)源代码 #include#include#includeusing namespace std; /名字空间#define TRUE 1#define FALSE 0 /布尔值int compare(int *request,int *work,int N,int k) /如果Requestiwork则返回f
4、alseint 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,int m,int n) int i,j,flag=TRUE,K=0; while(flag=TRUE) /反复判断,直到无法判断 flag=FALSE; for(i=0;im;i+) /对任一进程进行判断 if(finishi=FALSE&compare(request,work,n,i)=TRU
5、E) /比较 for(j=0;jn;j+) /增加工作向量 workj+=allocationij; finishi=TRUE; pi=TRUE; /第i个进程放完资源 flag=TRUE; break; /*若所有的进程都放完,则返回ture,否则返回false* if(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,
6、flag; int *sum=new intm; for(i=0;im;i+) /初始化数组 sumi=0; for(i=0;im;i+) /统计死锁资源、释放 if(pi=FALSE) for(j=0;jn;j+) sumi=sumi+allocationij; allocationij=0; t=sum0; for(i=1;im;i+) /找出最大死锁进程i if(tsumi) t=sumi;flag=i; cout撤消占资源最大的进程:flagendl; for(j=0;jn;j+) /回收资源 workj+=allocationflagj; finishflag=TRUE; /完成fl
7、ag进程的操作 pflag=FALSE; /不再对它进行判断 flag=check(work,request,allocation,finish,p,m, n); /判断是否已经解除死锁 if(flag=TRUE) coutendl; cout成功解除死锁endl; else jiesuo(work,request,allocation,finish,p,m,n); /如果还没解除,继续放资源void judge(int *work,int *request,int *allocation,int *finish,int *p,int m,int n) int flag; flag=check
8、(work,request,allocation,finish,p,m, n); /判断if(flag=TRUE) cout不会发生死锁!endl; else cout会发生死锁!死锁进程如下:endl; for(int i=0;im;i+) /找出死锁进程 if(pi=FALSE) couti ; coutendl; jiesuo(work,request,allocation,finish,p,m,n); /解锁 void main() /主函数 cout死锁检测与解除算法示例endl; int m=0;int n=0; int i,j; coutm;coutendl; coutn;cou
9、tendl; int *allocation=new int *m; /定义数组 int *max=new int *m; int *need=new int *m; int *request=new int *m; int *available=new intn; int *p=new intm; int *finish=new intm; int *work=new intn; for( i=0;im;i+) /初始每个进程放资源状态为false pi=FALSE; cout输入可用矩阵availablen:endl; for(i=0;in;i+) coutavailableiavaila
10、blei; coutendl; for(i=0;im;i+) allocationi=new intn; cout输入已分配矩阵allocationmn:endl; for(i=0;im;i+) for(j=0;jn;j+) coutallocationijallocationij; coutendl; for(i=0;im;i+) maxi=new intn; cout 输入最大需求矩阵maxmn:endl; for(i=0;im;i+) for(j=0;jn;j+) coutmaxijmaxij; coutendl; for(i=0;im;i+) needi=new intn; cout需
11、求矩阵为needmn:endl; for(i=0;im;i+) for(j=0;jn;j+) needij=maxij-allocationij; coutneedij ; coutendl; for(i=0;im;i+) requesti=new intn; cout请输入请求矩阵requestmn:endl; for(i=0;im;i+) for(j=0;jn;j+) coutrequestijrequestij; coutendl; coutendl; for(i=0;im;i+) finishi=TRUE; /初始标记为true for(j=0;j0|requestij0) finishi=FALSE; for(j=0;jn;j+) workj=availablej; /初始情况 judge(work,request,allocation,finish,p,m,n); /开始判断四、 调试结果: 以上显示为未发生死锁的调试结果发生死锁,经解锁算法,撤销占资源最大进程,死锁状况成功解除五、 心得体会:通过该实验熟悉了指针的基本使用方法,死锁的检测与解除和银行家算法的数据结构基本相同,至于实验中所实施的死锁解除算法也只是简单撤销某一引起死锁进程所占有资源的简单释放,该实验只是简单模拟了死锁的检测与解除;最大的收获是对死锁定理的理解和对死锁解除算法的认识与实现机理实记。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1