银行家算法及流程图.docx
- 文档编号:3134797
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:9
- 大小:74.15KB
银行家算法及流程图.docx
《银行家算法及流程图.docx》由会员分享,可在线阅读,更多相关《银行家算法及流程图.docx(9页珍藏版)》请在冰豆网上搜索。
银行家算法及流程图
银行家算法及流程图
算法的实现
一、初始化
由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
二、银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST[i],则银行家算法按如下规则进行判断。
(1)如果REQUEST[cusneed][i]<=NEED[cusneed][i],则转
(2);否则,出错。
(2)如果REQUEST[cusneed][i]<=AVAILABLE[cusneed][i],则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
三、安全性检查算法
(1)设置两个工作向量Work=AVAILABLE;FINISH
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<=Work;
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;
Finish=true;
GOTO2
(4)如所有的进程Finish=true,则表示安全;否则系统不安全。
各算法流程图
初始化算法流程图:
银行家算法流程图:
安全性算法流程图:
源程序清单
#include
usingnamespacestd;
#defineMAXPROCESS50 /*最大进程数*/
#defineMAXRESOURCE100 /*最大资源数*/
intAVAILABLE[MAXRESOURCE]; /*可用资源数组*/
intMAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩阵*/
intALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩阵*/
intNEED[MAXPROCESS][MAXRESOURCE]; /*需求矩阵*/
intREQUEST[MAXPROCESS][MAXRESOURCE]; /*进程需要资源数*/
boolFINISH[MAXPROCESS]; /*系统是否有足够的资源分配*/
intp[MAXPROCESS]; /*记录序列*/
intm,n; /*m个进程,n个资源*/
voidInit();
boolSafe();
voidBank();
intmain()
{
Init();
Safe();
Bank();
}
voidInit() /*初始化算法*/
{
inti,j;
cout<<"请输入进程的数目:
";
cin>>m;
cout<<"请输入资源的种类:
";
cin>>n;
cout<<"请输入每个进程最多所需的各资源数,按照"< for(i=0;i for(j=0;j cin>>MAX[i][j]; cout<<"请输入每个进程已分配的各资源数,也按照"< for(i=0;i { for(j=0;j { cin>>ALLOCATION[i][j]; NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; if(NEED[i][j]<0) { cout<<"您输入的第"< "< j--; continue; } } } cout<<"请输入各个资源现有的数目: "< for(i=0;i { cin>>AVAILABLE[i]; } } voidBank() /*银行家算法*/ { inti,cusneed; charagain; while (1) { cout<<"请输入要申请资源的进程号(注: 第1个进程号为0,依次类推)"< cin>>cusneed; cout<<"请输入进程所请求的各资源的数量"< for(i=0;i { cin>>REQUEST[cusneed][i]; } for(i=0;i { if(REQUEST[cusneed][i]>NEED[cusneed][i]) { cout<<"您输入的请求数超过进程的需求量! 请重新输入! "< continue; } if(REQUEST[cusneed][i]>AVAILABLE[i]) { cout<<"您输入的请求数超过系统有的资源数! 请重新输入! "< continue; } } for(i=0;i { AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; } if(Safe()) { cout<<"同意分配请求! "< } else { cout<<"您的请求被拒绝! "< for(i=0;i { AVAILABLE[i]+=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]-=REQUEST[cusneed][i]; NEED[cusneed][i]+=REQUEST[cusneed][i]; } } for(i=0;i { FINISH[i]=false; } cout<<"您还想再次请求分配吗? 是请按y/Y,否请按其它键"< cin>>again; if(again=='y'||again=='Y') { continue; } break; } } boolSafe() /*安全性算法*/ { inti,j,k,l=0; intWork[MAXRESOURCE]; /*工作数组*/ for(i=0;i Work[i]=AVAILABLE[i]; for(i=0;i { FINISH[i]=false; } for(i=0;i { if(FINISH[i]==true) { continue; } else { for(j=0;j { if(NEED[i][j]>Work[j]) { break; } } if(j==n) { FINISH[i]=true; for(k=0;k { Work[k]+=ALLOCATION[i][k]; } p[l++]=i; i=-1; } else { continue; } } if(l==m) { cout<<"系统是安全的"< cout<<"安全序列: "< for(i=0;i {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法 流程图