死锁实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验二报告
一.实验名称:死锁的检测与解除
二.实验目的:观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。三.实验内容:
死锁的检测算法:
1.找出不再申请资源的进程,将它们所占的资源与系统中还剩余的资源加在一起作为“可分配的资源”,同时对这些进程置标志;
2.检测所有无标志的进程,找出一个所需资源量不超过“可分配的资源”量的进程,将其所占用的资源添加到“可分配的资源”中,同时为该进程置标志;重复2)直到所有进程均有标志或无标志的进程的所需资源量均超过“可分配的资源”量;
3.若进程均有标志,说明系统当前不存在死锁;若存在无标志的进程,则表示系统当前已有死锁形成,这些无标志的进程就是一组处于死锁状态的进程。
死锁的解除:
当死锁检测程序检测到有死锁存在时,一般采用两种方式来解除死锁:
1.终止进程:终止一个或多个涉及死锁的进程的执行,收回它们所占的资源再分配。
2.抢夺资源:从涉及死锁的一个或几个进程中抢夺资源,把夺来的资源再分配给卷入死锁的其他进程,直到死锁解除。
四.实验代码:
#include
using namespace std;
#define mp 50 //最大进程数
#define mr 100 /最大资源数
int keyong[mr]; //可用资源数组
int MAX[mp][mr]; //最大需求矩阵
int fenpei[mp][mr]; //分配矩阵
int need[mp][mr]; //剩余需求矩阵
bool FINISH[mp]; //系统是否有足够资源分配int p[mp]; //记录序列
int Work[mr]; //工作数组
int m,n; //m个进程,n个资源
int l=0;
void Init(); //初始化
bool Safe();
void jc();
void main()
{ Init();
Safe();
if(l!=m)
jc();}
void Init() //初始化算法
{ int i,j;
cout<<"请输入进程的数目:";
cin>>m;
cout<<"请输入资源的种类:";
cin>>n;
cout<<"请输入每个进程最多所需的各资源数,按照"< for(i=0;i for(j=0;j cin>>MAX[i][j]; cout<<"请输入每个进程已分配的各资源数,也按照"< for(i=0;i { for(j=0;j { cin>>fenpei[i][j]; need[i][j]=MAX[i][j]-fenpei[i][j]; if(need[i][j]<0) { cout<<"您输入的第"< continue; } } } cout<<"请输入各个资源现有的数目:"< for(i=0;i { cin>>keyong[i]; } cout<<"剩余需求矩阵:"< for(i=0;i for(j=0;j { cout< if(j==n-1) cout< } cout<<"各资源现有数量:"< for(i=0;i cout< cout< } bool Safe() /*安全性算法*/ { int i,j,k; for(i=0;i Work[i]=keyong[i]; for(i=0;i { FINISH[i]=false; //判断进程i是否已执行 } for(i=0;i { if(FINISH[i]==true) { continue; } else { for(j=0;j { if(need[i][j]>Work[j]) { break; } } if(j==n) { FINISH[i]=true; for(k=0;k { Work[k]+=fenpei[i][k]; //进程i执行完后回收资源} p[l++]=i; i=-1; } else { continue; } } if(l==m) { cout<<"系统是安全的"< cout<<"安全序列:"< for(i=0;i { cout< if(i!=l-1) { cout<<"-->"; } } cout<<""< return true; } } cout<<"会发生死锁,发生死锁的进程是:"< for(i=0;i if(FINISH[i]==false) cout< cout< return false; } void jc() { int i,j,k,q; i=0; while(i for(j=0;j { keyong[j]+=fenpei[i][j]; //回收 fenpei[i][j]=0; } if(Safe()) cout<<"死锁已解除"< else i++; Safe(); } }