银行家算法 实验报告.docx
《银行家算法 实验报告.docx》由会员分享,可在线阅读,更多相关《银行家算法 实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
银行家算法实验报告
淮海工学院计算机工程学院
实验报告书
课程名:
《操作系统原理》
题目:
银行家算法
班级:
D
学号:
姓名:
一、实验目的
银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。
实验环境
TurboC2.0/3.0或VC++6.0
实验学时
4学时,必做实验。
二、实验内容
用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。
程序能模拟多个进程共享多种资源的情形。
进程可动态地申请资源,系统按各进程的申请动态地分配资源。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。
3、实验说明
实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。
初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。
4、实验步骤
1、理解本实验中关于两种调度算法的说明。
2、根据调度算法的说明,画出相应的程序流程图。
3、按照程序流程图,用C语言编程并实现。
五、分析与思考
1.要找出某一状态下所有可能的安全序列,程序该如何实现?
要找出这个状态下的所有可能的安全序列,前提是要是使这个系统先处于安全状态,而系统的状态可通过以下来描述:
进程剩余申请数=最大申请数-占有数;可分配资源数=总数-占有数之和;通过这个描述来算出系统是否安全,从而找出所有的安全序列。
2.银行家算法的局限性有哪些?
银行家算法是一种最有代表性的避免死锁的算法。
银行家算法即把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
但任何一种算法都存在其缺点,对各进程的资源分配要求严格,经常使其处于不安全状态,银行家算法的主要局限是过于谨慎和检查各申请者对各类资源的最大需求量开销较大。
六、测试数据与实验结果
银行家算法流程图:
七、实验心得与体会
通过这次实验,知道了,什么是银行家算法,也知道了银行家算法是怎么样运行的。
还知道了在用该算法时所需要注意的方面。
附录:
#include
#include
usingnamespacestd;
intAvailable[100];//可利用资源数组
intMax[50][100];//最大需求矩阵
intAllocation[50][100];//分配矩阵
intNeed[50][100];//需求矩阵
intRequest[50][100];
intFinish[50];
charname[100];//资源名字
inttemp[100];
inttemp1[100];//资源总数量
intsum[100];//已分配的各资源和
intp[50];
intm,n;//m个进程,n个资源
intIsSafe()//
{
inti,j,l=0;
intWork[100];//可利用资源数组
for(i=0;iWork[i]=Available[i];
for(i=0;iFinish[i]=0;
for(i=0;i{
if(Finish[i]==1)
continue;
else
{
for(j=0;j{
if(Need[i][j]>Work[j])
break;
}
if(j==n)
{
Finish[i]=1;
for(intk=0;kWork[k]+=Allocation[i][k];
p[l++]=i;
i=-1;
}
else
continue;
}
if(l==m)
{
cout<<"系统是安全的"<cout<<"安全序列是:
"<for(i=0;i{
cout<
if(i!
=l-1)cout<<"-->";
}
cout<return1;
}
}
return0;
}
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;i{
cout<<""<
for(j=0;jcout<cout<<"";
for(j=0;jcout<cout<<"";
for(j=0;jcout<cout<}
}
voidInputFor1()
{
inti,j;
cout<<"输入每个进程最多所需的各资源数,按照"<for(i=0;ifor(j=0;jcin>>Max[i][j];
cout<<"输入每个进程已分配的各资源数,也按照"<for(i=0;i{
for(j=0;j{
cin>>Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];
if(Need[i][j]<0)
{
cout<<"你输入的第"<
"<j--;
continue;
}
}
}
}
voidInputFor2()
{
inti,j;
cout<<"输入每个进程最多所需的各资源数,按照"<for(i=0;ifor(j=0;jcin>>Max[i][j];
cout<<"输入每个进程需要各资源数,也按照"<for(i=0;i{
for(j=0;j{
cin>>Need[i][j];
Allocation[i][j]=Max[i][j]-Need[i][j];
if(Allocation[i][j]<0)
{
cout<<"你输入的第"<
"<j--;
continue;
}
}
}
}
voidInputFor3()
{
inti,j;
cout<<"输入每个进程已分配的各资源数,按照"<for(i=0;ifor(j=0;jcin>>Allocation[i][j];
cout<<"输入每个进程需要各资源数,也按照"<for(i=0;i{
for(j=0;j{
cin>>Need[i][j];
Max[i][j]=Allocation[i][j]+Need[i][j];
}
}
}
voidRequst()
{
charYesOrNo;
inti,mi;
cout<<"输入要申请资源的进程号(注:
第1个进程号为0,依次类推)"<cin>>mi;
cout<<"输入进程所请求的各资源的数量"<for(i=0;icin>>Request[mi][i];
for(i=0;i{
if(Request[mi][i]>Need[mi][i])
{
cout<<"你输入"<"<}
if(Request[mi][i]>Available[i])
{
cout<<"你输入"<"<}
}
for(i=0;i{
Available[i]-=Request[mi][i];
Allocation[mi][i]+=Request[mi][i];
Need[mi][i]-=Request[mi][i];
}
if(IsSafe()==1)
{
cout<<"同意分配"<showdata();
}
else
{
cout<<"你的请求被拒绝!
"<for(i=0;i{
Available[i]+=Request[mi][i];
Allocation[mi][i]-=Request[mi][i];
Need[mi][i]+=Request[mi][i];
}
}
cout<<"你还想再次请求分配吗?
是请按y/Y,否按n/N,再确定"<cin>>YesOrNo;
if(YesOrNo=='y'||YesOrNo=='Y'||YesOrNo=='n'||YesOrNo=='N')
{
if(YesOrNo=='y'||YesOrNo=='Y')
Requst();
else
{
cout<<""<}
}
else
{
cout<<"请按要求输入!
"<}
}
voidChResource()
{charmi2;
inti,b,c;
charYesOrNo1;
cout<<"您是要修改单个资源还是一起添加Y全部,N单个"<cin>>YesOrNo1;
if(YesOrNo1=='y'||YesOrNo1=='Y'||YesOrNo1=='n'||YesOrNo1=='N')
{
if(YesOrNo1=='y'||YesOrNo1=='Y')
for(i=0;i{cout<<"请您输入你要修改的Available"<cin>>Available[i];
showdata();
}
else
{
cout<<"请输入你要修改的资源名字"<cin>>mi2;
for(i=0;i{
temp1[i]=Available[i];
if(mi2=name[i])
{
c=i;
break;
}
}
cout<<"您修改的是"<cout<cin>>b;
Available[c]=b;
for(i=0;i{
if(Available[i]<0)
{
cout<<"您修改的数据出现错误请重新输入"<}
}
showdata();
}
}
else
{
cout<<"请按要求输入!
"<}
}
voidChProcess()
{inta,i;
charYesOrNo2;
cout<<"请输入您要修改的进程名(注:
第1个进程号为0,依次类推)"<cin>>a;
cout<<"您选择直接删除还是修改数据Y========删除N=======修改"<cin>>YesOrNo2;
if(YesOrNo2=='y'||YesOrNo2=='Y'||YesOrNo2=='n'||YesOrNo2=='N')
{
if(YesOrNo2=='y'||YesOrNo2=='Y')
{
for(i=0;i{Max[a][i]=0;
Allocation[a][i]=0;
Need[a][i]=0;
}
showdata();
cout<<"为了不影响进程的美观删除的进程我们暂时全部设为“0”"<cout<<"给您带来不便敬请谅解"<}
else
{
cout<<"请输入进成<cout<<"Max"<<"最大需求各资源数目"<for(i=0;i{
cin>>Max[a][i];
if(Max[a][i]<0)
{cout<<"您输入的数据出现错误请查证后再输入谢谢"<break;
}
}
cout<<"Allocation"<<"以分配的各资源数目"<for(i=0;i{
cin>>Allocation[a][i];
if(Allocation[a][i]<0)
{
cout<<"您输入的数据出现错误请查证后再输入谢谢"<break;
}
}
for(i=0;i{
Need[a][i]=Max[a][i]-Allocation[a][i];
}
showdata();
}
}
else
{
cout<<"按要求输入!
"<}
}
voidmain()//银行家算法
{
inti,j,choice,choice2;
intchoice3;
charYorN,YesOrNo1;
cout<<"银行家算法"<cout<<""<cout<<"1:
分配资源"<cout<<""<cout<<"0:
退出"<cout<<"请选择:
";
cin>>choice3;
if(choice3==0)
{
cout<<"谢谢使用"<}
else
{
system("cls");
cout<<"银行家算法"<cout<<""<cout<<"输入进程的数目:
";
cin>>m;
cout<<""<cout<<"输入资源的种类:
";
cin>>n;
cout<<""<cout<<"输入各资源名称:
";
for(i=0;i{
cin>>name[i];
}
cout<<"1已知Max和Allocation"<cout<<""<cout<<"2已知Max和Need"<cout<<""<cout<<"3已知Allocation和Need"<cout<<"选择:
";
cin>>choice;
switch(choice)
{
case1:
InputFor1();
break;
case2:
InputFor2();
break;
case3:
InputFor3();
break;
default:
cout<<"请正确选择功能号(1--3)!
"<break;
}
cout<<"您要输入资源总数量还是现有数量(Y===总数量,N======现有数量"<cin>>YorN;
if(YorN=='y'||YorN=='Y')
{
cout<<"输入各资源总数量"<for(i=0;i{
cin>>temp[i];
}
for(i=0;i{
sum[i]=0;
for(j=0;j{
sum[i]+=Allocation[j][i];
Available[i]=temp[i]-sum[i];
}
}
}
else
{
cout<<"输入各资源现有数量:
"<for(i=0;i{
cin>>Available[i];
}
}
IsSafe();
showdata();
Requst();
system("cls");
cout<<"**************银行家算法演示***************"<cout<<""<cout<<"1:
修改资源"<cout<<""<cout<<"2:
增加作业"<cout<<""<cout<<"0:
退出"<cout<<"请选择功能号:
";
cin>>choice2;
switch(choice2)
{
case1:
ChResource();
IsSafe();
cout<<"你还想再次请求分配吗?
是请按y/Y,否按n/N,再确定"<cin>>YesOrNo1;
if(YesOrNo1=='y'||YesOrNo1=='Y'||YesOrNo1=='n'||YesOrNo1=='N')
{
if(YesOrNo1=='y'||YesOrNo1=='Y')
Requst();
else
{
cout<<"谢谢使用祝您愉快"<}
}
else
{
cout<<"请按要求输入!
"<}
break;
case2:
ChProcess();
IsSafe();
cout<<"你还想再次请求分配吗?
是请按y/Y,否按n/N,再确定"<cin>>YesOrNo1;
if(YesOrNo1=='y'||YesOrNo1=='Y'||YesOrNo1=='n'||YesOrNo1=='N')
{
if(YesOrNo1=='y'||YesOrNo1=='Y')
Requst();
else
{
cout<<"谢谢使用祝您愉快"<}
}
else
{
cout<<"请按要求输入!
"<}
break;
case0:
choice=0;
break;
default:
cout<<"选择功能号(0-5)!
"<break;
}
}
}