1、实验二 死锁的检测与解除 一、 实验目的: 当系统为进程分配资源时,若未采取任何限制性措施,则系统必须提供检测和解除死锁的手段,为此,系统必须做到:( 1)保存有关资源的请求和分配信息;( 2)提供一种算法,以利用这些信息来检测系统是否已进入死锁状态。某一状态为死锁状态的充分条件是:当且仅当某一状态的资源分配图是不可完全简化的。通过该实验,可以充分理解死锁的检测与解除的基本原理。 二、 实验题目: 设计一个 m 个并发进程共享 n 个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动 态的分配资源。 要求用死锁检测算法检测当某一进程提出资源分配请求时,系统会不会陷入死锁状态;如
2、若陷入死锁状态要求用某种算法解除死锁 三实验源程序文件名 : sisuo .cpp 执行文件名 :sisuo.exe 四、实验分析 1)本实验采用死锁检测算法检测死锁,死锁检测的数据结构如下 ( 1)可利用资源向量 available,它表示了 n类资源中每一类资源的可用数目。 ( 2)把不占用资源的进程用 finishi=true 标示 ( 3)从进程集合中找到一个 requesti0|requestij0) Finish=false Judge() 开始 ( 3) check函数流程图 ( 4) 解锁函数流程图 3)源代码 #include 解锁函数 jiesuo()开始 初始化数组 su
3、mi=0 统计死锁进程资源sumi=sumi+allocationij;找出最大死锁进程 i workj+=allocationflagj;finishflag=TRUE; pflag=FALSE Flag=check() Flag=true 成功解除死锁 Flag=false 程序结束 Check()函数开始 while(flag=TRUE)反复判断 finishi=FALSE if(K0) return FALSE; if(K=0) return TRUE; #include #include using namespace std; /名字空间 #define TRUE 1 #defin
4、e FALSE 0 /布尔值 int compare(int *request,int *work,int N,int k) /如果 Requestiwork则返回 false int j,c=0; for(j=0;jworkj) c+; if(c0) return FALSE; else if(c=0) return TRUE; /判断 int check(int *work,int *request,int *allocation,int *finish,int *p,int m,int n) int i,j,flag=TRUE,K=0; while(flag=TRUE) /反复判断 ,直
5、到无法判断 flag=FALSE; for(i=0;i0) return FALSE; else if(K=0) return TRUE; /* /解锁函数 void jiesuo(int *work,int *request,int *allocation,int *finish,int *p,int m,int n) int i,j,t,flag; int *sum=new intm; for(i=0;im;coutn;coutavailablei; coutallocationij; coutmaxij; coutrequestij; cout0|requestij0) finishi=FALSE; for(j=0;jn;j+) workj=availablej; /初始情况 judge(work,request,allocation,finish,p,m,n); /开始判断 四、 调试结果: 以上显示为未发生死锁的调试结果 发生死锁,经解锁算法,撤销占资源最大进程,死锁状况成功解除 五、 心得体会: 通过该实验熟悉了指针的基本使用方法,死锁的检测与解除和银行家算法的数据结构基本相同,至于实验中所实施的死锁解除算法也只是简单撤销某一引起死锁进程所占有资源的简单释放,该实验只是简单模拟了死锁的检测与解除;最大的收获是对死锁定理的理解和对死锁解除算法的认识与实现机理实记。