1、四、 实验过程1.基本思想:利用资源分配图来理解此问题,可以认为此图就是由一组结点N和一组边E所组成的一个对偶G=(N1E);把N分为互斥的两个子集进程P结点和资源R结点,进程结点集和资源结点集,凡是属于E中的一个边,都连接着P中的一个结点和R中的一个结点由P中的一个结点指向R中的一个结点是资源请求边,而由R中的一个结点指向P中的一个结点的边称为资源分配边,在这个图中找到一个既不阻塞又不独立的结点Pi,如果是在顺利的情况下,则该进程可以获得足够资源而继续运行,运行完释放所有资源,这就可以说是消除了它的请求边和分配边,让它成为一个孤立的点,再继续,分配给请求资源的进程这样循环下去直到所有的进程都
2、能成为孤立的点,或是出现了无法消除的环状,若是出现了环状,即出现了死锁,采取释放占用资源最多的进程的方法来解决问题,直到最后所有的进程结点P均成为孤立的点。解锁才算成功,程序才能结束。2.主要数据结构:(1)可利用资源向量Available.这是一个含有m类资源的数组,用来表示每种资源可用的的数量。(2)把不占用任何资源,且没有申请资源的进程,列入数组finish中,并赋值true。(3)从进程集合中找到一个Request=Work的进程,做如下的处理:将其资源分配图简化,释放出资源,增加Work的量,做Work=Work+Allocation并将它的标志位finish也设为true.(4)如
3、果不能把所有的进程标志位都赋值为true,则出现了死锁,开始采取解锁的方案。在此我选用的是释放占用资源最多的进程的方法,如果某个进程的Request=Work则可以做Work=Work+Allocation运算并将该进程标志位改成true。这样循环下去,若还不能解锁,则按上述方式再撤消一个进程,如此反复,直到死锁解除。3.输入输出每次开始运行程序,则要求用户开始输入进程的个数,资源源种类,可用资源量Available,及各个进程占有的各个资源的数量和请求数量,最后用循环将此时的状态输出,并判断是否有死锁,若有,则自动撤消进程解锁,若无,则直接输出无死锁的提示,并询问用户是否还要继续运行成序。4
4、. 程序流程图有死锁的情况5.截屏有死锁的情况:无死锁的情况6.源程序:package com.Deadlock;import java.util.*;public class Deadlockpublic int Available;public boolean p, L;int m, n, k=0 , c ;public static int count = 0;public int Work;public int Request;public int Allocation;boolean finish;public Deadlock()m = 15;n = 15;k=0 ;c=0 ;fi
5、nish=new boolean15;Available = new int15;p = new boolean15;L = new boolean15;/ public static int count = 0;Work = new int15;Request = new int1515;Allocation = new int1515;boolean compare(int index)boolean f = false;int t = 0;for (int i = 0; i Worki)t+;break;if (t = 0)f = true; elsef = false;return f
6、;void Input()Scanner sc = new Scanner(System.in);System.out.println(请输入进程数:);n = sc.nextInt();请输入资源的各类数:m = sc.nextInt();Available = new intm;Request = new intnm;Allocation = new intnm;请输入各资源可用的数量:Availablei = sc.nextInt();请输入各个进程占有的资源数量的的矩阵: n;for (int j = 0; j j+)Allocationij = sc.nextInt();请输入各进程
7、请求各资源的数量的矩阵:Requestij = sc.nextInt();for(int i=0;im;i+)Worki=Availablei;void Output()您输入 各资源的可用数量是:System.out.print(Availablei + System.out.println();各个进程占有的资源分别是System.out.print(P + (i + 1) + :System.out.print(Allocationij + System.out.println();各个进程请求各资源的数量分别是System.out.print(Requestij + boolean c
8、heck()int i,j,k=0;boolean ff=false;for(i=0;n;finishi=true;for(j=0;j0|Requestij0)finishi=false;boolean flag=true;while(flag)flag=false;for(i=0;if(!finishi&compare(i)for(j=0;Workj+=Allocationij;finishi=true;pi=false;flag=true;break;if(!flag)finishi)k+;if(k0)ff= false;else if(k=0)ff= true;return ff;voi
9、d delock()int i,j,flag=0;int sum=new intn;sumi=0;if(pi)for(j=0;sumi=sumi+Allocationij;/Allocationij=0;int max=sum0;for(i=1;if(maxsumi)max=sumi;flag=i;撤消占资源源最大的进程:+flag);for(j=0;Workj+=Allocationflagj;finishflag=true;pflag=false;if(check()System.out.println(成功解锁!else delock();void operate()boolean flag=check();if(flag)不会发生死锁!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1