死锁的检测与解除Word下载.docx

上传人:b****6 文档编号:19029030 上传时间:2023-01-03 格式:DOCX 页数:22 大小:110.71KB
下载 相关 举报
死锁的检测与解除Word下载.docx_第1页
第1页 / 共22页
死锁的检测与解除Word下载.docx_第2页
第2页 / 共22页
死锁的检测与解除Word下载.docx_第3页
第3页 / 共22页
死锁的检测与解除Word下载.docx_第4页
第4页 / 共22页
死锁的检测与解除Word下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

死锁的检测与解除Word下载.docx

《死锁的检测与解除Word下载.docx》由会员分享,可在线阅读,更多相关《死锁的检测与解除Word下载.docx(22页珍藏版)》请在冰豆网上搜索。

死锁的检测与解除Word下载.docx

该程序是在银行家算法的基础上添加了死锁的解除模块得来的,死锁的解除采用的方法是:

找到已分配资源最大的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。

1)设

是进程

的请求向量,如果

,表示进程

需要

类型起源。

发出资源请求后,进行检查,如果合格,修改

的值。

2)用安全性算法检查是否存在安全序列,如果存在,输出安全序列;

如果不存在,即为死锁,进行解锁操作。

3)统计

的值,找出占用资源最多的进程

,将其撤销,回收占用的资源,修改一下的数据结构中的值:

用安全性算法进行检查,如果仍有死锁,重复步骤3,知道解锁为止。

4)输出安全序列。

程序主要包括四大模块,一是输入数据模块,二是资源请求模块,三是检测死锁模块,四是对死锁进行解除模块。

程序流程图如下:

四、程序清单及简单注释

//死锁的检测与解除.

#include<

iostream>

stdio.h>

iomanip>

#defineTRUE1

#defineFALSE0

usingnamespacestd;

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;

各个矩阵:

|max|allocation|need|available|"

Process|Rescource|"

;

for(i=0;

i<

4;

i++)

{

for(j=0;

j<

n;

j++)

cout<

["

]"

"

}

|"

-----------------------------------------------------------"

m;

P["

]"

{

cout<

max[i][j]<

}

allocation[i][j]<

need[i][j]<

if(mark==1)

for(j=0;

work[j]<

mark=0;

getchar();

return0;

}

//********输出解锁之后的资源分配情况***********

intoutput2(int**need,int**allocation,int*work,int*ss,int*finish,int*p,intm,intn)

