死锁实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

}

}

相关文档
最新文档