操作系统实验报告-死锁的检测与解除

合集下载

死锁进程实验报告

死锁进程实验报告

死锁进程实验报告一、实验目的:观察死锁发生的现象,了解死锁发生的原因。

掌握如何判断死锁发生的方法。

二、实验分析:死锁现象是操作系统各个进程竞争系统中有限的资源引起的。

如果随机给进程分配资源,就可能发生死锁,因此就应有办法检测死锁的发生。

本次实验中采用“银行家算法”判断死锁的发生。

三、实验设计:本实验设计一个3个并发进程共享3种系统资源且每种系统资源有10个的系统。

系统能显示各种进程的进展情况以及检察是否有错误和死锁现象产生。

四、算法说明:“银行家算法”。

按每个进程的申请数量给各个进程试探性分配资源,看能否找个一个序列使各个进程都能正常运行结束。

若能,则不会发生死锁;若不能,则会发生死锁。

五、程序使用说明:一、本程序用于检测错误和是否会发生死锁。

系统有3个进程竞争3种系统资源,每种资源有10个。

二、输入各个进程的最大需求资源数目数组max[3]和已经得到的资源数目组[3],系统计算出各个进程还应申请的资源数目数组need[3]。

三、若进程最大需求数大于系统资源数(10),则出错;若进程申请的资源数目大于其需要的最大资源数目,则出错。

