银行家算法.docx
《银行家算法.docx》由会员分享,可在线阅读,更多相关《银行家算法.docx(13页珍藏版)》请在冰豆网上搜索。
![银行家算法.docx](https://file1.bdocx.com/fileroot1/2022-10/29/ad82bb4e-87c5-49be-9795-ca5946cb517c/ad82bb4e-87c5-49be-9795-ca5946cb517c1.gif)
银行家算法
洛阳理工学院实验报告
系别
计算机与信息工程系
班级
B100508
学号
B10050812
姓名
课程名称
计算机操作系统
实验日期
2012/12/13
实验名称
银行家算法
成绩
实验目的:
1.了解进程产生死锁的原因,了解为什么要进行死锁的避免。
2.掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。
一、实验条件:
计算机一台,软件vc++6.0
二、实验原理:
n个并发进程共享m个系统资源的系统,进程可动态申请资源和释放资源。
系统按各进程的申请动态的分配资源,先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检测算法进行安全性检测,如果系统分配资源,系统进入安全状态,则预分配就是正式分配,如果系统分配资源,系统进入不安全状态,则撤销预分配。
三、实验内容
#include
#include
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{
finish[i]=0;//各进程结束标志初始化为0。
}
for(i=0;i{
work[i]=available[i];//预分配后各资源可利用量赋值给work[]数组
}
while(j{
for(i=0;i{
if(!
finish[i])//i进程尚未分配
{
flag2=0;
for(k=0;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++;
}
for(i=0;i<5;i++)
{
if(finish[i]==0)
{
flag1=1;//判断各进程是否能够安全结束标志,1表示不能安全结束
break;
}
}
if(flag1==0)
return0;//预分配安全
else
return1;//预分配不安全
}
intdiaodu()
{
intname;
intr=0;//
inti=0;
intj=0;
printf("请输入是几号进程申请资源\n");
scanf("%d",&name);
getchar();
for(i=0;i{
printf("请输入进程%d申请%i资源的个数\n",name,i);
scanf("%d",&request[i]);
getchar();
while(need[name][i]{
printf("不允许索取大于需求量,请重新输入\n");
scanf("%d",&request[i]);
}
if(available[i]{
printf("检查用户的请求大于系统中的可利用资源数量,进程%d先等待。
。
。
\n",name);
r=1;
break;
}
}
if(r==0)
{
//进行资源的预分配
for(i=0;i{
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;
intk=0;
intr=0;
intq=1;//继续分配标志。
0表示不继续分配1表示继续分配
intname=0;//申请资源进程的名字
printf("请输入最大需求矩阵\n");
for(i=0;i{
//printf("请输入进程%d的各资源最大需要的数量\n",i);
for(j=0;j{
scanf("%d",&max[i][j]);
getchar();
}
}
printf("请输入各进程已分配的矩阵\n");
for(i=0;i{
//printf("请输入进程%d的各资源已分配的数量\n",i);
for(j=0;j{
scanf("%d",&allocation[i][j]);
getchar();
}
}
printf("请输入各进程还需要各资源所需数量的矩阵\n");
for(i=0;i{
//printf("请输入进程%d还需要各资源的数量\n",i);
for(j=0;j{
scanf("%d",&need[i][j]);
getchar();
}
}
printf("请输入各资源可利用的数量\n");
for(i=0;i{
scanf("%d",&available[i]);
getchar();
}
//
//调度并检测安全性
//
do
{
intr=diaodu();
switch(r)
{
case1:
k=safe();
if(k==0)//预分配安全
{
printf("分配成功!
!
!
结果如下");
printf("各进程已分配的矩阵\n");
for(i=0;i{
for(j=0;j{
printf("%d,",allocation[i][j]);//打印输出各进程已分配的矩阵
}
printf("\n");
}
printf("各进程还需要各资源的矩阵\n");
for(i=0;i{
for(j=0;j{
printf("%d,",need[i][j]);//打印输出各进程还需要各资源的矩阵
}
printf("\n");
}
printf("各资源可利用的数量\n");
for(i=0;i{
printf("%d,",available[i]);//打印输出各资源可利用的数量
}
printf("\n");
}
else//预分配不安全
{
printf("调度失败!
!
!
");
for(i=0;i{
//撤销预分配的资源
available[i]=available[i]+request[i];
allocation[name][i]=allocation[name][i]-request[i];
need[name][i]=need[name][i]+request[i];
}
}
break;
case0:
break;
}
printf("是否继续,输入0否,输入1继续\n");
scanf("%d",&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]。
如果条件不符则提示重新输入,即不允许索取