银行家算法Word文档下载推荐.docx
- 文档编号:20854285
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:15
- 大小:141.47KB
银行家算法Word文档下载推荐.docx
《银行家算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《银行家算法Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n)它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj(j<
i)当前占有资源量之和。
(3)设requesti为进程p[i]请求的向量,如果requesti[j]=K,表示进程p[i]需要K个Rj资源。
当系统发出请求后,系统按下述步骤开始检查:
如果requesti[j]<
=need[i][j],转向步骤2;
否则报告出错,申请的资源已经大于它需要的最大值。
如果requesti[j]<
=available[j],转向步骤3;
否则报告出错,尚无足够的资源。
③系统试探着把资源分配给p[i],并修改下列数绝结构中的值:
available[j]=available[j]-request[j]
allocation[i][j]=allocation[i][j]+request[j]
need[i][j]=need[i][j]-requesr[j]
④系统进行安全性算法,检查此次分配后,系统时候还处于安全状态,若安全,则把资源分配给进程p[i];
否则,恢复原来的资源分配状态,让进程p[i]等待。
(4)安全性算法:
intwork[RESOURCE_NUMBER];
boolfinish[PROCESS_NUMBER];
①
Work=Available;
Finish=false;
②寻找满足条件的i:
·
Finish[i]=false;
Need[i]≤Work;
如果不存在,则转④。
③Work:
=Work+Allocation[i];
Finish[i]:
=true;
转②。
④若对所有i,Finish[i]=true,则系统处于安全状态,否则处于不安全状态。
(5)按模拟算法设计程序,运行设计的程序,观察得到的结果。
四、试验结果
//包含所需要的头文件
#include<
stdio.h>
stdlib.h>
time.h>
#definePROCESS_NUMBER5//进程数
#defineRESOURCE_NUMBER3//资源数
#definetrue1
#definefalse0
typedefintbool;
//系统可用资源向量
intAvailable[RESOURCE_NUMBER]={2,1,2};
//最大需求向量
intMax[PROCESS_NUMBER][RESOURCE_NUMBER]=
{
{3,2,2},
{6,1,3},
{3,1,4},
{4,2,2},
{3,1,3}
};
//资源分配向量
intAllocation[PROCESS_NUMBER][RESOURCE_NUMBER]=
{1,0,0},
{4,1,1},
{2,1,1},
{0,0,2},
{1,0,3},
//需求向量
intNeed[PROCESS_NUMBER][RESOURCE_NUMBER];
//比较两个一维数组
//判断a>
=b是否成立
boolcompare(int*a,int*b,intn)
inti;
for(i=0;
i<
n;
i++)
if(a[i]<
b[i])
returnfalse;
returntrue;
}
//一维数组加法
//a=a+b
voidadd(int*a,int*b,intn)
a[i]+=b[i];
//一维数组减法
//a=a-b
voidsubstract(int*a,int*b,intn)
a[i]-=b[i];
//将数组b的值赋给a,n为数组的大小
voidassign(int*a,int*b,intn)
a[i]=b[i];
//判断是否是安全状态
//av可用资源矩阵
//sp记录安全路径
boolissafe(int*sp)
intcount=0;
//记录finish[i]=true的个数
intn=0;
intwork[RESOURCE_NUMBER];
boolfinish[PROCESS_NUMBER];
//work=av;
assign(work,Available,RESOURCE_NUMBER);
//setfinish
PROCESS_NUMBER;
finish[i]=false;
//n为进程的个数
//循环最多执行n次
n=PROCESS_NUMBER;
while(n--)
//判断能否满足进程i的要求,work>
=Need[i]是否成立
if(finish[i]==false&
&
compare(work,Need[i],RESOURCE_NUMBER))
{
//分配,待进程完成后再释放
add(work,Allocation[i],RESOURCE_NUMBER);
finish[i]=true;
//记录安全路径
sp[count]=i;
//能满足的进程数+1
count++;
}
if(count>
=PROCESS_NUMBER)
returntrue;
else
returnfalse;
//请求分配
//pid进程,r请求向量,n资源个数
boolrequest(intpid,int*r,intn)
intsp[5];
if(compare(Need[pid],r,n)==true&
compare(Available,r,n)==true)
{
//尝试分配资源
substract(Available,r,RESOURCE_NUMBER);
add(Allocation[pid],r,RESOURCE_NUMBER);
substract(Need[pid],r,RESOURCE_NUMBER);
//判断是否是安全状态
if(issafe(sp))
//打印安全路径
printf("
SecurityPath:
\n\t"
);
for(i=0;
printf("
p%d"
sp[i]);
\n"
//可以分配
}
else
//不分配
//恢复到分配前的状态
add(Available,r,RESOURCE_NUMBER);
substract(Allocation[pid],r,RESOURCE_NUMBER);
add(Need[pid],r,RESOURCE_NUMBER);
//printoutthearray
voidprint(int*a,intn)
%4d"
a[i]);
//提示信息
charhint()
charch;
\t----------OperationHint----------\n"
\tA(a)----ApplyForResourceautomated\n"
//Aaforautomated
\tH(h)-----ApplyForResourceByHuman\n"
//Hhforbyhuman
\tQ(q)----------------------------quit\n"
//Qqforquit
scanf("
%c"
&
ch);
returnch;
//显示系统信息
voidinit()
inttemp[RESOURCE_NUMBER];
ProcessNumbers:
%d\nNeedandAllocationrespectivelyasfollow:
PROCESS_NUMBER);
//显示进程最大资源需求
\tprocess%dmaxneed:
"
i);
print(Max[i],RESOURCE_NUMBER);
//计算需求向量Need[i]=Max[i]–Allocation[i]
assign(temp,Max[i],RESOURCE_NUMBER);
substract(temp,Allocation[i],RESOURCE_NUMBER);
assign(Need[i],temp,RESOURCE_NUMBER);
//显示进程已分配资源
\tprocess%dallocatedresources:
print(Allocation[i],RESOURCE_NUMBER);
\tavailableresources:
\t"
print(Available,RESOURCE_NUMBER);
//输入
voidinput(int*r,intn,int*id)
//提示输入进程号
pleaseinputprocessid(0~%d):
n-1);
//从进程输入进程号
%d"
id);
//从键盘输入该进程所需要的资源数目
\nthenumbersofneededresource%d(int):
r[i]);
//显示刚才所输入的数据
\ndatayouinputed:
Request[%d]("
*id);
r[i]);
)\n"
//检查输入
boolcheck(intid,int*r,intn)
inti;
//判断申请资源数目是否合法
if(r[i]<
0)
//判断进程号是否合法
if(id>
intmain()
//进程id
intid;
//控制字符
charcontrol;
//资源请求向量
intr[3];
//显示开始信息
init();
//随机数初始化
srand((int)time(0));
while
(1)
//提示
control=hint();
if(control=='
a'
||control=='
A'
)
//随机申请资源
id=rand()%5;
r[0]=rand()%5;
r[1]=rand()%5;
r[2]=rand()%5;
//显示申请信息
\tRequest[%d](%d,%d,%d)\n"
id,r[0],r[1],r[2]);
if(request(id,r,RESOURCE_NUMBER))
printf("
AllocSuccess!
\n"
AllocFailed!
elseif(control=='
h'
H'
//输入申请信息
input(r,RESOURCE_NUMBER,&
id);
//检查输入是否合法
if(check(id,r,RESOURCE_NUMBER)==false)
\nInputError!
Pleasereinput!
continue;
//执行
if(request(id,r,RESOURCE_NUMBER))
RequestSucceed!
else
RequestFail!
elseif(control=='
q'
Q'
exit(0);
//显示当前系统资源和进程情况
//显示可用资源情况
AvailableResources\n"
//显示资源最大需求
porcess%dmaxneed\n"
print(Max[id],RESOURCE_NUMBER);
//显示已分配资源情况
process%dallocatedresources\n"
print(Allocation[id],RESOURCE_NUMBER);
return0;
手工分配效果图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法