实验 银行家算法文档格式.docx
- 文档编号:17569836
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:13
- 大小:102.17KB
实验 银行家算法文档格式.docx
《实验 银行家算法文档格式.docx》由会员分享,可在线阅读,更多相关《实验 银行家算法文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;
否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
3.数据结构
银行家算法中的数据结构:
(1)可利用资源向量Available。
这是一个含有n个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
如果Available[j]=K,则表示系统中现有Rj类资源K个。
(2)最大需求矩阵Max。
这是一个m*n的矩阵,它定义了系统中n个进程中每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
(3)分配矩阵Allocation。
这也是一个m*n的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
(4)需求矩阵Need。
这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
(5)工作数组Work.。
这是一个含有n个元素的数组,它代表可以提供分配的资源数,初始值是Available中的数值,随着资源的回收,它的值也会改变,公式是Work[i]=Work[i]+Allocation[i]。
4.主要函数说明
主要函数主要有四个:
(1)Main()主函数:
用来显示资源的分配情况和提示信息,同时用Main函数来调用其它子程序。
(2)Safe()函数:
用来检查是否有安全序列,如果存在则返回一个‘1’给主函数,否则返回‘0’。
(3)Disp()函数:
用来显示随机生成的资源包括Max、Need、Allocation、Available。
(4)Request()函数:
用来进行资源请求,分为手动的和随机申请。
同时对申请的资源进行判断,检查申请是否有效,如果有效则返回一个‘1’给主函数,否则返回‘0’。
5.算法流程图
N
Y
Y
N
三、调试记录与分析
在调试过程中为了显示安全序列的检查状况,在检查Available是否满足Need时要检查m*n遍,并存在表达有歧异,经过修改后,就不需要全部检查,而是Available只要有一个不满足Need就停止检查。
图3.1修改前
图3.2修改后
四、运行结果及说明
图4.1.不存在安全序列
随机分配完资源后,进行安全检查,在检查过程中在屏幕上显示检查信息,上图为资源分配不安全时显示的信息。
图4.2.存在安全路径
存在安全路径后,在屏幕上显示变化过程和安全路径。
提示是否申请资源
图4.3.申请资源
提出申请后,询问进行随机分配资源还是手动分配
图4.4手动分配
图4.5.随机分配
五、实验总结
附录
#include<
stdio.h>
#include<
stdlib.h>
time.h>
#defineM3
#defineN3
intNeed[M][N],Allocation[M][N],Avalible[N],Max[M][N],finish[N];
//Need:
进程需要的资源数Allocation:
进程已分配的资源;
Avalible:
进程可供分配的资源
voiddisplay(int*a,intn)//显示一维数组
{inti;
for(i=0;
i<
n;
i++)
printf("
%3d"
a[i]);
}
voiddisp()//显示资源列表
{inti,j,k,h,l;
Nnumber\tMax\t\tneed\t\tallocation\tavalible\n"
);
M;
{printf("
p%d\t"
i);
display(Max[i],N);
\t"
display(Need[i],N);
display(Allocation[i],N);
if(i==0)
display(Avalible,N);
\n"
}}
intgrand(int*a,int*b,intn)//分配资源
a[i]=b[i];
intcheck(int*a,int*b,intn)//检查Allocation是否与Max相等
{if(a[i]<
b[i])return0;
}
return1;
intcompare(int*a,int*b,intn)//比较数组的大小
charflag;
{if(a[i]<
b[i])
return0;
intcomp(int*a,int*b,intn,intm)//比较数组
{inti;
{if(a[i]>
{if(m==1)
requestNumber%dresoucehaveanerrorrequestoverflowavalible[%d]\n"
i+1,i);
if(m==2)
requestNumber%dresoucehaveanerrorrequestoverflowNeed[%d]\n"
}}
voiddec(int*a,int*b,intn)//数组相减
a[i]-=b[i];
charinput()//输入数据
{charc;
c=getchar()-0x30;
returnc;
voidadd(int*a,int*b,intn,intm)//数组相加
{inti;
a[i]+=b[i];
{if(m==0)printf("
Avalible[%d]=%d"
i,a[i]);
if(m==3)printf("
if(m==1)printf("
workvaluesechangedwork[%d]=%d\n"
//检查安全序列
intsafe()
{inti,count=0,n,j,r1=1;
intwork[N],sr[M],flag;
intfinish1[N];
grand(work,Avalible,N);
checksafelist......\n"
N;
finish1[i]=-1;
for(n=0;
n<
n++)
{for(i=0;
{flag=compare(work,Need[i],N);
if(flag==0){printf("
can'
tsatisfyprocess[%d]->
need[%d]"
n,i);
break;
if(finish1[i]==-1&
&
flag==1&
finish[i]==-1)
{printf("
findarightneed----process[%d]->
need[%d]\n"
add(work,Allocation[i],N,r1);
finish1[i]=1;
sr[count]=i;
count++;
//记录安全序列
}}}
if(count>
=M)
-----haveansafelist-----\n"
{if(i!
=M-1)
p%d->
"
sr[i]);
else
p%d\n"
}return1;
else
afterchecktherenosafelist.....\n"
tapplyresouce\n"
//随机请求资源
intran_request()
{inti,flag1,flag2,r1=1,r2=2,r3=3;
intrequest[N],pn;
pn=rand()%2;
Process[%d]callforresouce\n"
pn);
request[i]=rand()%5;
finish[i]=-1;
randomproducerequest[%d]:
N);
display(request,N);
if(finish[pn]==-1)//finish记录进程是否分配完成{
flag1=comp(request,Avalible,N,r1);
flag2=comp(request,Need[pn],N,r2);
if(flag1==1&
flag2==1)
callforrequestavalible"
dec(Avalible,request,N);
dec(Need[pn],request,N);
add(Allocation[pn],request,N,r3);
disp();
if(safe()==1)
{if(check(Allocation[pn],Max[pn],N)==1)
{add(Avalible,Allocation[pn],N,0);
finish[pn]=1;
theresoucehaveassingned\n"
intrequest()//手动申请资源
{inti,j,pn,c,flag1,flag2,r1=1,r2=2,r3=3,k=0;
intrt[N];
pleaseinputtheprocessnumberwhichyouwant:
scanf("
%d"
&
pn);
if(pn>
M-1)printf("
inputerror!
!
\npleaseinputtherequestnumber:
{getchar();
The%drquest:
rt[i]=input();
Yourrequestis锛歕n"
display(rt,N);
if(finish[pn]==-1)
{flag1=comp(rt,Avalible,N,r1);
flag2=comp(rt,Need[pn],N,r2);
dec(Avalible,rt,N);
dec(Need[pn],rt,N);
add(Allocation[pn],rt,N,r3);
{if(check(Allocation[pn],Max[pn],N)==1)
k++;
}
return1;
elsereturn0;
}}
Theresoucehaveassigned\n"
intmain()
{inti,j,s_flag;
charc,s;
intav[N],s_ll[M][N];
{finish[i]=-1;
srand(time(NULL));
for(j=0;
j<
j++)
{Allocation[i][j]=rand()%10;
Need[i][j]=rand()%10;
Max[i][j]=Allocation[i][j]+Need[i][j];
{Avalible[i]=rand()%12;
s_flag=safe();
if(s_flag==1)
是否申请资源---(Y/N)\n"
c=getchar();
if(c=='
Y'
||c=='
y'
)
{
N1:
1---------randomrequestresouce\n"
2---------requestresoucebyman\n"
grand(av,Avalible,N);
//保存原始的available的值
{grand(s_ll[i],Allocation[i],N);
getchar();
Mnu:
s=getchar();
switch(s)
{case'
1'
:
if(ran_request()==1)
{printf("
continuerequest(Y/N)\n"
c=getchar();
gotoN1;
{grand(Avalible,av,N);
grand(Allocation[i],s_ll[i],N);
break;
case'
2'
if(request()==1){
if(c=='
else
{grand(Avalible,av,N);
grand(Allocation[i],s_ll[i],N);
break;
default:
printf("
inputerror,pleaseinputagin...\n"
gotoMnu;
N'
n'
Thankforyouruse....\n"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 银行家算法 银行家 算法