您好,欢迎访问三七文档
死锁的检测与解除--操作系统实验报告题目:死锁的检测与解除指导老师:班级:姓名:学号:时间:实验二死锁的检测与解除一、实验目的系统为进程分配资源时并不一定能满足进程的需求,因此检测系统的安全性是非常有必要的。安全性的检测在之前的实验中用银行家算法得以实现,此次实验增加了另一个问题:即当系统死锁时如何解除死锁。通过此次实验,可以深刻的体会死锁的检测与解除的方法。二、实验内容编程实现死锁的检测与解除,并上机验证。实验环境:MicrosoftVisualStudio2010三、算法描述程序中的数据结构:1)可用资源向量Available:这是一个含有m个元素的数组,其中的每一个元素代表一类可利用资源数目。2)最大需求矩阵Max:它是一个nm的矩阵,定义了系统中n个进程中得每一个进程对m类资源的最大需求。3)可分配矩阵Allocation:这也一个nm的矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。4)需求矩阵Need:这表示每一个进程尚需的各类资源数。5)综上所述:[][][][][][]NeedijMaxijAllocationij。该程序是在银行家算法的基础上添加了死锁的解除模块得来的,死锁的解除采用的方法是:找到已分配资源最大的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。1)设irequest是进程iP的请求向量,如果[]irequestjK,表示进程iP需要K个jR类型起源。当iP发出资源请求后,进行检查,如果合格,修改Available、Allocation、Need的值。2)用安全性算法检查是否存在安全序列,如果存在,输出安全序列;如果不存在,即为死锁,进行解锁操作。3)统计[,]Allocationij的值,找出占用资源最多的进程iP,将其撤销,回收占用的资源,修改一下的数据结构中的值:[]:[]+[,]AvailablejAvailablejAllocationij;[,]:0Allocationij;用安全性算法进行检查,如果仍有死锁,重复步骤3,知道解锁为止。4)输出安全序列。程序主要包括四大模块,一是输入数据模块,二是资源请求模块,三是检测死锁模块,四是对死锁进行解除模块。程序流程图如下:开始结束输入最大需求矩阵、已分配矩阵、系统可用资源矩阵是否死锁进行资源请求否是是否继续否是分配资源解锁请求资源数合法是否四、程序清单及简单注释//死锁的检测与解除.#includeiostream#includestdio.h#includeiomanip#defineTRUE1#defineFALSE0usingnamespacestd;intnumber=0;//定义全局变量,number为请求资源的进程号intnum=0;//num为安全序列中进程的个数intInput();intoutput();//******输出未解锁之前的资源分配情况*******intoutput(int**max,int**need,int*work,int**allocation,intm,intn){inti,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++){cout[j];cout;}cout|;}coutendl;coutendl;cout-----------------------------------------------------------endl;for(i=0;im;i++){coutP[i];cout|;for(j=0;jn;j++){coutmax[i][j];}cout|;for(j=0;jn;j++){coutallocation[i][j];}cout|;for(j=0;jn;j++){coutneed[i][j];}cout|;if(mark==1){for(j=0;jn;j++){coutwork[j];}cout|;mark=0;}coutendl;}coutendl;getchar();return0;}//********输出解锁之后的资源分配情况***********intoutput2(int**need,int**allocation,int*work,int*ss,int*finish,int*p,intm,intn){inti,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++){cout[j];cout;}cout|;}coutendl;coutendl;cout-----------------------------------------------------------endl;for(i=0;inum;i++){tag=ss[i];coutP[tag];cout|;for(j=0;jn;j++)coutneed[tag][j];cout|;for(j=0;jn;j++)coutallocation[tag][j];cout|;for(j=0;jn;j++)coutwork[j];cout|;for(j=0;jn;j++){coutwork[j]+allocation[tag][j];work[j]=work[j]+allocation[tag][j];}cout|;if(finish[tag]=1)coutTRUE;elsecoutFALSE;cout|;coutendl;}getchar();return0;}//*************输入所有相关的信息*************intInput(int**max,int**need,int*work,int**allocation,int*available,int*request,intm,intn,intflag){intj;cout请输入请求资源的进程号:;cinnumber;coutendl;if(number=n){returnFALSE;}else{for(j=0;jn;j++){cout进程P[number]对[j]类资源的请求数为:;//输入请求向量requestcinrequest[j];coutendl;}for(j=0;jn;j++){if(request[j]need[number][j]||request[j]available[j])//判断请求向量的合法性flag=FALSE;}returnflag;}}//***********可用资源与需求矩阵的比较************intcheck(int**need,int*work,intN,inti){intj,c=0;for(j=0;jN;j++){if(need[i][j]work[j]){c++;}}if(c0)returnFALSE;elseif(c==0)returnTRUE;}//*******************系统安全性的检测******************intjudge(int**need,int*work,int**allocation,int*finish,int*p,int*ss,intm,intn){inti,j,k=0,count=0,flag=TRUE,mark=0,tag=0;while(flag==TRUE){flag=FALSE;for(i=0;im;i++){if(finish[i]==FALSE&&check(need,work,n,i)==TRUE){for(j=0;jn;j++)work[j]=work[j]+allocation[i][j];//进程请求成功,完成作业后回收allocation的资源finish[i]=TRUE;p[i]=TRUE;flag=TRUE;ss[tag++]=i;//存储进程,用于输出安全序列break;}}}//while(flag==TRUE)if(flag==FALSE){for(i=0;im;i++)if(finish[i]==FALSE){k++;}}if(k0){coutendl;cout检测结果:存在死锁进程!endl;coutendl;returnFALSE;}if(k==0){coutendl;cout检测结果:不存在死锁进程!endl;coutendl;cout输出安全序列为:;for(i=0;itag;i++)coutP[ss[i]];coutendl;getchar();coutendl;returnTRUE;}}//********************解锁***********************voidunlock(int**need,int*available,int*work,int**allocation,int*finish,int*p,int*ss,intm,intn){//统计死锁进程的资源数,找出最大的死锁进程,进行撤销int*sum=newint[m],i,j,k=0,count2=0,flag;int*temp=newint[n];//用于暂存work数组里的值,间接调用request函数for(i=0;in;i++)temp[i]=work[i];for(i=0;im;i++){if(finish[i]==FALSE){for(j=0;jn;j++)sum[i]=sum[i]+allocation[i][j];//寻找占用资源最多的进程}}count2=sum[0];for(i=0;im;i++){if(sum[i]count2){count2=sum[i];k=i;//k标记的数组位置即为已分配资源最多的进程}}cout撤销占用资源最大的进程P[k]endl;for(i=0;in;i++){work[i]=work[i]+allocation[k][i];}finish[k]=TRUE;//完成对该进程的操作p[k]=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++){allocation[number][i]=allocation[number][i]-available[i]+temp[i];need[number][i]=need[number][i]+available[i]-temp[i];}//恢复请求进程原始的资源分配finish[k]=FALSE;//初始化对该进程的操作p[k]=TRUE;//初始化对该进程进行判断num++;//恢复撤销进程之前的情况for(j=0;jn;j++)work[j]=av
本文标题:死锁的检测与解除
链接地址:https://www.777doc.com/doc-2364632 .html