银行家算法c语言流程图.docx

上传人:b****5 文档编号:3654492 上传时间:2022-11-24 格式:DOCX 页数:15 大小:233.26KB
下载 相关 举报
银行家算法c语言流程图.docx_第1页
第1页 / 共15页
银行家算法c语言流程图.docx_第2页
第2页 / 共15页
银行家算法c语言流程图.docx_第3页
第3页 / 共15页
银行家算法c语言流程图.docx_第4页
第4页 / 共15页
银行家算法c语言流程图.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

银行家算法c语言流程图.docx

《银行家算法c语言流程图.docx》由会员分享,可在线阅读,更多相关《银行家算法c语言流程图.docx(15页珍藏版)》请在冰豆网上搜索。

银行家算法c语言流程图.docx

银行家算法c语言流程图

一、实验目的

银行家算法是避免死锁的一种重要方法。

通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。

二、实验内容

根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。

三、实验方法

1.

算法流程图

 

2.算法数据结构

1)可利用资源向量Available,它是一个最多含有100个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。

其数值随该类资源的分配和回收而动态地改变。

如果Available(j)=k,标是系统中现有j类资源k个。

2)最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。

如果Max(i,j)=k,表示进程i需要j类资源的最大数目为k。

3)分配矩阵Allocation,这也是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。

如果Allocation(i,j)=k,表示进程i当前已经分到j类资源的数目为k。

Allocationi表示进程i的分配向量,有矩阵Allocation的第i行构成。

4)需求矩阵Need,这还是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。

如果Need(i,j)=k,表示进程i还需要j类资源k个,才能完成其任务。

Needi表示进程i的需求向量,由矩阵Need的第i行构成。

5)上述三个矩阵间存在关系:

Need(i,j)=Max(i,j)-Allocation(i,j);

3.银行家算法

设Request[i]是进程i的请求向量,如果Request[i,j]=K,表示进程i需要K个j类型的资源。

当i发出资源请求后,系统按下述步骤进行检查:

1)如果Requesti≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。

2)如果Requesti≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足i的申请,i必须等待。

3)系统试探性地把资源分配给进程i,并修改下面数据结构中的数值:

Available=Available-Requesti

Allocationi=Allocationi+Requesti

Needi=Needi-Requesti

4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

如果安全才正式将资源分配给进程i,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程i等待。

四、实验代码以及运行示例

1.源代码:

#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<<"系统目前可用的资源[Avaliable]:

"<

for(i=0;i

cout<

cout<

for(j=0;j

cout<

cout<

cout<<"MaxAllocationNeed"<

cout<<"进程名";

for(j=0;j<3;j++){

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<

}

}

intchangdata(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()//安全性算法

{

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

intj;

intflag=0;

Work[0]=Avaliable[0];

Work[1]=Avaliable[1];

Work[2]=Avaliable[2];

for(i=0;i

apply=0;

for(j=0;j

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

apply++;

if(apply==N){

for(m=0;m

Work[m]=Work[m]+Allocation[i][m];//变分配数

Finish[i]=True;

temp[k]=i;

i=-1;

k++;

flag++;

}

}

}

}

for(i=0;i

if(Finish[i]==False){

cout<<"系统不安全"<

return-1;

}

}

cout<<"系统是安全的!

"<

cout<<"分配的序列:

";

for(i=0;i

cout<

if(i";

}

cout<

return0;

}

voidshare()//利用银行家算法对申请资源对进行判定

{

charch;

inti=0,j=0;

ch='y';

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

";

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

cout<<"请输入进程"<

"<

for(j=0;j

{

cout<

";

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

}

for(j=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'){

changdata(i);//根据进程需求量变换资源

showdata();//根据进程需求量显示变换后的资源

safe();//根据进程需求量进行银行家算法判断

}

}

voidaddresources(){//添加资源

intn,flag;

cout<<"请输入需要添加资源种类的数量:

";

cin>>n;

flag=N;

N=N+n;

for(inti=0;i

cout<<"名称:

";

cin>>name[flag];

cout<<"数量:

";

cin>>Avaliable[flag++];

}

showdata();

safe();

}

voiddelresources(){//删除资源

charming;

inti,flag=1;

cout<<"请输入需要删除的资源名称:

";

do{

cin>>ming;

for(i=0;i

if(ming==name[i]){

flag=0;

break;

}

if(i==N)

cout<<"该资源名称不存在,请重新输入:

";

}

while(flag);

for(intj=i;j

{

name[j]=name[j+1];

Avaliable[j]=Avaliable[j+1];

}

N=N-1;

showdata();

safe();

}

voidchangeresources(){//修改资源函数

cout<<"系统目前可用的资源[Avaliable]:

"<

for(inti=0;i

cout<

"<

cout<<"输入系统可用资源[Avaliable]:

"<

cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2];

cout<<"经修改后的系统可用资源为"<

for(intk=0;k

cout<

"<

showdata();

safe();

}

voidaddprocess(){//添加作业

intflag=M;

M=M+1;

cout<<"请输入该作业的最大需求量[Max]"<

for(inti=0;i

cout<

";

cin>>Max[flag][i];

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

}

showdata();

safe();

}

intmain()//主函数

{

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

charming;

cout<<"\t---------------------------------------------------"<

cout<<"\t||||"<

cout<<"\t||银行家算法的实现||"<

cout<<"\t||||"<

cout<<"\t||08软工何丽茗||"<

cout<<"\t||||"<

cout<<"\t||20081344066||"<

cout<<"\t---------------------------------------------------"<

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

";

cin>>n;

N=n;

for(i=0;i

{

cout<<"资源"<

";

cin>>ming;

name[i]=ming;

cout<<"资源的数量:

";

cin>>number;

Avaliable[i]=number;

}

cout<

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

";

cin>>m;

M=m;

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

"<

for(i=0;i

for(j=0;j

cin>>Max[i][j];

do{

flag=0;

cout<<"请输入各进程已经申请的资源量("<

"<

for(i=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);

showdata();//显示各种资源

safe();//用银行家算法判定系统是否安全

while(choice)

{

cout<<"\t-------------------银行家算法演示------------------"<

cout<<"1:

增加资源"<

cout<<"2:

删除资源"<

cout<<"3:

修改资源"<

cout<<"4:

分配资源"<

cout<<"5:

增加作业"<

cout<<"0:

离开"<

cout<<"\t---------------------------------------------------"<

cout<<"请选择功能号:

";

cin>>choice;

switch(choice)

{

case1:

addresources();break;

case2:

delresources();break;

case3:

changeresources();break;

case4:

share();break;

case5:

addprocess();break;

case0:

choice=0;break;

default:

cout<<"请正确选择功能号(0-5)!

"<

}

}

return1;

}

 

2.运行结果:

1)初始化状态:

2)为进程0分配资源:

3)为进程4分配资源:

五、实验总结

本程序的设计实现主要是用C++语言。

程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。

在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,让我彻底认识到自己的不足,也同时从中学到了更多。

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

当前位置:首页 > 小学教育 > 小升初

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

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