死锁的检测与解除 (1)Word下载.doc
《死锁的检测与解除 (1)Word下载.doc》由会员分享,可在线阅读,更多相关《死锁的检测与解除 (1)Word下载.doc(11页珍藏版)》请在冰点文库上搜索。
把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)
不会发生死锁!
else{
死锁进程如下:
for(inti=0;
p[i])System.out.println(i+"
delock();
publicstaticvoidmain(String[]args)
//TODOAuto-generatedmethodstub
Scannerin=newScanner(System.in);
Deadlockdl=newDeadlock();
dl.Input();
dl.Output();
dl.operate();
请问还要继续玩么?
继续按Y,否则请按N?
Strings=in.nextLine();
if(s.equals("
Y"
))
flag=true;
elseif(s.equals("
N"
else
输入异常,被破停止!
System.exit(0);
}
7.实验小结:
通过对死锁的检测与解除的深入学习,我更加清晰的了解了死锁的运行机制,及产生死锁的必要条件,以及死锁会带来的种种问题,同时,我不光是认识到了问题的存在,也学会了用几种方法去解决死锁的问题,提高了我的逻辑思维的缜密性,为我今后在此方面能做的更细致思考打下了良好的基础,另一方面,也让我懂得了,要用学过的知识去联系实际问题,用所学的知识去分析,去解决现实中的问题,才能更加深入的学习,真正做到学以致用。