/*死锁实验源程序*/include<math.h>include<stdio.h>typedef struct{int state;int max[3];int alloc[3];int need[3];}Pc;int whefinish(Pc *p){if((p[0].state&&p[1].state&&p[2].state)==1) return 1;else return 0;}inpalloc(Pc *P,int *q1,int *q2){int m,n;for(m=0;m<3;m++)for(n=0;n<3;n++){scanf("%d",&p[m].alloc[n])p[m].need[n]=p[m].max[n]-p[m].alloc[n];q1[n]=q1[n]-p[m].alloc[n];if(p[m].need[n]>p[m].max[n])q2[n]=0;}Prlcess(Pcb *p1,int *p2,int *q){if(p1->need[0]<p2[0]&&p1->need[1]<p2[1]&&p1->need[2]<p2[2]) {P->state=0;p2[0]+=P->alloc[0];p2[1]+=p->alloc[1];p2[2]+=p->alloc[2];*p=3;}}main(){int i,j,n,x=0;int state[3],avil[3]={10,10,10}Pc pcb[3];for(i=0;i<3;i++)for(j=0;j<3;j++){scanf("%d",Pcb[i].max[j];if(Pcb[i].max[j]>10)state[i]=0;}if((state[0]&&state[1]&&state[2])==0) printf("error!\n");else{inpalloc(&Pcb,&avil[3],&state[3]);if((state[0]&&state[1]&&state[2])==0) printf("Error!\n");else{for(i=0;i<3;i++)for(j=0;j<3;j++)Process(&Pcb[j],&avil,&j);if(whefinish(&Pcb)==1)printf("all Pcbs are finishde!\n");else printf("Deally-Embrace!\n");}}}六、实验心得:通过这次实验使我对死锁的概念,死锁产生的原因,死锁是否会产生的判断算法,银行家算法,都有了更为深入和直观的了解以及掌握。

操作系统银行家解决死锁问题

操作系统银行家解决死锁问题

操作系统银⾏家解决死锁问题银⾏家算法解决死锁⼀、实验⽬的死锁会引起计算机⼯作僵死,因此操作系统中必须防⽌。

本实验的⽬的在于了解死锁产⽣的条件和原因,并采⽤银⾏家算法有效地防⽌死锁的发⽣。

⼆、实验设计思路设Request i 是进程Pi 的请求向量。

Request i (j)=k表⽰进程Pi请求分配Rj类资源k个。

当Pi发出资源请求后,系统按下述步骤进⾏检查:1、如果Request i ≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最⼤需求量。

2、如果Request i ≤Available,则转向步骤3;否则,表⽰系统中尚⽆⾜够的资源满⾜Pi的申请,Pi必须等待。

3、系统试探性地把资源分配给进程Pi,并修改下⾯数据结构中的数值:Available = Available - Request iAllocation i= Allocation i+ Request iNeed i= Need i - Request i4、系统执⾏安全性算法,检查此次资源分配后,系统是否处于安全状态。

如果安全才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

三、运⾏结果1、在程序运⾏中,程序中已经输⼊初值:int MaxAvailable[m]={10,5,7}; //每类资源的个数int Max[n][m]={1,5,3,3,2,4,1,0,2,2,2,2,0,3,2};// 每个进程需要的每类资源最⼤需求个数int Allocation[n][m]={0,1,0,1,0,0,3,0,2,2,1,1,0,0,2};// 已分配给每个进程的每类资源个数int Available[m];int Need[n][m]; //每个进程还需要的每类资源数经过银⾏家算法和安全性算法,输出运⾏成功的进程号。

2、在调整输⼊初值后:int MaxAvailable[m]={10,5,7};int Max[n][m]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,9};int Allocation[n][m]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};int Available[m];int Need[n][m];运⾏结果为三、源代码:#includeusing namespace std;const int m=3; //资源类数const int n=5; //进程个数int MaxAvailable[m]={10,5,7}; //每类资源的个数int Max[n][m]={1,5,3,3,2,4,1,0,2,2,2,2,0,3,2};// 每个进程需要的每类资源最⼤需求个数int Allocation[n][m]={0,1,0,1,0,0,3,0,2,2,1,1,0,0,2};// 已分配给每个进程的每类资源个数int Available[m];int Need[n][m]; //每个进程还需要的每类资源数struct Request{int p; //进程int k[m]; //请求资源};bool safe() //安全性算法,判断是否安全{int Work[m]; //系统可分配资源for(int i=0;i{Work[i]=Available[i];}bool Finish[n]; //运⾏结束否for(i=0;iFinish[i]=false;for(int iy=0;iy{for(i=0;i{if(!Finish[i]){for(int j=0;j{if(Need[i][j]>Work[j]) //需求⼤于系统资源数,跳出{break;}}if(j==m) //m个资源都满⾜所需for(int ix=0;ix{Work[ix]+=Allocation[i][ix];}Finish[i]=true;cout<< "[ " < ";break;}}}}for(i=0;i{if(!Finish[i])break;}if(i{cout<< "危险" <return false;}elsereturn true;}void bank(Request r) //银⾏家算法{int i;int j;for(i=0;ifor(j=0;j{Need[i][j]=Max[i][j]-Allocation[i][j];} //进程需求资源矩阵for(i=0;i {Available[i]=MaxAvailable[i];}for(i=0;ifor(j=0;j{Available[j]-=Allocation[i][j];}for(i=0;iif(r.k[i]>Need[r.p][i]) //如果请求>所需,跳出{break;}}if(i{cout<< "Your request over need! " <exit(1);}else{for(i=0;i{if(r.k[i]> Available[i]) //请求>可以使⽤的break;}if(i{cout<< "Process[ " <else //尝试分配{for(i=0;i{Available[i]-=r.k[i];Allocation[r.p][i]+=r.k[i];Need[r.p][i]-=r.k[i];}if(!safe()) //判断分配是否安全,如果不安全,撤销分配{for(i=0;i{Available[i]+=r.k[i];Allocation[r.p][i]-=r.k[i];Need[r.p][i]+=r.k[i];}cout<< "系统处于不安全状态" <}else //如果安全,分配成功}}}void main(){Request r;r.p=1; //默认资源标记为1int request[m]={1,0,2}; //默认请求资源for(int i=0;i{r.k[i]=request[i];}bank(r);}。

死锁实验报告

死锁实验报告

死锁实验报告死锁实验报告引言:在计算机科学领域,死锁是一种常见的问题,它指的是多个进程或线程因争夺资源而陷入无限等待的状态。

为了深入了解死锁的原因和解决方法,我们进行了一项死锁实验。

本报告将详细介绍实验的目的、方法、结果和讨论。

实验目的:本次实验的目的是通过模拟多个进程之间的资源竞争,观察死锁的发生情况,并分析其原因。

通过实验,我们希望能够更好地理解死锁的概念和特性,并探索解决死锁问题的方法。

实验方法:为了模拟死锁的发生,我们设计了一个简单的场景。

假设有两个进程A和B,它们分别需要两个资源X和Y来完成任务。

进程A首先请求资源X,然后请求资源Y;而进程B则相反,首先请求资源Y,然后请求资源X。

这样,当两个进程同时运行时,它们会互相等待对方释放资源,从而导致死锁的发生。

实验结果:在实验过程中,我们使用了一个模拟器来模拟进程的执行和资源的分配情况。

经过多次运行实验,我们观察到死锁的发生。

当进程A和进程B同时运行时,它们会互相等待对方释放资源,最终导致两个进程都无法继续执行下去,形成死锁状态。

讨论:通过对实验结果的观察和分析,我们可以得出以下结论和讨论。

