银行家算法c++语言流程图代码全.docx
《银行家算法c++语言流程图代码全.docx》由会员分享,可在线阅读,更多相关《银行家算法c++语言流程图代码全.docx(16页珍藏版)》请在冰豆网上搜索。
银行家算法c++语言流程图代码全
操作系统教程
——银行家算法
院系
计算机与软件学院
班级
08软件工程2班
学号
20081344066
姓名
何丽茗
一、实验目的
银行家算法是避免死锁的一种重要方法。
通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。
二、实验内容
根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。
三、实验方法
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;icout<cout<for(j=0;jcout<cout<cout<<"MaxAllocationNeed"<cout<<"进程名";
for(j=0;j<3;j++){
for(i=0;icout<cout<<"";
}
cout<for(i=0;icout<<""<
for(j=0;jcout<cout<<"";
for(j=0;jcout<cout<<"";
for(j=0;jcout<cout<}
}
intchangdata(inti)//进行资源分配
{
intj;
for(j=0;jAvaliable[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;iapply=0;
for(j=0;jif(Finish[i]==False&&Need[i][j]<=Work[j]){
apply++;
if(apply==N){
for(m=0;mWork[m]=Work[m]+Allocation[i][m];//变分配数
Finish[i]=True;
temp[k]=i;
i=-1;
k++;
flag++;
}
}
}
}
for(i=0;iif(Finish[i]==False){
cout<<"系统不安全"<return-1;
}
}
cout<<"系统是安全的!
"<cout<<"分配的序列:
";
for(i=0;icout<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;jif(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;icout<<"名称:
";
cin>>name[flag];
cout<<"数量:
";
cin>>Avaliable[flag++];
}
showdata();
safe();
}
voiddelresources(){//删除资源
charming;
inti,flag=1;
cout<<"请输入需要删除的资源名称:
";
do{
cin>>ming;
for(i=0;iif(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;icout<"<cout<<"输入系统可用资源[Avaliable]:
"<cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2];
cout<<"经修改后的系统可用资源为"<for(intk=0;kcout<"<showdata();
safe();
}
voidaddprocess(){//添加作业
intflag=M;
M=M+1;
cout<<"请输入该作业的最大需求量[Max]"<for(inti=0;icout<";
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;ifor(j=0;jcin>>Max[i][j];
do{
flag=0;
cout<<"请输入各进程已经申请的资源量("<"<for(i=0;ifor(j=0;jcin>>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++语言。
程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。
在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,让我彻底认识到自己的不足,也同时从中学到了更多。