实验二 银行家算法 昆工版本.docx
《实验二 银行家算法 昆工版本.docx》由会员分享,可在线阅读,更多相关《实验二 银行家算法 昆工版本.docx(16页珍藏版)》请在冰豆网上搜索。
实验二银行家算法昆工版本
昆明理工大学信息工程与自动化学院学生实验报告
(2013—2014学年第二学期)
课程名称:
操作系统开课实验室:
信自楼4442014年4月28日
年级、专业、班
计科122班
学号
201210405204
姓名
邹华宇
成绩
实验项目名称
银行家算法
指导教师
杨云飞
教师评语
教师签名:
年月日
一、实验目的
通过编写银行家算法,要求学生进一步掌握如何实现死锁的避免,进一步熟练使用数组进行程序的设计及实现。
二、实验原理及基本技术路线图(方框原理图)
用C语言或C++语言开发。
实现银行家算法、安全性检测算法。
数据可以从键盘输入,也可以初始化在数组里,还可以事先保存在文本文件中;输出结果参考课件,最好能逐步显示。
要求实现N个进程和M种资源的管理,N和M可定义为宏或常量。
有能力的同学再完成死锁检测算法。
1、银行家算法的详细描述
设进程I提出请求Request[N],则银行家算法按如下规则进行判断。
(1)如果Request[N]<=NEED[I,N],则转
(2);否则,出错。
(2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
AVAILABLE=AVAILABLE-REQUEST
ALLOCATION=ALLOCATION+REQUEST
NEED=NEED-REQUEST
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
2、安全性检查
(1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE
(2)从进程集合中找到一个满足下述条件的进程,FINISH[i]=FALSE
NEED<=WORK
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATION
FINISH=TRUE
GOTO2
(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
3、数据结构定义
假设有M个进程N类资源,则有如下数据结构:
MAX[M*N]M个进程对N类资源的最大需求量
AVAILABLE[N]系统可用资源数
ALLOCATION[M*N]M个进程已经得到N类资源的资源量
NEED[M*N]M个进程还需要N类资源的资源量
4、初始算法流程图
三、所用仪器、材料(设备名称、型号、规格等)。
计算机一台
四、实验方法、步骤
#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;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(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;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;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(choice)
{
cout<<"---------------银行家算法演示---------------"<cout<<"1:
增加资源"<cout<<"2:
删除资源"<cout<<"3:
修改资源"<cout<<"4:
分配资源"<cout<<"5:
增加作业"<cout<<"0:
离开"<cout<<"---------------------------------------------"<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;
}
五、实验过程原始记录(数据、图表、计算等)
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸)
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资料申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个必要条件:
即一、资源独占:
一个资源在同一时刻只能被分配给一个进程。
如果某一进程申请某一资源,而该资源正在被另外的某一进程所占有,则申请者需要等待,直到占有者释放该资源。
二、不可剥夺:
资源申请者不能强行地从资源占有者手中夺取资源,即资源只能由其占有者在使用完后自愿地释放。
三、保持申请:
进程在占有部分资源后还可以申请新的资源,而且在申请新的资源时并不释放它已经占有的资源。
四、循环等待。
当且仅当这四个条件同时满足时,死锁才会发生。
换言之,只要破坏上述四个条件中的任意一个,死锁就不会发生。
另外,通过编程实现银行家算法来预防死锁,加深了对课堂上所讲内容的理解。
操作系统时计算机系统中必不可少的系统软件。
它是计算机系统中各种资源的管理者和各种活动的组织者、指挥者。
银行家算法是为了使系统保持安全状态。
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量,则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中,继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足,则按当前的申请量分配资源,否则也要推迟分配。