1、死锁的检测与解除死锁的检测与解除-操作系统实验报告题 目 : 死锁的检测与解除指导老师 : 班 级 : 姓 名 : 学 号 : 时 间 : 实验二 死锁的检测与解除一、实验目的系统为进程分配资源时并不一定能满足进程的需求,因此检测系统的安全性是非常有必要的。安全性的检测在之前的实验中用银行家算法得以实现,此次实验增加了另一个问题:即当系统死锁时如何解除死锁。通过此次实验,可以深刻的体会死锁的检测与解除的方法。二、实验内容编程实现死锁的检测与解除,并上机验证。实验环境:Microsoft Visual Studio 2010三、算法描述程序中的数据结构:1)可用资源向量: 这是一个含有个元素的数
2、组,其中的每一个元素代表一类可利用资源数目。2)最大需求矩阵: 它是一个的矩阵,定义了系统中n个进程中得每一个进程对类资源的最大需求。3)可分配矩阵: 这也一个的矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。4)需求矩阵: 这表示每一个进程尚需的各类资源数。5)综上所述:。该程序是在银行家算法的基础上添加了死锁的解除模块得来的,死锁的解除采用的方法是:找到已分配资源最大的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。1)设是进程的请求向量,如果,表示进程需要个类型起源。当发出资源请求后,进行检查,如果合格,修改、的值。2)用安全性算法检查是否存在安全序列,如果存在,输出安全序列
3、;如果不存在,即为死锁,进行解锁操作。3)统计的值,找出占用资源最多的进程,将其撤销,回收占用的资源,修改一下的数据结构中的值:;用安全性算法进行检查,如果仍有死锁,重复步骤3,知道解锁为止。4)输出安全序列。程序主要包括四大模块,一是输入数据模块,二是资源请求模块,三是检测死锁模块,四是对死锁进行解除模块。程序流程图如下:四、程序清单及简单注释/ 死锁的检测与解除.#include#include#include#define TRUE 1#define FALSE 0using namespace std;int number=0;/定义全局变量,number为请求资源的进程号int nu
4、m=0;/num为安全序列中进程的个数int Input();int output();/*输出未解锁之前的资源分配情况*int output(int *max,int *need,int *work,int *allocation,int m,int n) int i,j,mark=1; cout该时刻的资源分配情况如下:endl; coutendl; cout 各个矩阵:| max | allocation | need | available |endl; coutendl; coutProcess | Rescource | ; for(i=0;i4;i+) for(j=0;jn;j+
5、) coutj; cout ; cout| ; coutendl; coutendl; cout-endl; for(i=0;im;i+) cout Pi ; cout| ; for(j=0;jn;j+) coutmaxij ; cout| ; for(j=0;jn;j+) coutallocationij ; cout| ; for(j=0;jn;j+) coutneedij ; cout| ; if(mark=1) for(j=0;jn;j+) coutworkj ; cout| ; mark=0; coutendl; coutendl; getchar(); return 0;/*输出解
6、锁之后的资源分配情况*int output2(int *need,int *allocation,int *work,int *ss,int *finish,int *p,int m,int n) int i,j,mark=1,tag; cout该时刻的资源分配情况如下:endl; coutendl; cout 各个矩阵:| need | allocation | work | wor+allocation | finish |endl; coutendl; coutProcess | Rescource | ; for(i=0;i4;i+) for(j=0;jn;j+) coutj; cou
7、t ; cout| ; coutendl; coutendl; cout-endl; for(i=0;inum;i+) tag=ssi; coutPtag ; cout| ; for(j=0;jn;j+) coutneedtagj ; cout| ; for(j=0;jn;j+) coutallocationtagj ; cout| ; for(j=0;jn;j+) coutworkj ; cout| ; for(j=0;jn;j+) coutworkj+allocationtagj ; workj=workj+allocationtagj; cout| ; if(finishtag=1) c
8、outTRUE ; else coutFALSE ; cout| ; coutendl; getchar(); return 0;/*输入所有相关的信息*int Input(int *max,int *need,int *work,int *allocation,int *available,int *request,int m,int n,int flag) int j; coutnumber; cout=n) return FALSE; else for(j=0;jn;j+) cout进程Pnumber对jrequestj; coutendl; for(j=0;jneednumberj|r
9、equestjavailablej)/判断请求向量的合法性 flag=FALSE; return flag; /*可用资源与需求矩阵的比较*int check(int *need,int *work,int N,int i) int j,c=0; for(j=0;jworkj) c+; if(c0) return FALSE; else if(c=0) return TRUE;/*系统安全性的检测*int judge(int *need,int *work,int *allocation,int *finish,int *p,int *ss,int m,int n) int i,j,k=0,c
10、ount=0,flag=TRUE,mark=0,tag=0; while(flag=TRUE) flag=FALSE; for(i=0;im;i+) if(finishi=FALSE&check(need,work,n,i)=TRUE) for(j=0;jn;j+) workj=workj+allocationij;/进程请求成功,完成作业后回收allocation的资源 finishi=TRUE; pi=TRUE; flag=TRUE; sstag+=i;/存储进程,用于输出安全序列 break; /while(flag=TRUE) if(flag=FALSE) for(i=0;i0) co
11、utendl; cout检测结果:存在死锁进程!endl; coutendl; return FALSE; if(k=0) coutendl; cout检测结果:不存在死锁进程!endl; coutendl; cout输出安全序列为: ; for(i=0;itag;i+) coutPssi ; coutendl; getchar(); coutendl; return TRUE; /*解锁*void unlock(int *need,int *available,int *work,int *allocation,int *finish,int *p,int *ss,int m,int n)
12、/统计死锁进程的资源数,找出最大的死锁进程,进行撤销 int *sum=new intm,i,j,k=0,count2=0,flag; int *temp=new intn;/用于暂存work数组里的值,间接调用request函数 for(i=0;in;i+) tempi=worki; for(i=0;im;i+) if(finishi=FALSE) for(j=0;jn;j+) sumi=sumi+allocationij;/寻找占用资源最多的进程 count2=sum0; for(i=0;icount2) count2=sumi; k=i; /k标记的数组位置即为已分配资源最多的进程 co
13、ut撤销占用资源最大的进程Pkendl; for(i=0;in;i+) worki=worki+allocationki; finishk=TRUE;/完成对该进程的操作 pk=FALSE;/不再对该进程进行判断 num-; flag=judge(need,work,allocation,finish,p,ss,m,n);/再次进行判断是否存在安全序列 if(flag=TRUE) coutendl; cout成功解除死锁!endl; output2(need,allocation,work,ss,finish,p,m,n); for(i=0;in;i+) allocationnumberi=a
14、llocationnumberi-availablei+tempi; neednumberi=neednumberi+availablei-tempi; /恢复请求进程原始的资源分配 finishk=FALSE;/初始化对该进程的操作 pk=TRUE;/初始化对该进程进行判断 num+;/恢复撤销进程之前的情况 for(j=0;jn;j+) workj=availablej;/初始化work数组 coutendl; getchar(); else unlock(need,available,work,allocation,finish,p,ss,m,n);/*主函数*void main() i
15、nt i,j,m,n,count=0,s=0; int flag=FALSE; char name; coutendlendltttt死锁的检测与解除endlendl; coutm; num=m; coutendl; coutn; coutendl; int *max=new int *m; int *need=new int *m; int *allocation=new int *m; int *request=new intn; int *available=new intn; int *finish=new intm; int *p=new intm; int *work=new in
16、tn; int *ss=new intm; for(i=0;im;i+) maxi=new intn; needi=new intn; allocationi=new intn; cout请输入各个进程对各种资源的最大需求max:endl; coutendl; for(i=0;im;i+) for(j=0;jn;j+) cout进程 Pi 对jmaxij; coutendl; cout请输入已分配的矩阵allocation:endl; coutendl; for(i=0;im;i+) for(j=0;jn;j+) cout进程 Pi 已分配到的 jallocationij; if(alloca
17、tionijmaxij) coutendl; cout输入数据大于最多需求数,重新输入!endl; j-; else needij=maxij-allocationij; coutendl; cout请输入可分配的资源available:endl; coutendl; for(i=0;in;i+) coutiavailablei; worki=availablei; coutendl; for(i=0;im;i+) finishi=FALSE;/输入finsish向量 pi=FALSE; output(max,need,work,allocation,m,n);/输出目前的资源分配情况 cou
18、tendl; i=0; while(flag=FALSE&in)/进程多次请求资源 flag=TRUE; for(j=0;jn;j+) workj=availablej; for(j=0;jm;j+) ssj=0; /初始化缓存数组ss for(j=0;jm;j+) finishj=FALSE; pj=FALSE; /初始化各进程分配情况 flag=Input(max,need,work,allocation,available,request,m,n,flag); if(flag=TRUE) for(j=0;jn;j+) availablej=availablej-requestj; wor
19、kj=availablej; neednumberj=neednumberj-requestj; allocationnumberj=allocationnumberj+requestj; /修改请求资源后的资源分配情况 cout输出此时的资源分配情况:endl; coutendl; output(max,need,work,allocation,m,n); flag=judge(need,work,allocation,finish,p,ss,m,n); if(flag=TRUE) output2(need,allocation,work,ss,finish,p,m,n); else cou
20、t存在死锁进程!endl; coutendl; cout输出死锁的进程:; for(i=0;im;i+) if(finishi=FALSE) coutPi ; coutendl; coutname; coutendl; if(name=Y) unlock(need,available,work,allocation,finish,p,ss,m,n); else cout程序运行结束!endl; break; /else flag=FALSE; else coutendl; if(numbern) cout请求的资源数超过所拥有的资源数,进程Pnumber等待!endl; coutendl; e
21、lse cout不存在进程Pnumber!endl; i+; /while(flag=FALSE&in) getchar();五、实验结果开始输入:输入最大需求矩阵max:输入已分配矩阵allocation:输入可用资源向量available:此时资源分配情况如下:进程P1请求资源:(请求成功)进程P1请求资源:(请求资源数超过可用资源)进程P2请求资源:(发生死锁)检测到死锁产生,进行解锁:如果一次解锁不成功,则继续剥夺下一个已分配资源最多的死锁进程的资源,直到死锁解除。 经检查,实验结果符合要求。六、实验小结通过这次实验,我对死锁的各方面理解都有了更深层次的认识。一开始,对于死锁的解除,我只是从第一个进程开始剥夺其资源,也不管它是不是发生了死锁,一直剥夺到死锁解除为止。然后,我又对程序进行改进,让其可以判断死锁进程与非死锁进程,然后从第一个死锁进程开始剥夺已分配资源。到最后,我又对程序进一步完善,让其判断一下在死锁进程中,哪个的已分配资源最多,就先剥夺它的资源,直到死锁解除。通过以上这几次对程序的改进,我不仅对死锁的解除有了更进一步的理解,也加深了对编程理念的认识。一种好的编程习惯、编程理念不仅可以帮助减少工作量,更可以帮助编程人员对程序的思想进行全面理解,对程序需求进行全面理解。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1