{inti,j,mark=1,tag;

|need|allocation|work|wor+allocation|finish|"

num;

tag=ss[i];

P["

tag<

need[tag][j]<

allocation[tag][j]<

work[j]+allocation[tag][j]<

work[j]=work[j]+allocation[tag][j];

if(finish[tag]=1)

TRUE"

else

FALSE"

//*************输入所有相关的信息*************

intInput(int**max,int**need,int*work,int**allocation,int*available,int*request,intm,intn,intflag)

{

intj;

请输入请求资源的进程号:

cin>

>

number;

if(number>

=n)

returnFALSE;

else

进程P["

number<

]对["

]类资源的请求数为:

//输入请求向量request

cin>

request[j];

for(j=0;

if(request[j]>

need[number][j]||request[j]>

available[j])//判断请求向量的合法性

flag=FALSE;

returnflag;

//***********可用资源与需求矩阵的比较************

intcheck(int**need,int*work,intN,inti)

intj,c=0;

N;

if(need[i][j]>

work[j])

c++;

if(c>

0)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;

if(finish[i]==FALSE&

&

check(need,work,n,i)==TRUE)

for(j=0;

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)

if(finish[i]==FALSE)

{

k++;

}

if(k>

0)

检测结果:

存在死锁进程!

if(k==0)

{cout<

不存在死锁进程!

输出安全序列为:

tag;

ss[i]<

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函数

temp[i]=work[i];

if(finish[i]==FALSE)

sum[i]=sum[i]+allocation[i][j];

//寻找占用资源最多的进程

count2=sum[0];

if(sum[i]>

count2)

count2=sum[i];

k=i;

//k标记的数组位置即为已分配资源最多的进程

撤销占用资源最大的进程P["

k<

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)

成功解除死锁!

output2(need,allocation,work,ss,finish,p,m,n);

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++;

//恢复撤销进程之前的情况

work[j]=available[j];

//初始化work数组

cout<

getchar();

unlock(need,available,work,allocation,finish,p,ss,m,n);

//*******************主函数***************

voidmain()

inti,j,m,n,count=0,s=0;

intflag=FALSE;

charname;

endl<

\t\t\t\t死锁的检测与解除"

请输入进程数m:

num=m;

请输入资源数n:

int**max=newint*[m];

int**need=newint*[m];

int**allocation=newint*[m];

int*request=newint[n];

int*available=newint[n];

int*finish=newint[m];

int*p=newint[m];

int*work=newint[n];

int*ss=newint[m];

max[i]=newint[n];

need[i]=newint[n];

allocation[i]=newint[n];

请输入各个进程对各种资源的最大需求max:

j++)

{

进程P["

]对["

]类资源的最大需求为:

//输入max矩阵

cin>

max[i][j];

请输入已分配的矩阵allocation:

]已分配到的["

]类资源为:

//输入allocation矩阵

allocation[i][j];

if(allocation[i][j]>

max[i][j])

输入数据大于最多需求数,重新输入!

j--;

elseneed[i][j]=max[i][j]-allocation[i][j];

请输入可分配的资源available:

{

]类可分配的资源为:

//输入available向量

available[i];

work[i]=available[i];

finish[i]=FALSE;

//输入finsish向量

p[i]=FALSE;

output(max,need,work,allocation,m,n);

//输出目前的资源分配情况

i=0;

while(flag==FALSE&

n)//进程多次请求资源

{flag=TRUE;

work[j]=available[j];

ss[j]=0;

}//初始化缓存数组ss

finish[j]=FALSE;

p[j]=FALSE;

}//初始化各进程分配情况

flag=Input(max,need,work,allocation,available,request,m,n,flag);

available[j]=available[j]-request[j];

work[j]=available[j];

need[number][j]=need[number][j]-request[j];

allocation[number][j]=allocation[number][j]+request[j];

}//修改请求资源后的资源分配情况

输出此时的资源分配情况:

flag=judge(need,work,allocation,finish,p,ss,m,n);

if(flag==TRUE)

output2(need,allocation,work,ss,finish,p,m,n);

输出死锁的进程:

for(i=0;

if(finish[i]==FALSE)

cout<

是否要进行解锁!

解锁请输入'

Y'

,不解锁请输入'

N'

cin>

name;

if(name=='

unlock(need,available,work,allocation,finish,p,ss,m,n);

else

程序运行结束!

break;

}//else

flag=FALSE;

if(number<

n)

请求的资源数超过所拥有的资源数,进程P["

]等待!

不存在进程P["

]!

i++;

}//while(flag==FALSE&

五、实验结果

开始输入:

输入最大需求矩阵max:

输入已分配矩阵allocation:

输入可用资源向量available:

此时资源分配情况如下:

进程P[1]请求资源:

(请求成功)

(请求资源数超过可用资源)

进程P[2]请求资源:

(发生死锁)

检测到死锁产生,进行解锁:

如果一次解锁不成功,则继续剥夺下一个已分配资源最多的死锁进程的资源,直到死锁解除。

经检查,实验结果符合要求。

六、实验小结

通过这次实验,我对死锁的各方面理解都有了更深层次的认识。

一开始,对于死锁的解除,我只是从第一个进程开始剥夺其资源,也不管它是不是发生了死锁,一直剥夺到死锁解除为止。

然后,我又对程序进行改进,让其可以判断死锁进程与非死锁进程,然后从第一个死锁进程开始剥夺已分配资源。

到最后,我又对程序进一步完善,让其判断一下在死锁进程中,哪个的已分配资源最多,就先剥夺它的资源,直到死锁解除。

通过以上这几次对程序的改进,我不仅对死锁的解除有了更进一步的理解,也加深了对编程理念的认识。

一种好的编程习惯、编程理念不仅可以帮助减少工作量,更可以帮助编程人员对程序的思想进行全面理解,对程序需求进行全面理解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1