银行家算法.docx
- 文档编号:2407308
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:13
- 大小:100.73KB
银行家算法.docx
《银行家算法.docx》由会员分享,可在线阅读,更多相关《银行家算法.docx(13页珍藏版)》请在冰豆网上搜索。
银行家算法
洛阳理工学院实验报告
系别
计算机与信息工程系
班级
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]。 如果条件不符则提示重新输入,即不允许索取
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法