银行家算法实验报告.docx
《银行家算法实验报告.docx》由会员分享,可在线阅读,更多相关《银行家算法实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
银行家算法实验报告
xx大学 操作系统 实验报告
姓名:
学号:
班级:
实验日期:
实验名称:
预防进程死锁的银行家算法
实验三预防进程死锁的银行家算法
1.实验目的:
通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
理解银行家算法的运行原理,进一步掌握预防进程死锁的策略及对系统性能的评价方法。
:
2.需求分析
(1)输入的形式和输入值的范围;
输入:
首先输入系统可供资源种类的数量n范围:
0资源1的名称:
资源的数量:
资源2的名称:
资源的数量:
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
输入作业的数量m范围:
0输入个进程的最大需求量[Max]:
输入个进程已经申请的资源量[Allocation]:
(2)输出的形式
系统目前可用的资源[Avaliable]:
(资源名)
(资源名)
(资源名)
进程名
Max
Allocation
Need
(资源名)
(资源名)
(资源名)
(资源名)
(资源名)
(资源名)
(资源名)
(资源名)
(资源名)
(显示系统是否安全)
分配序列:
(3)程序所能达到的功能
通过手动输入资源种类数量和各进程的最大需求量、已经申请的资源量,运用银行家算法检测系统是否安全,若安全则给出安全序列,并且当用户继续输入某进程的资源请求时,能够继续判断系统的安全性。
(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
正确输入
输入参数(已申请资源数)错误
3、概要设计
所有抽象数据类型的定义:
intMax[100][100];//各进程所需各类资源的最大需求
intAvaliable[100];//系统可用资源
charname[100]};//资源的名称
intAllocation[100][100];//系统已分配资源
intNeed[100][100]};//还需要资源
intRequest[100];//请求资源向量
inttemp[100];//存放安全序列
intWork[100];//存放系统可提供资源
intM=100;//作业的最大数为100
intN=100;//资源的最大数为100
主程序的流程:
*变量初始化;
*接收用户输入n,m,Maxij,Allocationij;
*按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;
*如果安全,提示用户输入下一时刻进程Pk的资源请求Request(R1,…,Rm);
*如果不安全或者无新请求则退出。
各程序模块之间的层次(调用)关系
使用Main函数对全局变量进行初始化,然后调用showdata函数对各资源和进程进行整合显示,最后调用safe函数即银行家算法判定系统是否安全。
若安全,并想继续对某进程进行资源请求,则调用request函数进行操作,其中request函数又调用changedata函数、showdata函数和safe函数进行请求后的数据修改、显示以及对系统安全性的判定。
4、详细设计
实现程序模块的具体算法。
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;
}
5、调试分析
(1)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析
起初,对于银行家算法的运算步骤有一定的偏差,导致在将算法编码时造成了一些错误,结果无法得到正确答案,之后通过仔细查阅银行家算法的步骤,问题得以及时解决。
(2)算法的性能分析
用户对可供资源和各进程所需要的最大资源量和已分配资源量进行赋值,可得到系统的安全性判定,以及安全时的安全序列以及对资源进行请求后的系统安全性判定。
(3)经验体会
通过对银行家算法的编码,让我对银行家算法的原理有了更为深刻的理解,同时也让我意识到只有通过亲自动手实践,才能加深对算法思想的理解与记忆。
6、用户使用说明
程序的使用说明,列出每一步的操作步骤。
Y
N
Y
N
7、测试结果
列出测试结果,包括输入和输出。
进程名
Max
Allocation
Need
a
b
a
b
a
b
0
3
2
1
2
2
0
1
1
1
0
1
1
0
2
2
3
1
1
1
2
之后对进程一进行资源请求:
进程名
Max
Allocation
Need
a
b
a
b
a
b
0
3
2
1
2
2
0
1
1
1
1
1
0
0
2
2
3
1
1
1
2
8、附录
带注释的源程序,注释应清楚具体
#include
#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<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;
}
voidrequest()//利用银行家算法对申请资源对进行判定
{
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();//根据进程需求量进行银行家算法判断
}
}
intmain()//主函数
{
inti,j,number,m,n,flag,choice;
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;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<<"***********************************"<cout<<"0:
离开"<cout<<"1:
资源请求"<cout<<"请选择功能号:
";
cin>>choice;
switch(choice)
{
case1:
request();break;
case0:
choice=0;break;
default:
cout<<"请正确选择功能号(0-1)!
"<}
}
return1;
}