ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:110.71KB ,
资源ID:6033516      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6033516.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(死锁的检测与解除.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

死锁的检测与解除.docx

1、死锁的检测与解除死锁的检测与解除-操作系统实验报告题 目 : 死锁的检测与解除指导老师 : 班 级 : 姓 名 : 学 号 : 时 间 : 实验二 死锁的检测与解除一、实验目的系统为进程分配资源时并不一定能满足进程的需求,因此检测系统的安全性是非常有必要的。安全性的检测在之前的实验中用银行家算法得以实现,此次实验增加了另一个问题:即当系统死锁时如何解除死锁。通过此次实验,可以深刻的体会死锁的检测与解除的方法。二、实验内容编程实现死锁的检测与解除,并上机验证。实验环境:Microsoft Visual Studio 2010三、算法描述程序中的数据结构:1)可用资源向量: 这是一个含有个元素的数

2、组,其中的每一个元素代表一类可利用资源数目。2)最大需求矩阵: 它是一个的矩阵,定义了系统中n个进程中得每一个进程对类资源的最大需求。3)可分配矩阵: 这也一个的矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。4)需求矩阵: 这表示每一个进程尚需的各类资源数。5)综上所述:。该程序是在银行家算法的基础上添加了死锁的解除模块得来的,死锁的解除采用的方法是:找到已分配资源最大的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。1)设是进程的请求向量,如果,表示进程需要个类型起源。当发出资源请求后,进行检查,如果合格,修改、的值。2)用安全性算法检查是否存在安全序列,如果存在,输出安全序列

3、;如果不存在,即为死锁,进行解锁操作。3)统计的值,找出占用资源最多的进程,将其撤销,回收占用的资源,修改一下的数据结构中的值:;用安全性算法进行检查,如果仍有死锁,重复步骤3,知道解锁为止。4)输出安全序列。程序主要包括四大模块,一是输入数据模块,二是资源请求模块,三是检测死锁模块,四是对死锁进行解除模块。程序流程图如下:四、程序清单及简单注释/ 死锁的检测与解除.#include#include#include#define TRUE 1#define FALSE 0using namespace std;int number=0;/定义全局变量,number为请求资源的进程号int nu

