操作系统之银行家算法检测死锁.docx

上传人:b****7 文档编号:10305899 上传时间:2023-02-10 格式:DOCX 页数:14 大小:247.78KB
下载 相关 举报
操作系统之银行家算法检测死锁.docx_第1页
第1页 / 共14页
操作系统之银行家算法检测死锁.docx_第2页
第2页 / 共14页
操作系统之银行家算法检测死锁.docx_第3页
第3页 / 共14页
操作系统之银行家算法检测死锁.docx_第4页
第4页 / 共14页
操作系统之银行家算法检测死锁.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

操作系统之银行家算法检测死锁.docx

《操作系统之银行家算法检测死锁.docx》由会员分享,可在线阅读,更多相关《操作系统之银行家算法检测死锁.docx(14页珍藏版)》请在冰豆网上搜索。

操作系统之银行家算法检测死锁.docx

操作系统之银行家算法检测死锁

操作系统实验

利用银行家算法避免死锁

实验报告

 

1、实验题目:

利用银行家算法避免死锁

2、实验内容:

编程实现银行家算法,要求能够输入资源数和作业数,输出进程的安全状况。

若进程安全,输出安全序列。

3、实验目的:

通过实验加强对银行家算法避免死锁的理解和掌握。

4、实验过程:

1、基本思想:

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。

详细如下:

设进程i提出请求Request[j],则银行家算法按如下规则进行判断。

(1)如果Request[i][j]<=Need[i][j],则转

(2);否则出错。

 

(2)如果Request[i][j]<=Available[j],则转(3);否则出错。

(3)系统试分配资源,修改相关数据:

Available[j]=Available[j]-Request[i][j];

Allocation[i][j]=Allocation[j]+Request[i][j];

(4)系统执行安全性检查,如安全,则分配成立;否则试分配作废,系统恢复原状,进程等待。

安全性检查算法

(1)设置两个工作向量Work=Available;Finish[i]=false 

(2)从进程集合中找到一个满足下述条件的进程,  Finish==false;  Need<=Work;  如找到,执行(3);否则,执行(4)  

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

  Work+=Allocation  Finish=true;  GOTOstep2  

(4)如所有的进程Finish=true,则表示安全;否则系统不安全。

2、主要数据结构:

(1)可利用资源向量Available。

定义为一个一元数组,Available[j]=K表示系统中有j类资源K个。

(2)最大需求Max。

定义为一个n*m的矩阵,Max[i][j]=K表示进程i需要j资源的最大数目为K个。

(3)分配矩阵Allocation。

定义为一个n*m的矩阵,Allocation[i][j]=K表示进程i已经得到j资源K个。

(4)需求矩阵Need。

定义为一个n*m的矩阵,Need[i][j]=K表示进程i还需要j资源K个来完成任务。

3、输入、输出:

(1)成功分配的例子:

输入资源数2(各3),进程数2,最大需求11,已分配01。

输出:

1110

MaxAllocationNeed

进程名ABABAB

0110110

1111001

(2)不安全,会出现死锁的:

输入资源数2(各2),进程数2,最大需求33,已分配00。

输出:

3300

MaxAllocationNeed

进程名ABABAB

0330033

1330033

没有安全序列

(3)若输入时已分配大于最大需求:

输入资源数1(5个资源),进程数1,Max=3,Allocation=5,则会产生提示,发生错误,申请的大于最大需求量。

需要重新输入。

4、

程序流程图

 

大于最大需求

小于最大需求

未通过

通过

 

5、实验结果截屏

6、源程序代码(共214行)

#include

#include

#include

#defineFalse0

#defineTrue1

usingnamespacestd;

intMax[100][100]={0};//各进程所需各类资源的最大需求;

intAvaliable[100]={0};//系统可用资源;

charname[100]={0};//资源的名称;

intAllocation[100][100]={0};//系统已分配资源;

intNeed[100][100]={0};//还需要资源

intRequest[100]={0};//请求资源向量;

inttemp[100]={0};//存放安全序列;

intWork[100]={0};//存放系统可提供资源;

intM=100;//作业的最大数

intN=100;//资源的最大数

voidshowdata()//显示资源矩阵