1. 死锁的原因:死锁的发生是因为两个进程互相等待对方释放资源,形成了一个循环等待的情况。

这种情况下,无论是进程A还是进程B都无法继续执行下去,导致了死锁的发生。

2. 死锁的必要条件:根据实验结果和理论知识,我们知道死锁发生的必要条件包括互斥、占有和等待。

在实验中,资源X和资源Y的互斥性导致了互斥条件的满足;进程A和进程B分别占有资源X和资源Y,满足了占有条件;而它们互相等待对方释放资源,满足了等待条件。

因此,死锁的必要条件在实验中得到了满足。

3. 解决死锁的方法:针对死锁问题,我们可以采取多种方法来解决。

例如,我们可以引入资源的预分配和剥夺机制,以避免进程无限等待资源。

另外,我们还可以采用资源的有序分配策略,通过对资源的合理排序来避免死锁的发生。

此外,还可以使用死锁检测和死锁恢复算法来及时发现和解决死锁问题。

操作系统实验3_死锁

操作系统实验3_死锁

实验三死锁一、实验内容模拟实现资源分配。

二、实验目的多个进程动态地共享系统的资源可能会产生死锁现象。

死锁的产生,必须同时满足四个条件,第一个是互斥条件,即一个资源每次只能由一个进程占用;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其它资源;第三个是非出让条件,任何一个进程不能抢占另一个进程已经获得且未释放的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。

防止死锁的机构只须确保上述四个条件之一不出现,则系统就不会发生死锁。

在实验中假定系统中任一资源在每一时刻只能则由一个进程使用,任何进程不能抢占它进程正在使用的资源,当进程得不到资源时必须等待。

因此只要资源分配策略能保证进程不出现循环等待,则系统就不会发生死锁。

本实验要求学生编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。

三、实验题目本实验中共有两个实验题。

第一题:用银行家算法实现资源分配。

要求:(1) 设计一个3个并发进程共享10个同类资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。

(2) 设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。

(3) 确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。

[提示]:(1) 银行家算法,顾名思义是来源于银行的借贷业务,一定数量的本金要应付多个客户的借贷周转,为了防止银行因资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。

在操作系统中研究资源分配策略时也有类似的问题,系统中有限的资源要供多个进程使用,必须保证得到资源的进程能在有限的时间内归还资源,以供它进程使用资源。

如果资源分配不得当就会发生进程循环等待资源,各进程都无法继续执行下去的死锁现象。

死锁实验报告

死锁实验报告

操作系统实验报告——死锁的检测与解除计科101班张昊翔1007300204一.实验目的掌握操作系统的进程管理与资源分配原理,掌握对操作系统安全性检验和死锁的解除的原理和方法。

二.实验原理死锁(Deadlocking)是在多用户或多进程状况下,为使用同一资源而产生的无法解决的争用状态,通俗地讲,就是两个用户各占用一个资源,两人都想使用对方的资源,但同时又不愿放弃自己的资源,就一直等待对方放弃资源,如果不进行外部干涉,就将一直耗下去。

死锁会造成资源的大量浪费,甚至会使系统崩溃。

在SQL Server 中解决死锁的原则是“牺牲一个比两个都死强”,即挑出一个进程作为牺牲者,将其事务回滚,并向执行此进程的程序发送编号为1205 的错误信息。

而防止死锁的途径就是不能让满足死锁条件的情况发生,为此,用户需要遵循以下原则:尽量避免并发地执行涉及到修改数据的语句;要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行;预先规定一个封锁顺序所有的事务,都必须按这个顺序对数据执行封锁,例如,不同的过程在事务内部对对象的更新执行顺序应尽量保持一致;每个事务的执行时间不可太长,对程序段长的事务可考虑将其分割为几个事务三.设计思路1.输入系统进程数量n和资源类型数量m。

2.输入每类资源的数量。

3.输入每个进程每类资源的最大需求量和已获资源量。

4.检验系统的安全系。

5.若检测结果为系统不安全,可以对死锁进行解除,直到安全为止,再检测。

6.重复5操作,直到所有进程运行完毕。

四.主要功能模块int Max[100][100]={0}; //各进程所需各类资源的最大需求;int Available[100]={0}; //系统可用资源;char Name[100]={0}; //资源的名称;int Allocation[100][100]={0}; //系统已分配资源;int Need[100][100]={0}; //还需要资源int Request[100]={0}; //请求资源向量;int Temp[100]={0}; //存放安全序列;int Work[100]={0}; //存放系统可提供资源;bool Finish[100]={0};//存放已完成的序列五.程序流程图通六.源代码// Deadlock.cpp : 定义控制台应用程序的入口点。