4、m=0;/num为安全序列中进程的个数int Input();int output();/*输出未解锁之前的资源分配情况*int output(int *max,int *need,int *work,int *allocation,int m,int n) int i,j,mark=1; cout该时刻的资源分配情况如下:endl; coutendl; cout 各个矩阵:| max | allocation | need | available |endl; coutendl; coutProcess | Rescource | ; for(i=0;i4;i+) for(j=0;jn;j+

5、) coutj; cout ; cout| ; coutendl; coutendl; cout-endl; for(i=0;im;i+) cout Pi ; cout| ; for(j=0;jn;j+) coutmaxij ; cout| ; for(j=0;jn;j+) coutallocationij ; cout| ; for(j=0;jn;j+) coutneedij ; cout| ; if(mark=1) for(j=0;jn;j+) coutworkj ; cout| ; mark=0; coutendl; coutendl; getchar(); return 0;/*输出解

6、锁之后的资源分配情况*int output2(int *need,int *allocation,int *work,int *ss,int *finish,int *p,int m,int n) int i,j,mark=1,tag; cout该时刻的资源分配情况如下:endl; coutendl; cout 各个矩阵:| need | allocation | work | wor+allocation | finish |endl; coutendl; coutProcess | Rescource | ; for(i=0;i4;i+) for(j=0;jn;j+) coutj; cou

7、t ; cout| ; coutendl; coutendl; cout-endl; for(i=0;inum;i+) tag=ssi; coutPtag ; cout| ; for(j=0;jn;j+) coutneedtagj ; cout| ; for(j=0;jn;j+) coutallocationtagj ; cout| ; for(j=0;jn;j+) coutworkj ; cout| ; for(j=0;jn;j+) coutworkj+allocationtagj ; workj=workj+allocationtagj; cout| ; if(finishtag=1) c

8、outTRUE ; else coutFALSE ; cout| ; coutendl; getchar(); return 0;/*输入所有相关的信息*int Input(int *max,int *need,int *work,int *allocation,int *available,int *request,int m,int n,int flag) int j; coutnumber; cout=n) return FALSE; else for(j=0;jn;j+) cout进程Pnumber对jrequestj; coutendl; for(j=0;jneednumberj|r

9、equestjavailablej)/判断请求向量的合法性 flag=FALSE; return flag; /*可用资源与需求矩阵的比较*int check(int *need,int *work,int N,int i) int j,c=0; for(j=0;jworkj) c+; if(c0) return FALSE; else if(c=0) return TRUE;/*系统安全性的检测*int judge(int *need,int *work,int *allocation,int *finish,int *p,int *ss,int m,int n) int i,j,k=0,c

10、ount=0,flag=TRUE,mark=0,tag=0; while(flag=TRUE) flag=FALSE; for(i=0;im;i+) if(finishi=FALSE&check(need,work,n,i)=TRUE) for(j=0;jn;j+) workj=workj+allocationij;/进程请求成功,完成作业后回收allocation的资源 finishi=TRUE; pi=TRUE; flag=TRUE; sstag+=i;/存储进程,用于输出安全序列 break; /while(flag=TRUE) if(flag=FALSE) for(i=0;i0) co

11、utendl; cout检测结果:存在死锁进程!endl; coutendl; return FALSE; if(k=0) coutendl; cout检测结果:不存在死锁进程!endl; coutendl; cout输出安全序列为: ; for(i=0;itag;i+) coutPssi ; coutendl; getchar(); coutendl; return TRUE; /*解锁*void unlock(int *need,int *available,int *work,int *allocation,int *finish,int *p,int *ss,int m,int n)

12、/统计死锁进程的资源数,找出最大的死锁进程,进行撤销 int *sum=new intm,i,j,k=0,count2=0,flag; int *temp=new intn;/用于暂存work数组里的值,间接调用request函数 for(i=0;in;i+) tempi=worki; for(i=0;im;i+) if(finishi=FALSE) for(j=0;jn;j+) sumi=sumi+allocationij;/寻找占用资源最多的进程 count2=sum0; for(i=0;icount2) count2=sumi; k=i; /k标记的数组位置即为已分配资源最多的进程 co

13、ut撤销占用资源最大的进程Pkendl; for(i=0;in;i+) worki=worki+allocationki; finishk=TRUE;/完成对该进程的操作 pk=FALSE;/不再对该进程进行判断 num-; flag=judge(need,work,allocation,finish,p,ss,m,n);/再次进行判断是否存在安全序列 if(flag=TRUE) coutendl; cout成功解除死锁!endl; output2(need,allocation,work,ss,finish,p,m,n); for(i=0;in;i+) allocationnumberi=a

14、llocationnumberi-availablei+tempi; neednumberi=neednumberi+availablei-tempi; /恢复请求进程原始的资源分配 finishk=FALSE;/初始化对该进程的操作 pk=TRUE;/初始化对该进程进行判断 num+;/恢复撤销进程之前的情况 for(j=0;jn;j+) workj=availablej;/初始化work数组 coutendl; getchar(); else unlock(need,available,work,allocation,finish,p,ss,m,n);/*主函数*void main() i

15、nt i,j,m,n,count=0,s=0; int flag=FALSE; char name; coutendlendltttt死锁的检测与解除endlendl; coutm; num=m; coutendl; coutn; coutendl; int *max=new int *m; int *need=new int *m; int *allocation=new int *m; int *request=new intn; int *available=new intn; int *finish=new intm; int *p=new intm; int *work=new in

16、tn; int *ss=new intm; for(i=0;im;i+) maxi=new intn; needi=new intn; allocationi=new intn; cout请输入各个进程对各种资源的最大需求max:endl; coutendl; for(i=0;im;i+) for(j=0;jn;j+) cout进程 Pi 对jmaxij; coutendl; cout请输入已分配的矩阵allocation:endl; coutendl; for(i=0;im;i+) for(j=0;jn;j+) cout进程 Pi 已分配到的 jallocationij; if(alloca

17、tionijmaxij) coutendl; cout输入数据大于最多需求数,重新输入!endl; j-; else needij=maxij-allocationij; coutendl; cout请输入可分配的资源available:endl; coutendl; for(i=0;in;i+) coutiavailablei; worki=availablei; coutendl; for(i=0;im;i+) finishi=FALSE;/输入finsish向量 pi=FALSE; output(max,need,work,allocation,m,n);/输出目前的资源分配情况 cou

18、tendl; i=0; while(flag=FALSE&in)/进程多次请求资源 flag=TRUE; for(j=0;jn;j+) workj=availablej; for(j=0;jm;j+) ssj=0; /初始化缓存数组ss for(j=0;jm;j+) finishj=FALSE; pj=FALSE; /初始化各进程分配情况 flag=Input(max,need,work,allocation,available,request,m,n,flag); if(flag=TRUE) for(j=0;jn;j+) availablej=availablej-requestj; wor

19、kj=availablej; neednumberj=neednumberj-requestj; allocationnumberj=allocationnumberj+requestj; /修改请求资源后的资源分配情况 cout输出此时的资源分配情况:endl; coutendl; output(max,need,work,allocation,m,n); flag=judge(need,work,allocation,finish,p,ss,m,n); if(flag=TRUE) output2(need,allocation,work,ss,finish,p,m,n); else cou

20、t存在死锁进程!endl; coutendl; cout输出死锁的进程:; for(i=0;im;i+) if(finishi=FALSE) coutPi ; coutendl; coutname; coutendl; if(name=Y) unlock(need,available,work,allocation,finish,p,ss,m,n); else cout程序运行结束!endl; break; /else flag=FALSE; else coutendl; if(numbern) cout请求的资源数超过所拥有的资源数,进程Pnumber等待!endl; coutendl; e

21、lse cout不存在进程Pnumber!endl; i+; /while(flag=FALSE&in) getchar();五、实验结果开始输入:输入最大需求矩阵max:输入已分配矩阵allocation:输入可用资源向量available:此时资源分配情况如下:进程P1请求资源:(请求成功)进程P1请求资源:(请求资源数超过可用资源)进程P2请求资源:(发生死锁)检测到死锁产生,进行解锁:如果一次解锁不成功,则继续剥夺下一个已分配资源最多的死锁进程的资源,直到死锁解除。 经检查,实验结果符合要求。六、实验小结通过这次实验,我对死锁的各方面理解都有了更深层次的认识。一开始,对于死锁的解除,我只是从第一个进程开始剥夺其资源,也不管它是不是发生了死锁,一直剥夺到死锁解除为止。然后,我又对程序进行改进,让其可以判断死锁进程与非死锁进程,然后从第一个死锁进程开始剥夺已分配资源。到最后,我又对程序进一步完善,让其判断一下在死锁进程中,哪个的已分配资源最多,就先剥夺它的资源,直到死锁解除。通过以上这几次对程序的改进,我不仅对死锁的解除有了更进一步的理解,也加深了对编程理念的认识。一种好的编程习惯、编程理念不仅可以帮助减少工作量,更可以帮助编程人员对程序的思想进行全面理解,对程序需求进行全面理解。

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

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