{

inti,j;

cout<<"系统可用资源[Available]:

"<

for(i=0;i

cout<

cout<

for(j=0;j

cout<

cout<

cout<<"MaxAllocationNeed"<

cout<<"进程名";

for(j=0;j<3;j++)//MAXALLOCATIONNEED共列

{

for(i=0;i

{

cout<

}

cout<<"";

}

cout<

for(i=0;i

cout<<""<

for(j=0;j

cout<

cout<<"";

for(j=0;j

cout<

cout<<"";

for(j=0;j

cout<

cout<

}

}

 

intchangedata(inti)//进行资源分配;

{

intj;

for(j=0;j

{

Avaliable[j]=Avaliable[j]-Request[j];

Allocation[i][j]=Allocation[i][j]+Request[j];

Need[i][j]=Need[i][j]-Request[j];

}

return1;

}

 

intsafe()//安全性算法

{

intk=0,m,apply,Finish[100]={0};

intj;

for(inti=0;i

{

Work[i]=Avaliable[i];

}

for(inti=0;i

{

apply=0;

for(intj=0;j

{

if(Finish[i]==False&&Need[i][j]<=Work[j]){

apply++;//经过验证之后apply会增加到和资源数相等

if(apply==N){

for(m=0;m

Work[m]=Work[m]+Allocation[i][m];//释放可用资源

Finish[i]=True;//置安全

temp[k]=i;//记录安全进程名

i=-1;//让i跳出资源层循环时回到初始状态

k++;//安全序列下标前进位

}

}

}

}

for(inti=0;i

if(Finish[i]==False){

cout<<"系统不安全;"<

return-1;

}

}

cout<<"系统是安全的!

"<

cout<<"分配的序列:

";

for(inti=0;i

cout<

if(i";

}

cout<

return0;

}

 

voidshare()//判定申请资源

{

charch;

inti=0,j=0;

ch='y';

cout<<"请输入要求分配的资源进程号(0-"<

";

cin>>i;//输入须申请的资源号;

cout<<"请输入进程"<

"<

for(intj=0;j

{

cout<

";

cin>>Request[j];//输入需要申请的资源数目;

}

for(intj=0;j

{

if(Request[j]>Need[i][j])

{

cout<<"进程"<

cout<<"不予分配!

"<

ch='n';

break;

}

else{

if(Request[j]>Avaliable[j])//申请是否大于当前资源

{

cout<<"进程"<

cout<<"不予分配!

"<

ch='n';

break;

}

}

}

if(ch=='y')

{

changedata(i);

showdata();

safe();

}

}

 

intmain(){

inti,j,number,m,n,flag;

intchoice=1;//选择或者、

charmc;//资源名称

cout<<"**************银行家算法开始***************"<

cout<<"输入系统可供资源种类的数量:

";

cin>>n;

N=n;

for(i=0;i

{

cout<<"资源"<

";

cin>>mc;

name[i]=mc;

cout<<"资源的数量:

";

cin>>number;

Avaliable[i]=number;

}//endfor

cout<

cout<<"请输入作业的数量:

";

cin>>m;

M=m;

cout<<"请输入各进程的最大需求量("<

"<

for(inti=0;i

for(intj=0;j

cin>>Max[i][j];

}

do{

flag=0;

cout<<"请输入各进程已经分配资源量("<

"<

for(inti=0;i

for(j=0;j

{

cin>>Allocation[i][j];

if(Allocation[i][j]>Max[i][j])

flag=1;

Need[i][j]=Max[i][j]-Allocation[i][j];

}

if(flag)

cout<<"首次输入的已分配资源已经大于最大需求量,请重新输入!

\n";

}while(flag);//当申请资源符合要求时,flag恒,enddo

showdata();//显示

safe();//安全检测

while(choice){

cout<<"**************银行家算法***************"<

cout<<"1:

分配资源"<

cout<<"2:

显示状态"<

cout<<"0:

离开"<

cout<<"*******************************************"<

cout<<"请选择功能号:

";

cin>>choice;

switch(choice){

case1:

share();break;

case2:

{cout<<"*******************************************"<

";showdata();break;}

case0:

choice=0;break;

default:

cout<<"请正确选择功能号(0,1,2)!

"<

}

}

return1;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

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

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