银行家算法Word文档格式.docx
《银行家算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《银行家算法Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
intM=3,N=5;
//M为资源数量N为进程数量
intavailable[3];
//预分配前各类资源可用数量
intmax[5][3];
//各进程需要各资源最大数量
intallocation[5][3];
//各进程已分配各类资源的数量
intneed[5][3];
//各进程需要各类资源的数量
intrequest[3];
//进程对某一类资源的请求
intwork[3];
//预分配后各类资源可用数量
intfinish[5];
//进程结束标志数组。
0表示分配失败,资源不足以满足需求量;
1表示分配成功,资源满足需求量
intsafe()//预分配后安全性检测
{
inti=0;
intj=0;
intk=0;
intflag1=0;
//所有进程安全结束;
0表示安全可以安全结束,1表示不可以安全结束
intflag2=0;
//某进程对资源的需求量与可利用量的大小标志;
0表示需求小于可利用,1表示需求大于可利用
for(i=0;
i<
N;
i++)
{
finish[i]=0;
//各进程结束标志初始化为0。
}
M;
work[i]=available[i];
//预分配后各资源可利用量赋值给work[]数组
while(j<
N)
for(i=0;
{
if(!
finish[i])//i进程尚未分配
{
flag2=0;
for(k=0;
k<
k++)
{
if(need[i][k]>
work[k])//需求大于可利用
{
flag2=1;
break;
}
}
if(flag2==0)
work[0]=work[0]+allocation[i][0];
//收回已分配的资源
work[1]=work[1]+allocation[i][1];
work[2]=work[2]+allocation[i][2];
finish[i]=1;
}
}
j++;
5;
if(finish[i]==0)
flag1=1;
//判断各进程是否能够安全结束标志,1表示不能安全结束
break;
if(flag1==0)
return0;
//预分配安全
else
return1;
//预分配不安全
}
intdiaodu()
intname;
intr=0;
//
printf("
请输入是几号进程申请资源\n"
);
scanf("
%d"
&
name);
getchar();
printf("
请输入进程%d申请%i资源的个数\n"
name,i);
scanf("
request[i]);
getchar();
while(need[name][i]<
request[i])
printf("
不允许索取大于需求量,请重新输入\n"
scanf("
if(available[i]<
检查用户的请求大于系统中的可利用资源数量,进程%d先等待。
。
\n"
name);
r=1;
break;
if(r==0)
//进行资源的预分配
for(i=0;
available[i]=available[i]-request[i];
allocation[name][i]=allocation[name][i]+request[i];
need[name][i]=need[name][i]-request[i];
return1;
//预分配成功
else
return0;
//预分配失败
voidmain()
inti=0,j=0;
intq=1;
//继续分配标志。
0表示不继续分配1表示继续分配
intname=0;
//申请资源进程的名字
printf("
请输入最大需求矩阵\n"
//printf("
请输入进程%d的各资源最大需要的数量\n"
i);
for(j=0;
j<
j++)
max[i][j]);
请输入各进程已分配的矩阵\n"
//printf("
请输入进程%d的各资源已分配的数量\n"
allocation[i][j]);
请输入各进程还需要各资源所需数量的矩阵\n"
请输入进程%d还需要各资源的数量\n"
need[i][j]);
请输入各资源可利用的数量\n"
available[i]);
//
//调度并检测安全性
do
intr=diaodu();
switch(r)
case1:
k=safe();
if(k==0)//预分配安全
{
分配成功!
!
结果如下"
各进程已分配的矩阵\n"
for(i=0;
{
for(j=0;
j++)
{
printf("
%d,"
allocation[i][j]);
//打印输出各进程已分配的矩阵
}
printf("
}
各进程还需要各资源的矩阵\n"
i++)
{
need[i][j]);
//打印输出各进程还需要各资源的矩阵
}
各资源可利用的数量\n"
{
available[i]);
//打印输出各资源可利用的数量
}
else//预分配不安全
调度失败!
"
//撤销预分配的资源
available[i]=available[i]+request[i];
allocation[name][i]=allocation[name][i]-request[i];
need[name][i]=need[name][i]+request[i];
}
case0:
是否继续,输入0否,输入1继续\n"
q);
}while(q==1);
四、原始数据纪录:
输入数据:
最大需求矩阵:
已分配的矩阵还需求的矩阵可利用的数量
进程0:
7,5,30,1,07,4,33,3,2
进程1:
3,2,22,0,01,2,2
进程2:
9,0,23,0,26,0,0
进程3:
2,2,22,1,10,1,1
进程4:
4,3,30,0,24,3,1
T0时刻:
0号进程申请:
1,0,2
T1时刻:
1号进程申请:
3,3,0
T2时刻:
3号进程申请:
0,1,0
输出数据:
五:
结论
如图所示,实际输出数据与预期的输出相同。
通过本次上机实验熟悉了银行家算法,深入了解了计算机利用银行家算法避免死锁的机制。
有利于以后更好的理解操作系统内部各个机制功能的实现。
附录:
用C语言实现提示
1.算法用到的主要数据结构
(1)可利用资源向量intAvailable[M]//M为资源的类型
(2)最大需求矩阵intMax[N][M]//N为进程的数量
(3)已分配矩阵intAllocation[N][M]
(4)还需求矩阵intNeed[N][M]
(5)申请各类资源数量intRequest[x];
//进程对某一类资源的请求
(6)工作向量intWork[x];
(7)进程结束标识数组intFinish[y];
//表示系统是否有足够的资源分配给进程y,0为否,1为是
2.银行家算法(主程序)
(1)系统初始化。
输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等。
(2)输入用户的请求三元组(i,j,k),为进程i申请k个j类资源。
(3)检查用户的请求是否小于还需求的数量,条件是k<
=Need[i,j]。
如果条件不符则提示重新输入,即不允许索取