银行家算法.docx

上传人:b****1 文档编号:2407308 上传时间:2022-10-29 格式:DOCX 页数:13 大小:100.73KB
下载 相关 举报
银行家算法.docx_第1页
第1页 / 共13页
银行家算法.docx_第2页
第2页 / 共13页
银行家算法.docx_第3页
第3页 / 共13页
银行家算法.docx_第4页
第4页 / 共13页
银行家算法.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

银行家算法.docx

《银行家算法.docx》由会员分享,可在线阅读,更多相关《银行家算法.docx(13页珍藏版)》请在冰豆网上搜索。

银行家算法.docx

银行家算法

洛阳理工学院实验报告

系别

计算机与信息工程系

班级

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]。

如果条件不符则提示重新输入,即不允许索取

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1