银行家算法.docx
- 文档编号:7728311
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:15
- 大小:141.47KB
银行家算法.docx
《银行家算法.docx》由会员分享,可在线阅读,更多相关《银行家算法.docx(15页珍藏版)》请在冰豆网上搜索。
银行家算法
试验名称
银行家算法
系别
机电工程
姓名
徐伟杰
张旭
学号
1032107219
1032107227
班级
计算机工程1022
一、试验目的
银行家算法是避免死锁的代表性算法。
本试验旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。
然后依照本试验,自行设计模拟程序。
二、试验环境
Windows环境下虚拟镜像Linux系统进行试验
三、试验内容
银行家算法的模拟。
(1)我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进城向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进城分配资源,当进城首次申请资源时,要测试该进城对资源的最大需求量,如果系统现存的资源可以满足他的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中,继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过,则再测试系统现存的资源是否能满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
(2)安全状态:
如果存在一个由系统中所有近程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
①不安全状态:
不存在一个安全序列。
不安全状态一定导致死锁。
②安全序列:
一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n)它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj(j
(3)设requesti为进程p[i]请求的向量,如果requesti[j]=K,表示进程p[i]需要K个Rj资源。
当系统发出请求后,系统按下述步骤开始检查:
如果requesti[j]<=need[i][j],转向步骤2;否则报告出错,申请的资源已经大于它需要的最大值。
如果requesti[j]<=available[j],转向步骤3;否则报告出错,尚无足够的资源。
③系统试探着把资源分配给p[i],并修改下列数绝结构中的值:
available[j]=available[j]-request[j]
allocation[i][j]=allocation[i][j]+request[j]
need[i][j]=need[i][j]-requesr[j]
④系统进行安全性算法,检查此次分配后,系统时候还处于安全状态,若安全,则把资源分配给进程p[i];否则,恢复原来的资源分配状态,让进程p[i]等待。
(4)安全性算法:
intwork[RESOURCE_NUMBER];
boolfinish[PROCESS_NUMBER];
①
Work=Available;
Finish=false;
②寻找满足条件的i:
·Finish[i]=false;
·Need[i]≤Work;
如果不存在,则转④。
③Work:
=Work+Allocation[i];Finish[i]:
=true;转②。
④若对所有i,Finish[i]=true,则系统处于安全状态,否则处于不安全状态。
(5)按模拟算法设计程序,运行设计的程序,观察得到的结果。
四、试验结果
//包含所需要的头文件
#include
#include
#include
#definePROCESS_NUMBER5//进程数
#defineRESOURCE_NUMBER3//资源数
#definetrue1
#definefalse0
typedefintbool;
//系统可用资源向量
intAvailable[RESOURCE_NUMBER]={2,1,2};
//最大需求向量
intMax[PROCESS_NUMBER][RESOURCE_NUMBER]=
{
{3,2,2},
{6,1,3},
{3,1,4},
{4,2,2},
{3,1,3}
};
//资源分配向量
intAllocation[PROCESS_NUMBER][RESOURCE_NUMBER]=
{
{1,0,0},
{4,1,1},
{2,1,1},
{0,0,2},
{1,0,3},
};
//需求向量
intNeed[PROCESS_NUMBER][RESOURCE_NUMBER];
//比较两个一维数组
//判断a>=b是否成立
boolcompare(int*a,int*b,intn)
{
inti;
for(i=0;i if(a[i] returnfalse; returntrue; } //一维数组加法 //a=a+b voidadd(int*a,int*b,intn) { inti; for(i=0;i a[i]+=b[i]; } //一维数组减法 //a=a-b voidsubstract(int*a,int*b,intn) { inti; for(i=0;i a[i]-=b[i]; } //将数组b的值赋给a,n为数组的大小 voidassign(int*a,int*b,intn) { inti; for(i=0;i a[i]=b[i]; } //判断是否是安全状态 //av可用资源矩阵 //sp记录安全路径 boolissafe(int*sp) { inti; intcount=0;//记录finish[i]=true的个数 intn=0; intwork[RESOURCE_NUMBER]; boolfinish[PROCESS_NUMBER]; //work=av; assign(work,Available,RESOURCE_NUMBER); //setfinish for(i=0;i finish[i]=false; //n为进程的个数 //循环最多执行n次 n=PROCESS_NUMBER; while(n--) for(i=0;i //判断能否满足进程i的要求,work>=Need[i]是否成立 if(finish[i]==false&&compare(work,Need[i],RESOURCE_NUMBER)) { //分配,待进程完成后再释放 add(work,Allocation[i],RESOURCE_NUMBER); finish[i]=true; //记录安全路径 sp[count]=i; //能满足的进程数+1 count++; } if(count>=PROCESS_NUMBER) returntrue; else returnfalse; } //请求分配 //pid进程,r请求向量,n资源个数 boolrequest(intpid,int*r,intn) { inti; //记录安全路径 intsp[5]; if(compare(Need[pid],r,n)==true&&compare(Available,r,n)==true) { //尝试分配资源 substract(Available,r,RESOURCE_NUMBER); add(Allocation[pid],r,RESOURCE_NUMBER); substract(Need[pid],r,RESOURCE_NUMBER); //判断是否是安全状态 if(issafe(sp)) { //打印安全路径 printf("SecurityPath: \n\t"); for(i=0;i printf("p%d",sp[i]); printf("\n"); //可以分配 returntrue; } else { //不分配 //恢复到分配前的状态 add(Available,r,RESOURCE_NUMBER); substract(Allocation[pid],r,RESOURCE_NUMBER); add(Need[pid],r,RESOURCE_NUMBER); returnfalse; } } else returnfalse; } //printoutthearray voidprint(int*a,intn) { inti; for(i=0;i printf("%4d",a[i]); printf("\n"); } //提示信息 charhint() { charch; printf("\t----------OperationHint----------\n"); printf("\tA(a)----ApplyForResourceautomated\n"); //Aaforautomated printf("\tH(h)-----ApplyForResourceByHuman\n"); //Hhforbyhuman printf("\tQ(q)----------------------------quit\n"); //Qqforquit scanf("%c",&ch); returnch; } //显示系统信息 voidinit() { inti; inttemp[RESOURCE_NUMBER]; printf("ProcessNumbers: %d\nNeedandAllocationrespectivelyasfollow: \n",PROCESS_NUMBER); //显示进程最大资源需求 for(i=0;i { printf("\tprocess%dmaxneed: ",i); print(Max[i],RESOURCE_NUMBER); } printf("\n"); //计算需求向量Need[i]=Max[i]–Allocation[i] for(i=0;i { assign(temp,Max[i],RESOURCE_NUMBER); substract(temp,Allocation[i],RESOURCE_NUMBER); assign(Need[i],temp,RESOURCE_NUMBER); } //显示进程已分配资源 for(i=0;i { printf("\tprocess%dallocatedresources: ",i); print(Allocation[i],RESOURCE_NUMBER); } //显示进程已分配资源 printf("\tavailableresources: \t",i); print(Available,RESOURCE_NUMBER); } //输入 voidinput(int*r,intn,int*id) { inti; //提示输入进程号 printf("pleaseinputprocessid(0~%d): ",n-1); //从进程输入进程号 scanf("%d",id); //从键盘输入该进程所需要的资源数目 for(i=0;i { printf("\nthenumbersofneededresource%d(int): ",i); scanf("%d",&r[i]); } //显示刚才所输入的数据 printf("\ndatayouinputed: Request[%d](",*id); for(i=0;i printf("%d",r[i]); printf(")\n"); } //检查输入 boolcheck(intid,int*r,intn) { inti; //判断申请资源数目是否合法 for(i=0;i if(r[i]<0) returnfalse; //判断进程号是否合法 if(id>=PROCESS_NUMBER) returnfalse; else returntrue; } intmain() { //进程id intid; //控制字符 charcontrol; //资源请求向量 intr[3]; //显示开始信息 init(); //随机数初始化 srand((int)time(0)); while (1) { //提示 control=hint(); if(control=='a'||control=='A') { //随机申请资源 id=rand()%5; r[0]=rand()%5; r[1]=rand()%5; r[2]=rand()%5; //显示申请信息 printf("\tRequest[%d](%d,%d,%d)\n",id,r[0],r[1],r[2]); if(request(id,r,RESOURCE_NUMBER)) printf("AllocSuccess! \n"); else printf("AllocFailed! \n"); } elseif(control=='h'||control=='H') { //输入申请信息 input(r,RESOURCE_NUMBER,&id); //检查输入是否合法 if(check(id,r,RESOURCE_NUMBER)==false) { printf("\nInputError! Pleasereinput! \n"); continue; } //执行 if(request(id,r,RESOURCE_NUMBER)) printf("RequestSucceed! \n"); else printf("RequestFail! \n"); } elseif(control=='q'||control=='Q') exit(0); //显示当前系统资源和进程情况 //显示可用资源情况 printf("AvailableResources\n"); print(Available,RESOURCE_NUMBER); //显示资源最大需求 printf("porcess%dmaxneed\n",id); print(Max[id],RESOURCE_NUMBER); //显示已分配资源情况 printf("process%dallocatedresources\n",id); print(Allocation[id],RESOURCE_NUMBER); } return0; } 手工分配效果图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法