银行家死锁避免算法模拟文档格式.docx
《银行家死锁避免算法模拟文档格式.docx》由会员分享,可在线阅读,更多相关《银行家死锁避免算法模拟文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![银行家死锁避免算法模拟文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/8/5a7f61f9-f9a8-4693-a1e8-da9fdf85f9fb/5a7f61f9-f9a8-4693-a1e8-da9fdf85f9fb1.gif)
银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。
用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。
5.算法实现
1.程序流程图:
系统必须做
若是,
2.算法描述:
银行家算法的设计思想是:
当用户申请一组资源时,
出判断;
如果把这些资源分出去,系统是否还处于安全装他
就可以分出这些资源;
否则,该申请暂不能满足。
3.数据结构描述:
(n表示系统中进程的数目,m表示资源的分类数。
)
3.1.Available是一个长度为m的向量,它表示每类资源可用的数
量。
Available[j]=k,表示rj类资源可用的数量为k。
3.2.Max是一个nxm矩阵,它表示每个进程对资源的最大需求。
Max
[i,j]=k,表示进程pi至多可以申请k个rj类资源单位。
3.3.Allocation是一个nxm矩阵,它表示当前分给每个进程的资
源数目。
Allocation[i,j]=k,表示进程pi当前分到k个rj类资
源。
34Need是一个nxm矩阵,它表示每个进程还缺少多少资源。
Need[i,j]=k,表示进程pi尚需k个rj类资源才能完成其任务。
显
然Need[i,j]=Max[i,j]-Allocation[i,j]。
这些数据结构的大小和数值随时间推移而改变。
4.系统所执行的安全性算法描述如下:
4.1.设置2个向量:
工作向量Work:
它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available。
Finish[i]:
它表示系统是否有足够的资源分配给进程,使之完成运行。
开始时先做Finish[i]=true。
42从进程集合中找到一个满足下述条件的进程:
Finish[i]=flase;
Need[i,j]<
Work[j];
若找到,则执行步骤3,否则,执行步骤4。
43当进程pi获得资源后,可顺利执行,直至完成,并释放分配给它的资源。
4.4.如果所有进程的Finish[i]=true都满足。
则表示系统处于安全
状态;
否则,系统处于不安全状态。
6.程序源代码
#include<
iostream>
#include<
string>
#include<
stdio.h>
usingnamespacestd;
#defineFalse0
#defineTrue1
各进程所需各类资源的最大需求系统可用资源
资源的名称
intAllocation[100][100]={0};
〃
intM=100;
〃作业的最大数为100
intN=100;
〃资源的最大数为100
voidshowdata()〃显示资源矩阵
inti,j;
cout<
<
"
系统目前可用的资源[Avaliable]:
endl;
for(i=0;
i<
N;
i++)
<
name[i]<
for(j=O;
j<
j++)cout<
Avaliable[j]<
”;
〃输出分配资源
MaxAllocationNeed"
进程名"
;
for(j=0;
3;
j++){for(i=0;
i++)cout<
}
for(i=0;
M;
i++){
"
j++)
Max[i][j]<
Allocation[i][j]<
Need[i][j]<
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=O,m,apply,Finish[100]={0};
intflag=0;
Work[0]=Avaliable[0];
Work[1]=Avaliable[1];
Work[2]=Avaliable[2];
apply=O;
j++){
if(Finish[i]==False&
&
=Work[j]){
apply++;
if(apply==N){
for(m=0;
m<
m++)
Work[m]=Work[m]+Allocation[i][m];
〃变分配数
Finish[i]=True;
temp[k]=i;
i=-1;
k++;
flag++;
if(Finish[i]==False){
系统不安全"
endl;
〃不成功系统不安全
return-1;
系统是安全的!
〃如果安全,输出成功
分配的序列:
;
i++){〃输出运行进程数组
temp[i];
if(i<
M-1)cout<
->
return0;
voidshare()〃利用银行家算法对申请资源对进行判定
charch;
inti=0,j=0;
ch='
y'
请输入要求分配的资源进程号(0-"
M-1<
):
cin>
>
i;
〃输入须申请的资源号
请输入进程"
申请的资源:
name[j]<
:
cin>
>
Request[j];
〃输入需要申请的资源
if(Request[j]>
Need[i][j])〃判断申请是否大于需求,若大于则出错
进程"
申请的资源大于它需要的资源"
分配不合理,不予分配!
n'
break;
else{
若大于则
Avaliable[j])〃判断申请是否大于当前资源,
{//出错
申请的资源大于系统现在可利用的资源"
分配出错,不予分配!
if(ch=='
){
changdata(i);
//根据进程需求量变换资源
showdata();
〃根据进程需求量显示变换后的资源
safe();
//根据进程需求量进行银行家算法判断
voidaddresources(){//添加资源
intn,flag;
请输入需要添加资源种类的数量:
cin»
n;
flag=N;
N=N+n;
for(inti=0;
名称:
name[flag];
数量:
Avaliable[flag++];
voidchangeresources(){〃修改资源函数
系统目前可用的资源[Avaliable]:
Avaliable[i]<
输入系统可用资源[Avaliable]:
Avaliable[0]»
Avaliable[1]»
Avaliable[2];
cout<
经修改后的系统可用资源为"
for(intk=0;
k<
k++)
name[k]<
Avaliable[k]<
showdata();
voiddelresources(){〃删除资源
charming;
inti,flag=1;
请输入需要删除的资源名称:
do{
ming;
if(ming==name[i]){
flag=0;
if(i==N)
该资源名称不存在,请重新输入:
while(flag);
for(intj=i;
N-1;
name[j]=name[j+1];
Avaliable[j]=Avaliable[j+1];
N=N-1;
voidaddprocess(){〃添加作业
intflag=M;
M=M+1;
请输入该作业的最大需求量[Max]"
Max[flag][i];
Need[flag][i]=Max[flag][i]-Allocation[flag][i];
intmain()〃主函数
inti,j,number,choice,m,n,flag;
*****************资源管理系统的设计与实现
请首先输入系统可供资源种类的数量:
N=n;
n;
i++)
资源"
i+1<
的名称:
name[i]=ming;
资源的数量
number;
Avaliable[i]=number;
请输入作业的数量:
m;
M=m;
请输入各进程的最大需求量("
*"
*<
矩阵)[Max]:
Max[i][j];
请输入各进程已经申请的资源量("
n<
矩
阵)[Allocation]:
Allocation[i][j];
if(Allocation[i][j]>
Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
if(flag)
申请的资源大于最大需求量,请重新输入!
\n"
〃显示各种资源
〃用银行家算法判定系统是否安全
while(choice)
case1:
addresources();
case2:
delresources();
case3:
changeresources();
case4:
share();
case5:
addprocess();
case0:
choice=0;
default:
请正确选择功能号(0-5)!
调试及运行结果:
检测结果如下:
1•假设系统只有一种资源a,剩余数量为2,分配情况如下:
进程
需求总量
已占资源
还需数量
8
4
1
2
9
7
2•假设系统只有一种资源a,剩余数量为2,分配情况如下:
3
5
注:
“系统不安全”表示此种情况是银行家算法也解不了的死锁
3•假设系统有2种资源a,b,a的剩余数量为4,b的剩余数量为3,分
配情况如下:
a
b
6
7.实验总结
通过本次试验,加深了自己对于死锁问题和银行家算法的理解。
对于银行家算法的思想有了更加深刻的认识,并且意识到银行家算法
并不是能避免所有的死锁,可以称这种情况为潜在的死锁。