银行家算法实验报告.docx
《银行家算法实验报告.docx》由会员分享,可在线阅读,更多相关《银行家算法实验报告.docx(14页珍藏版)》请在冰点文库上搜索。
银行家算法实验报告
淮海工学院计算机工程学院
实验报告书
课程名:
《操作系统原理》
题目:
银行家算法
班级:
网络121
学号:
姓名:
一、实验目的
算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。
二、实验内容
用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。
程序能模拟多个进程共享多种资源的情形。
进程可动态地申请资源,系统按各进程的申请动态地分配资源。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。
三、实验说明
实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。
初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。
3、实验程序流程图
四、实验源程序
#include
usingnamespacestd;
#include
#include
#defineFalse0
#defineTrue1
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;//作业的最大数为100
intN=100;//资源的最大数为100
voidshowdata()//显示资源矩阵
{
inti,j;
cout<<"系统目前可用的资源[Avaliable]:
"<for(i=0;icout<for(j=0;jcout<cout<cout<<"MaxAllocationNeed"<cout<<"进程名";
for(j=0;j<3;j++)
{
for(i=0;icout<cout<<"";
}
cout<for(i=0;i{
cout<<""<
for(j=0;jcout<cout<<"";
for(j=0;jcout<cout<<"";
for(j=0;jcout<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;mWork[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(icout<<"->";
}
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;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();
}
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<<"*****************资源管理系统的设计与实现*****************"<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;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(true)
{
cout<<"**************银行家算法演示***************"<cout<<"1:
增加资源"<cout<<"2:
删除资源"<cout<<"3:
分配资源"<cout<<"4:
增加作业"<cout<<"*******************************************"<cout<<"请选择功能号:
";
cin>>choice;
switch(choice)
{
case1:
addresources();break;
case2:
delresources();break;
case3:
share();break;
case4:
addprocess();break;
default:
cout<<"请正确选择功能号(0-5)!
"<}
}
return1;
}
6、实验结果
七、实验感想:
在这次试验中我们更加清楚的了解银行家的原理。
银行家算法是通过动态地检测系统中资源分配情况和进程对资源的需求情况来决定如何分配资源的,在能确保系统处于安全状态时才能把资源分配给申请者,从而避免系统发生死锁。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
这次实验让我收获很大,不仅对算法有了更深入的了解而且还提高了我们的编程水平。
复习了我们大一的C++里面的一些语法。