死锁的检测与解除 (1)Word下载.doc

上传人:b****1 文档编号:13095322 上传时间:2022-10-04 格式:DOC 页数:11 大小:220.50KB
下载 相关 举报
死锁的检测与解除 (1)Word下载.doc_第1页
第1页 / 共11页
死锁的检测与解除 (1)Word下载.doc_第2页
第2页 / 共11页
死锁的检测与解除 (1)Word下载.doc_第3页
第3页 / 共11页
死锁的检测与解除 (1)Word下载.doc_第4页
第4页 / 共11页
死锁的检测与解除 (1)Word下载.doc_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

死锁的检测与解除 (1)Word下载.doc

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

死锁的检测与解除 (1)Word下载.doc

四、实验过程

1.基本思想:

利用资源分配图来理解此问题,可以认为此图就是由一组结点N和一组边E所组成的一个对偶G=(N1E);

把N分为互斥的两个子集进程P结点和资源R结点,进程结点集和资源结点集,凡是属于E中的一个边,都连接着P中的一个结点和R中的一个结点由P中的一个结点指向R中的一个结点是资源请求边,而由R中的一个结点指向P中的一个结点的边称为资源分配边,在这个图中找到一个既不阻塞又不独立的结点Pi,如果是在顺利的情况下,则该进程可以获得足够资源而继续运行,运行完释放所有资源,这就可以说是消除了它的请求边和分配边,让它成为一个孤立的点,再继续,分配给请求资源的进程……这样循环下去直到所有的进程都能成为孤立的点,或是出现了无法消除的环状,若是出现了环状,即出现了死锁,采取释放占用资源最多的进程的方法来解决问题,直到最后所有的进程结点P均成为孤立的点。

解锁才算成功,程序才能结束。

2.主要数据结构:

(1)可利用资源向量Available.这是一个含有m类资源的数组,用来表示每种资源可用的的数量。

(2)把不占用任何资源,且没有申请资源的进程,列入数组finish中,并赋值true。

(3)从进程集合中找到一个Request<

=Work的进程,做如下的处理:

将其资源分配图简化,释放出资源,增加Work的量,做Work=Work+Allocation

并将它的标志位finish也设为true.

(4)如果不能把所有的进程标志位都赋值为true,则出现了死锁,开始采取解锁的方案。

在此我选用的是释放占用资源最多的进程的方法,如果某个进程的Request<

=Work则可以做Work=Work+Allocation运算并将该进程标志位改成true。

这样循环下去,若还不能解锁,则按上述方式再撤消一个进程,如此反复,直到死锁解除。

3.输入输出

每次开始运行程序,则要求用户开始输入进程的个数,资源源种类,可用资源量Available,及各个进程占有的各个资源的数量和请求数量,最后用循环将此时的状态输出,并判断是否有死锁,若有,则自动撤消进程解锁,若无,则直接输出无死锁的提示,并询问用户是否还要继续运行成序。

4.程序流程图

有死锁的情况

5.截屏

有死锁的情况:

无死锁的情况

6.源程序:

packagecom.Deadlock;

importjava.util.*;

publicclassDeadlock

{

publicintAvailable[];

publicbooleanp[],L[];

intm,n,k=0,c;

publicstaticintcount=0;

publicintWork[];

publicintRequest[][];

publicintAllocation[][];

booleanfinish[];

publicDeadlock()

{

m=15;

n=15;

k=0;

c=0;

finish=newboolean[15];

Available=newint[15];

p=newboolean[15];

L=newboolean[15];

//publicstaticintcount=0;

Work=newint[15];

Request=newint[15][15];

Allocation=newint[15][15];

}

booleancompare(intindex)

{

booleanf=false;

intt=0;

for(inti=0;

i<

m;

i++)

{

if(Request[index][i]>

Work[i])

{

t++;

break;

}

}

if(t==0)

f=true;

}else

f=false;

returnf;

voidInput()

Scannersc=newScanner(System.in);

System.out.println("

请输入进程数:

"

);

n=sc.nextInt();

请输入资源的各类数:

m=sc.nextInt();

Available=newint[m];

Request=newint[n][m];

Allocation=newint[n][m];

请输入各资源可用的数量:

Available[i]=sc.nextInt();

请输入各个进程占有的资源数量的<

+n+"

*"

+m+"

>

的矩阵:

n;

for(intj=0;

j<

j++)

Allocation[i][j]=sc.nextInt();

请输入各进程请求各资源的数量<

的矩阵:

Request[i][j]=sc.nextInt();

for(inti=0;

i<

m;

i++)

Work[i]=Available[i];

voidOutput()

您输入各资源的可用数量是:

System.out.print(Available[i]+"

"

System.out.println();

各个进程占有的资源分别是<

System.out.print("

P"

+(i+1)+"

:

System.out.print(Allocation[i][j]+"

System.out.println();

各个进程请求各资源的数量分别是<

System.out.print(Request[i][j]+"

booleancheck()

inti,j,k=0;

booleanff=false;

for(i=0;

n;

finish[i]=true;

for(j=0;

j<

j++)

if(Allocation[i][j]>

0||Request[i][j]>

0)

finish[i]=false;

booleanflag=true;

while(flag)

flag=false;

for(i=0;

if(!

finish[i]&

&

compare(i))

{

for(j=0;

{

Work[j]+=Allocation[i][j];

}

finish[i]=true;

p[i]=false;

flag=true;

break;

}

if(!

flag)

finish[i])

k++;

if(k>

0)ff=false;

elseif(k==0)

ff=true;

returnff;

voiddelock()

inti,j,flag=0;

int[]sum=newint[n];

sum[i]=0;

if(p[i])

for(j=0;

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

//Allocation[i][j]=0;

intmax=sum[0];

for(i=1;

if(max<

sum[i])

max=sum[i];

flag=i;

撤消占资源源最大的进程:

+flag);

for(j=0;

Work[j]+=Allocation[flag][j];

finish[flag]=true;

p[flag]=false;

if(check())

System.out.println("

成功解锁!

else{

delock();

voidoperate()

booleanflag=check();

if(flag)

不会发生死锁!

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

当前位置:首页 > 党团工作 > 党团建设

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

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