操作系统-死锁的检测与解除

操作系统-死锁的检测与解除

操作系统-死锁的检测与解除操作系统死锁的检测与解除在计算机操作系统中,死锁是一个令人头疼但又十分重要的问题。

当多个进程或线程在竞争资源时,如果它们陷入一种僵持状态,互相等待对方释放资源,导致谁也无法继续前进,这就形成了死锁。

想象一下,这就好比一群人在一个狭窄的门口,每个人都想出去,但又都堵在门口,谁也走不了。

要理解死锁,首先得明白资源的概念。

资源可以是硬件设备,比如打印机、扫描仪;也可以是软件资源,比如数据库中的数据、内存空间等。

当一个进程需要使用某个资源时,它会向系统提出请求。

如果此时资源可用,系统就会把资源分配给这个进程;如果资源不可用,进程就会进入等待状态。

那么,死锁是怎么产生的呢?一般来说,死锁的产生需要四个必要条件同时满足:互斥使用、不可剥夺、请求和保持、循环等待。

互斥使用是指资源在同一时间只能被一个进程使用,比如打印机在打印一份文件时,其他进程就不能使用它。

不可剥夺是指进程已经获得的资源在未使用完之前不能被强行剥夺。

请求和保持是指进程在保持已经获得的资源的同时,还可以请求新的资源。

循环等待则是指存在一个进程资源的循环等待链,比如进程 P1 等待进程 P2 占用的资源,P2 等待 P3 占用的资源,P3 又等待 P1 占用的资源。

当死锁发生时,系统的性能会急剧下降,甚至完全瘫痪。

因此,及时检测死锁并采取措施解除死锁就显得尤为重要。

死锁的检测方法有多种,其中一种常见的方法是资源分配图法。

资源分配图是一个有向图,其中节点表示进程和资源,有向边表示进程对资源的请求和分配关系。

通过分析资源分配图,如果发现存在环路,并且环路上的每个进程都在等待被环路上的其他进程占用的资源,那么就可以判断系统发生了死锁。

除了资源分配图法,还有一些其他的检测算法。

比如银行家算法,它通过模拟资源分配的过程来判断是否会发生死锁。

银行家算法需要事先知道系统中资源的总量、每个进程对各类资源的最大需求以及已经分配给每个进程的资源数量。

操作系统死锁实验报告

(4)给出某个进程的资源分配请求,按死锁避免方法检测可否将资源分配给它?若可,输出一个进程安全序列和资源分配成功的说明;若否,输出“资源分配失败”和失败的原因:①,申请量大于系统的当前剩余量,②,申请量大于自己的剩余需求量,③,若分配系统将处于不安全状态。
程序结构如下:
当进程pi提出资源申请时,系统执行1)若Request[i]≤Need[i],转2);否则错误返回。2)若Request[i]≤Available,转3);否则进程等待。3)假设系统分配了资源,则有:
printf("%d",Need[i][j]); printf("\n");}share();}
分配成功分配失败
6.实验分析与体会
通过这次作业不仅使我对操作系统中银行家算法有了进一步的掌握,银行家算法是从当前状态出发,逐个按安全序列检查各客户中谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作的客户。如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。
与预防死锁的几种方法相比较,限制条件少,资源利用程度提高了。
由于要寻找一个安全序列,实际上增加了系统的开销。Banker algorithm最重要的一点是:保证操作系统的安全状态!这也是操作系统判断是否分配给一个进程资源的标准!
实验日期:2010年6月8日
教师评语
签名:年月日
2)若Finish[i]=False&&Need<=Work,则执行3);否则执行4)
3)进程P获得第i类资源,则顺利执行直至完成!并释放资源:
Work=Work+Allocation; Finish[i]=true;转2)
4) 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!

死锁的检测与解除

操作系统(实验报告)死锁的检测与解除姓名:*****学号:****专业班级:***学验日期:2011/12/2指导老师:***一、实验名称:死锁的检测和解除二、实验内容:编程实现对操作系统死锁的检测和解除,利用数据的动态输入,解锁时采用的是释放占用系统资源最大的进程的方法来实现。

三、实验目的:熟悉死锁检测与的解除的算法,深入理解死锁的检测与解锁的具体方法,加深对死锁问题深刻记意。

并且进一步掌握死锁的条件,死锁定理等相关知识。

