银行家算法实验报告.docx
《银行家算法实验报告.docx》由会员分享,可在线阅读,更多相关《银行家算法实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
银行家算法实验报告
操作系统课程设计报告
题目:
银行家算法
院系
班级
姓名
学号
指导教师
银行家算法实验报告
一、概述
编写算法,实现银行家算法、安全性算法、死锁检测算法判断系统安全状态、判断进程的资源请求是否可以被满足、判定系统是否为死锁状态。
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
二、设计的基本概念和原理
1、算法思路:
先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:
(1)如果Requesti<or=Need,则转向步骤
(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Request[i];
Allocation=Allocation+Request;
Need=Need-Request;
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:
(1)设置两个向量
①工作向量Work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;
②布尔向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i]=false
②Need如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work=Work+Allocation;
Finish[i]=true;
转向步骤
(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
4、死锁检测和解除
编程实现死锁检测算法、死锁解除算法,数据动态输入,解锁采用释放最大死锁进程资源的方法实现。
三、总体设计
运用c++实现对这三个算法的进行实现,通过自定义进程数和进程资源的各项数据情况对其进行分配,将其用函数分开,在实现每一步时进行调用。
数据结构:
intAvailable[20];
intMax[10][20];
intAllocation[10][20];
intNeed[10][20];
intRequest[10][20];
boolFinish[10];
intp[10];
intWork[20];
intm,n;
stringshowdata1[4]={"Max","Allo","Need","Aval"};
stringshowdata2[5]={"Work","Need","Allo","W+al","Finish"};
流程图:
系统主要过程流程图
银行家算法流程图
安全性算法流程图
四、详细设计
#include
#include
#include
#include
usingnamespacestd;
intAvailable[20];
intMax[10][20];
intAllocation[10][20];
intNeed[10][20];
intRequest[10][20];
boolFinish[10];
intp[10];
intWork[20];
intm,n;
stringshowdata1[4]={"Max","Allo","Need","Aval"};
stringshowdata2[5]={"Work","Need","Allo","W+al","Finish"};
voidiShow()
{
intsize,size2;
cout<<"系统";
for(intk=0;k<4;k++)
{
size=showdata1[k].length();
size2=(n*3+5-size)/2;
cout<}
cout<cout<<"资源";
for(intk=0;k<4;k++)
{
charsourcename='A';
cout<<"";
for(intkk=0;kk{
cout<<""<sourcename++;
}
cout<<"";
}
cout<for(intii=0;ii{
cout<<"P"<for(intjj=0;jjcout<cout<<"";
for(intjj=0;jjcout<cout<<"";
for(intjj=0;jjcout<cout<<"";
if(ii==0)
{
for(intiii=0;iiicout<}
cout<<""<}
}
voidfShow()
{
cout<<"系统";
for(intk=0;k<5;k++)
{
intsize=showdata2[k].length();
intsize2=(n*3+5-size)/2;
cout<}
cout<cout<<"资源";
for(intk=0;k<4;k++)
{
charsourcename='A';
cout<<"";
for(intkk=0;kk{
cout<sourcename++;
}
cout<<"";
}
cout<}
voidInit()/*初始化算法*/
{
inti,j;
ifstreammyfile("a.txt");
if(!
myfile){
cout<<"Unabletoopenmyfile";
}
cout<<"请输入进程的数目:
";
myfile>>m;
cout<<"请输入资源的种类:
";
myfile>>n;
cout<<"请输入每个进程最多Max所需的各资源数,按照"<for(i=0;i{
for(j=0;j{
myfile>>Max[i][j];
}
}
cout<<"请输入每个进程已分配Allocation的各资源数,按照"<for(i=0;i{
for(j=0;j{
myfile>>Allocation[i][j];
Need[i][j]=Max[i][j]-Allocation[i][j];
}
}
cout<<"请输入各个资源现有的Available数目:
"<for(i=0;i{
myfile>>Available[i];
}
iShow();
}
boolSafe()
{
fShow();
inti,j,k,l=0;
for(i=0;iWork[i]=Available[i];
for(i=0;i{
Finish[i]=false;
}
for(i=0;i{
if(Finish[i]==true)
{
continue;
}
else
{
for(j=0;j{
if(Need[i][j]>Work[j])
{
break;
}
}
if(j==n)
{
Finish[i]=true;
cout<<"P"<
for(k=0;kcout<cout<<"";
for(k=0;kcout<cout<<"";
for(k=0;kcout<cout<<"";
for(k=0;kcout<cout<<"";
cout<for(k=0;k{
Work[k]+=Allocation[i][k];
}
p[l++]=i;
i=-1;/*再次由进程从小到大遍历*/
}
else
{
continue;
}
}
if(l==m)/*进程记录p的数量等于资源总量,全部进程均已经满足*/
{
cout<<"系统是安全的"<cout<<"安全序列:
"<for(i=0;i{
cout<
if(i!
=l-1)
{
cout<<"-->";
}
}
cout<<""<returntrue;
}
}
cout<<"\n无法继续找到可满足的进程!
"<cout<<"系统是不安全的"<returnfalse;
}
voidBank()
{
inti,cusneed;
charagain;
while
(1)
{
cout<<"请输入要申请资源的进程号(注:
第个进程号为,依次类推):
P";
cin>>cusneed;
cout<<"\n请输入进程所请求的各资源的数量"<for(i=0;i{
cin>>Request[cusneed][i];
}
for(i=0;i{
if(Request[cusneed][i]>Need[cusneed][i])
{
cout<<"您输入的请求数超过进程的需求量!
请重新输入!
"<continue;
}
if(Request[cusneed][i]>Available[i])
{
cout<<"您输入的请求数超过系统有的资源数!
请重新输入!
"<continue;
}
}
for(i=0;i{
Available[i]-=Request[cusneed][i];
Allocation[cusneed][i]+=Request[cusneed][i];
Need[cusneed][i]-=Request[cusneed][i];
}
if(Safe())
{
cout<<"同意分配请求!
"<}
else
{
cout<<"您的请求被拒绝!
"<for(i=0;i{
Available[i]+=Request[cusneed][i];
Allocation[cusneed][i]-=Request[cusneed][i];
Need[cusneed][i]+=Request[cusneed][i];
}
}
for(i=0;i{
Finish[i]=false;
}
cout<<"您还想再次请求分配吗?
是请按y/Y,否请按其它键"<cin>>again;
if(again=='y'||again=='Y')
{
continue;
}
break;
}
}
intmain()
{
while(true)
{
Init();
if(Safe())break;
cout<<"当前系统不安全,请重新初始化系统";
}
Bank();
return0;
}
5、测试与数据分析
假设系统中有三个进程{p,q,r}和三类资源{a,b,c},各种资源的数量分别为10,5,7,在T0时刻的资源分配情况如图
资源情况
进程
Max
abc
Allocation
abc
Need
abc
Available
abc
P
753
010
743
332
Q
322
200
122
R
902
302
600
运行程序后输入数据如图
使用银行家算法所分配的情况和安全检查情况为
死锁检测与排除的运行结果为
六、完成的情况、简要的使用说明
这两个程序已经完成了对进程以资源之间检测与分配功能,并且能够在给出资源的分配情况后检测需求是否会发生死锁状况并给出解除方案。
运行程序后只需按照提示操作即可观察到进程对资源的调用情况。
七、结果分析
程序运行稳定,安全,充分展示了银行家算法、安全性算法、死锁检测与解除算法的实现情况。
八、总结
多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。
银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。
通过对算法的编写让我了解到计算机在调度进程时的具体过程,也明白了解决死锁的原理。
九、参考文献
[1]汤子瀛梁红兵哲凤屏汤子灜.《计算机操作系统(第三版)》.
西安:
西安电子科技大学出版社,2007.5.
[2]谭浩强.《C++面向对象程序设计》.北京:
清华大学出版社,2006.01.