当前位置:文档之家› 银行家算法

银行家算法

实验十银行家算法一、实验目的1、通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法。

2、掌握进程安全性检查的方法及资源分配的方法。

二、实验内容1、下面给出模拟银行家算法的部分代码,试补全安全性检查算法,实现程序基本功能。

要求:若系统是安全的,则在屏幕上输出,并且在屏幕上输出系统安全序列。

2、通过以上程序回答下面给出的例子的问题,并验证所编写程序的正确性。

例:某系统有A、B、C、D 4类共5个进程(P0、P1、P2、P3、P4)共享,各进程对资源的需求和分配情况如表1所示。

表1 各进程对资源的需求和分配情况表现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:1)现在系统是否处于安全状态?2)如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?2、安全序列输出不完整,请修改代码;3、当进程输入请求资源数,系统假如同意分配(即当下是安全的),增加显示当下剩余资源、已分配资源(矩阵)的功能;4、将手动输入的矩阵信息保存于文件中,程序能够将矩阵自动读出,不用手动输入;5、当申请资源反馈不安全的时候系统能为该进程重新计算资源数目,并且打印出此时若达到安全状态应该申请的最多资源为多少。

程序实现的界面如下图所示:三、设计理论基础银行家算法.顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。

在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。

如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。

把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。

当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。

“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。

显然,,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.四、算法描述及数据结构模型在该实验中设计银行家算法和安全检测性算法,下面分别对两种算法作具体的介绍。

1、银行家算法在避免死锁的方法中,如果所施加的限制条件较弱,有可能获得令人满意的系统性能。

在该方法中把系统的状态分为安全状态和不安全状态,只要能使得系统始终处于安全状态,便可以避免死锁。

基本思想是分配资源之前,判断系统是否是安全的;若安全,才分配。

它是最具有代表向的避免死锁的算法。

银行家算法流程如下:设进程P提出请求Request[i],则银行家算法按如下规则进行判断。

Step1:如果Request[i]<=Need[i],则转向Step2;否则,报错返回。

Step2:如果Request[i]<=Available[i],则转向Step3;否则,出错。

Step3:系统试探分配相关资源,修改系统状态:Available[i]=Available[i]-Request[i]Allocation[i]=Allocation[i]+Request[i]Need[i]=Need[i]-Request[i]Step4:系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

2、安全性检查安全性检查算法主要是根据银行家算法进行资源分配后,检查资源分配后的系统状态是否处于安全状态中。

具体算法如下所示:Step1:设置两个工作向量Work=Available;Finish=False;Step2:从进程集合中找到一个满足下述条件的进程,Finish=FalseNeed<=Work如找到,执行Step3;否则,执行Step4;Step3:设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work=Work+AllocationFinish=TrueGO TO Step2Step4:如所有的进程Finish=true,则表示该系统安全;否则系统不安全。

3、主要数据结构及说明(1) 可利用资源向量Available。

如果Available[j]=K,则表示系统中现有Rj类资源K个。

(2) 最大需求矩阵Max。

如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

(3) 分配矩阵Allocation。

如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。

(4) 需求矩阵Need。

如果Need[i,j]=K,则表示进程i还需要Rj类资源K 个,方能完成其任务。

Need[i,j]=Max[i,j]-Allocation[i,j]五、部分程序代码#include<iostream.h>int Max[50][100]={0};//各进程所需各类资源的最大需求int Available[100]={0};//系统可用资源int Allocation[50][100]={0};//系统已分配资源int Need[50][100]={0};//还需要资源int Request[50][100]={0};//请求资源向量int Finish[50]={0};int p[50]={0};int m,n; //m个进程,n个资源int IsSafe()//安全性算法{int i,j,l=0;int Work[100];for(i=0;i<n;i++)Work[i]= Available[i];for(i=0;i<m;i++)Finish[i]=0;for(i=0;i<m;i++){if(Finish[i]==1) continue;else{for(j=0;j<n;j++){if(Need[i][j]>Work[j]) break;}if(j==n){//安全性算法代码补充}else continue;}if(l==m){cout<<"系统是安全的"<<'\n';cout<<"安全序列是:\n";for(i=0;i<1;i++){cout<<p[i];if(i!=l-1) cout<<"-->";}cout<<'\n';return 1;}}}int main() //银行家算法{int i,j,mi;cout<<"输入进程的数目:\n";cin>>m;cout<<"输入资源的种类";cin>>n;cout<<"输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入\n";for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>Max[i][j];cout<<"输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入\n";for(i=0;i<m;i++){for(j=0;j<n;j++){cin>>Allocation[i][j];Need[i][j]=Max[i][j]-Allocation[i][j];if(Need[i][j]<0){cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:\n";j--;continue;}}}cout<<"请输入各个资源现有的数目:\n";for(i=0;i<n;i++)cin>>Available[i];IsSafe();while(1){cout<<"输入要申请资源的进程号(注:第1个进程号为0,以此类推)\n";cin>>mi;cout<<"输入进程所请求的各资源的数量\n";for(i=0;i<n;i++)cin>>Request[mi][i];for(i=0;i<n;i++){if(Request[mi][i]>Need[mi][i]){cout<<"你输入的请求数超过进程的需求量!\n";return 0;}if(Request[mi][i]>Available[i]){cout<<"你输入的请求数超过系统有的资源数!\n";return 0;}}for(i=0;i<n;i++){Available[i]-=Request[mi][i];Allocation[mi][i]+=Request[mi][i];Need[mi][i]-=Request[mi][i];}if(IsSafe()) cout<<"同意分配请求!\n";else{cout<<"你的请求被拒绝!\n";for(i=0;i<n;i++){Available[i]+=Request[mi][i];Allocation[mi][i]-=Request[mi][i];Need[mi][i]-=Request[mi][i];}}for(i=0;i<m;i++)Finish[i]=0;char YesOrNo;cout<<"你还想再次请求分配吗?是请按y/Y,否按n/N,再确定\n";while(1){cin>>YesOrNo;if (YesOrNo == 'y'||YesOrNo == 'Y'||YesOrNo == 'n'||YesOrNo == 'N') break;else{cout<<"请按要求输入:\n";continue;}}if(YesOrNo=='y'||YesOrNo=='Y') continue;else break;}}六、实验结果分析1、根据实验结果分析实验内容中的问题,并撰写到实验报告。

相关主题