四、实验过程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,则出现了死锁,开始采取解锁的方案。

操作系统实验报告七

操作系统实验报告七一、实验目的1、死锁如何发生,如何在我们的内核中引发死锁。

2、针对情况解决我们程序的死锁,以及了解更科学的死锁解决方式。

二、实验过程(一)死锁的出现首先编辑src/main.rs,在not_main()函数的空循环中调用print!宏:1、loop{}中print!宏与handle_uart0_rx_irq()中print!宏竞争检查src/interrupts.rs中的handle_uart0_rx_irq()函数,可以看到我们之前写了一个输入中断回调函数,在函数中调用了print!宏输出信息。

直接编译并运行,预期在输入时触发死锁。

不停地乱序敲击键盘,此时有概率出现卡死,按键无法再次输入内容,即触发死锁现象。

2、loop{}中print!宏与handle_timer_irq()中print!宏竞争检查src/interrupts.rs中的handle_timer_irq()函数,可以看到我们之前写了一个时间中断回调函数,在函数中调用了print!宏打点。

但它之前被我们注释掉了,因此我们取消注释:然后我们编译并运行,预期在打第一个点时会触发死锁。

(二)死锁的简单处理为了防止出现死锁,一个简单的办法是在使用锁时禁止中断。

但需要注意的是禁用中断会增加中断响应延迟,而中断响应延迟一个非常重要的性能指标。

所以只能在短时间内禁用中断。

1、编辑src/uart_console/mod.rs,引入asm!宏。

2、编辑src/uart_console/mod.rs中的_print()函数,在处理输入时先关闭中断,再打开。

三、测试及分析两种情况下,死锁均已消失四、心得体会在单进程系统中,死锁更多的发生于进程对某一资源的竞争现象。

例如我们在实验中中断等输出函数对uart硬件资源争夺。

而多进程中的死锁更多的发生于两个不同进程发生了相互调用或资源竞争,互相等待对方结束进程的情况。

这时候我们称系统产生了死锁或系统处于死锁状态。

死锁实验报告

死锁实验报告
摘要:
本实验旨在通过模拟死锁现象,了解死锁的形成原因、必要条件以及常见的预防和解决死锁的方法。

通过使用Java编程语言,实现了一个简单的死锁实验场景,并对死锁的产生和解决过程进行了探究。

引言:
死锁是多线程编程中一个常见的问题,也是一种非常棘手的并发bug。

在多线程环境下,当两个或多个线程相互等待对方释放资源时,便可能会陷入死循环,无法继续执行下去。

本实验将通过一个典型的死锁场景,展示死锁的产生和解决过程,以便更好地理解和应对死锁问题。

一、实验背景
1.1 死锁的定义
死锁是指在多线程编程中,两个或多个线程相互等待对方释放资源,从而导致所有线程都无法继续执行的一种状态。

1.2 死锁产生的必要条件
死锁产生的必要条件包括:互斥条件、请求和保持条件、不可
剥夺条件和循环等待条件。

1.3 死锁的影响
死锁的产生会导致程序无法正常执行,造成资源浪费和系统崩
溃等问题,严重影响系统的稳定性和性能。

二、实验目的
本实验旨在通过实际代码实现死锁场景,探究死锁的产生原因,了解死锁的必要条件,并尝试不同的方法进行死锁的解决和预防。

三、实验环境
本实验使用Java编程语言,在Java开发环境下进行实验。

四、实验步骤
4.1 实验准备
在Java编程环境下,创建一个简单的多线程程序,模拟死锁场景。

在程序中创建两个线程,并为每个线程分别分配一个资源。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
scanf("%d",&max[2][j]); } printf("\n"); printf("请输入进程 3 对 3 类资源的最大需求:");
for(j=0;j<3;j++) {
scanf("%d",&max[3][j]); } printf("\n"); printf("请输入进程 0 已分配的 3 类资源量:");
//各进程仍需要的资源情况
int request[3]={0,0,0};
//某进程
请求的资源情况
/***************输入初始的资源状况***************/ void input() {
int i=0,j=0; printf("\t\t\t\tA B C\n"); printf("请输入进程 0 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
设计思想:
该程序是在银行家算法的基础上添加了死锁的解除模块得来的, 死锁的解除采用的方法是:当系统发生死锁时,找到已分配资源最大 的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。
数据结构:
1) 可用资源向量 available: 这是一个含有 m 个元素的数组,其 中的每一个元素代表一类可利用资源数目。
for(j=0;j<3;j++) {
scanf("%d",&allocation[2][j]); } printf("\n"); printf("请输入进程 3 已分配的 3 类资源量:");
for(j=0;j<3;j++) {
scanf("%d",&allocation[3][j]); } printf("\n"); printf("请输入可利用的 3 类资源量:");
scanf("%d",&max[0][j]); } printf("\n"); printf("请输入进程 1 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
scanf("%d",&max[1][j]); } printf("\n"); printf("请输入进程 2 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
for(j=0;j<3;j++) {
scanf("%d",&allocation[0][j]); } printf("\n"); printf("请输入进程 1 已分配的 3 类资源量:");
for(j=0;j<3;j++) {
scanf("%d",&allocation[1][j]); } printf("\n"); printf("请输入进程 2 已分配的 3 类资源量:");
work[0]=available[0]; work[1]=available[1];
work[2]=available[2]; i=n; while(i<M) {
if(finish[i]==false&&need[i][0]<=work[0]&&need[i][1]<=wo rk[1]&&need[i][2]<=work[2])
printf("%d ",need[3][j]); } printf("\n"); } /***************给某进程分配资源***************/ void change(int n) { int j; for(j=0;j<N;j++) {
available[j]=available[j]-request[j]; allocation[n][j]=allocation[n][j]+request[j]; need[n][j]=need[n][j]-request[j]; } } /***************找出占用资源最多的进程***************/ int findmany() { int i=0,j=0,k=0,l=0; i=allocation[0][0]+allocation[0][1]; i+=allocation[0][2]; j=allocation[1][0]+allocation[1][1]; j+=allocation[1][2];
printf("%d ",need[2][j]); } printf("\n"); printf("进程 3:\t"); for(j=0;j<3;j++)
{ printf("%d ",max[3][j]);
} printf("\t"); for(j=0;j<3;j++) {
printf("%d ",allocation[3][j]); } printf("\t"); for(j=0;j<3;j++) {
选择进程并进行资源请求
请求是否合法

分配资源
是否死锁

解除占用资源最多的进程


输出进程序列以及该 时刻的资源分配情况
算法结束
运行结果:
无死锁:
有死锁:
有连续死锁:
实验代码:
#include<stdio.h>
#define M 4 //进程数 #define N 3 //资源种类数
int available[3]={0,0,0};
// 各进程
可利用的资源情况
int
max[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
//各进程最大需求的资源情况
int
allocation[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
//各进程已经分配的资源情况
int
need[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
else return 3;
} else {
if(k>=l) return 2;
else return 3;
} } else {
if(j>=k) {
if(j>=l) return 1;
else return 3;
} else {
if(k>=l) return 2;
else return 3;
} } } /***************找出需要资源最少的进程***************/ int findfew() { int i=0,j=0,k=0,l=0; i=need[0][0]+need[0][1]; i+=need[0][2]; j=need[1][0]+need[1][1]; j+=need[1][2]; k=need[2][0]+need[2][1]; k+=need[2][2]; l=need[3][0]+need[3][1]; l+=need[3][2]; if(i<=j) {
2) 最大需求矩阵 max ห้องสมุดไป่ตู้是一个 n m 的矩阵,定义了系统中 n 个进 程中得每一个进程对 m 类资源的最大需求。
3) 可分配矩阵 allocation: 这也一个 n m 的矩阵,定义了系统 中每一类资源当前已分配给每一进程的资源数。
4) 需求矩阵 need: 这表示每一个进程尚需的各类资源数。 5) need[i][j]=max[i][j]-allocation[i][j]。
{ work[0]+=allocation[i][0]; work[1]+=allocation[i][1]; work[2]+=allocation[i][2]; finish[i]=true; que[k]=i; k++; i=0;
} else
i++; } for(i=0;i<M;i++)
if(finish[i]==false) {
操作系统实验报告
实验题目:死锁的检测与解除 学生姓名:田凯飞 学生学号:1107300215 学生班级:计科 111 指导老师:霍林
实验题目:
死锁的检测与解除。
实验目的:
在实验一中我们可以通过银行家算法和安全性检测来对系统对 进程分配资源时进行安全性检测,这是避免系统发生死锁的有效方 法,但是假如系统真的发生死锁的时候,系统也必须对此采取有效的 措施,通过该实验我们可以深刻的认识系统对死锁的检测与解除的方 法。
printf("进程 1:\t"); for(j=0;j<3;j++) {
printf("%d ",max[1][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",allocation[1][j]); } printf("\t"); for(j=0;j<3;j++) {
相关文档
最新文档