《银行家算法c++语言(流程图代码全)(共18页).docx》由会员分享,可在线阅读,更多相关《银行家算法c++语言(流程图代码全)(共18页).docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上操作系统教程 银行家算法院 系计算机与软件学院班 级08软件工程2班学 号姓 名何丽茗一、实验目的银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。二、实验内容根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。三、实验方法开 始输入资源数m, 及各类资源总数,初始化Available向量输入进程数n,i=1输入进程i的最大需求向量max。inmax资源总数提示错误重新输入i加1任选一个进程作为当前
2、进程输入该进程的资源请求量Request 调用银行家算法,及安全性算法,完成分配,或并给出提示Need向量为0该进程已运行结束Need矩阵为0所有进程运行都结束结 束NYYNNY初始化need 矩阵NY1. 算法流程图 2. 算法数据结构1) 可利用资源向量Available ,它是一个最多含有100个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available(j)=k,标是系统中现有j类资源k个。2) 最大需求矩阵Max,这是一个nm的矩阵,它定义了系统中n个进程中的每一个进程对m类资
3、源的最大需求。如果Max(i,j)=k,表示进程i需要j类资源的最大数目为k。3) 分配矩阵Allocation,这也是一个nm的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Allocation(i,j)=k,表示进程i当前已经分到j类资源的数目为k。Allocation i表示进程i的分配向量,有矩阵Allocation的第i行构成。4) 需求矩阵Need,这还是一个nm的矩阵,用以表示每个进程还需要的各类资源的数目。如果Need(i,j)=k,表示进程i还需要j类资源k个,才能完成其任务。Need i表示进程i的需求向量,由矩阵Need的第i行构成。5) 上述三个矩阵
4、间存在关系:Need(i,j)=Max(i,j)-Allocation(i,j);3. 银行家算法设Requesti 是进程i的请求向量,如果Requesti,j=K,表示进程i需要K个j类型的资源。当i发出资源请求后,系统按下述步骤进行检查:1) 如果Request i Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。2) 如果Request i Available,则转向步骤3;否则,表示系统中尚无足够的资源满足i的申请,i必须等待。3) 系统试探性地把资源分配给进程i,并修改下面数据结构中的数值:Available = Available - Req
5、uest iAllocation i= Allocation i+ Request iNeed i= Need i - Request i4) 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。如果安全才正式将资源分配给进程i,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程i等待。四、实验代码以及运行示例1. 源代码:#include#include#include#define False 0#define True 1using namespace std;int Max100100=0;/各进程所需各类资源的最大需求int Avaliable100=0;
6、/系统可用资源char name100=0;/资源的名称int Allocation100100=0;/系统已分配资源int Need100100=0;/还需要资源int Request100=0;/请求资源向量int temp100=0;/存放安全序列int Work100=0;/存放系统可提供资源int M=100;/进程的最大数为int N=100;/资源的最大数为void showdata()/显示资源矩阵int i,j;cout系统目前可用的资源Avaliable:endl;for(i=0;iN;i+) coutnamei ;coutendl;for (j=0;jN;j+) cout
7、Avaliablej ;/输出分配资源coutendl;cout Max Allocation Needendl;cout进程名 ;for(j=0;j3;j+)for(i=0;iN;i+)coutnamei ;cout ;coutendl;for(i=0;iM;i+)cout i ;for(j=0;jN;j+)coutMaxij ;cout ;for(j=0;jN;j+)coutAllocationij ;cout ;for(j=0;jN;j+)coutNeedij ;coutendl;int changdata(int i)/进行资源分配 int j;for (j=0;jM;j+) Aval
8、iablej=Avaliablej-Requestj;Allocationij=Allocationij+Requestj;Needij=Needij-Requestj;return 1;int safe()/安全性算法int i,k=0,m,apply,Finish100=0;int j;int flag=0;Work0=Avaliable0;Work1=Avaliable1;Work2=Avaliable2;for(i=0;iM;i+) apply=0;for(j=0;jN;j+)if (Finishi=False&Needij=Workj) apply+;if(apply=N)for(m
9、=0;mN;m+)Workm=Workm+Allocationim;/变分配数Finishi=True;tempk=i;i=-1; k+;flag+;for(i=0;iM;i+)if(Finishi=False)cout系统不安全endl;/不成功系统不安全return -1; cout系统是安全的!endl;/如果安全,输出成功 cout分配的序列:;for(i=0;iM;i+)/输出运行进程数组couttempi;if(iM-1) cout;coutendl;return 0;void share()/利用银行家算法对申请资源对进行判定char ch;int i=0,j=0;ch=y;co
10、ut请输入要求分配的资源进程号(0-M-1i;/输入须申请的资源号cout请输入进程i 申请的资源:endl;for(j=0;jN;j+)coutnamejRequestj;/输入需要申请的资源 for (j=0;jNeedij)/判断申请是否大于需求,若大于则出错 cout进程i申请的资源大于它需要的资源;cout 分配不合理,不予分配!Avaliablej)/判断申请是否大于当前资源,若大于则 /出错cout进程i申请的资源大于系统现在可利用的资源;cout 分配出错,不予分配!endl;ch=n;break; if(ch=y) changdata(i);/根据进程需求量变换资源showd
11、ata();/根据进程需求量显示变换后的资源safe();/根据进程需求量进行银行家算法判断 void addresources()/添加资源 int n,flag;coutn;flag=N;N=N+n;for(int i=0;in;i+)coutnameflag;coutAvaliableflag+;showdata();safe();void delresources()/删除资源char ming;int i,flag=1;coutming;for(i=0;iN;i+)if(ming=namei)flag=0;break;if(i=N)cout该资源名称不存在,请重新输入:;while(
12、flag);for(int j=i;jN-1;j+)namej=namej+1;Avaliablej=Avaliablej+1;N=N-1;showdata();safe();void changeresources()/修改资源函数cout系统目前可用的资源Avaliable:endl; for(int i=0;iN;i+) coutnamei:Avaliableiendl;cout输入系统可用资源Avaliable:Avaliable0Avaliable1Avaliable2;cout经修改后的系统可用资源为endl;for (int k=0;kN;k+)coutnamek:Avaliab
13、lekendl;showdata();safe();void addprocess()/添加作业 int flag=M;M=M+1;cout请输入该作业的最大需求量Maxendl;for(int i=0;iN;i+)coutnameiMaxflagi;Needflagi=Maxflagi-Allocationflagi;showdata();safe();int main()/主函数 int i,j,number,choice,m,n,flag; char ming;coutt-endl;coutt| |endl;coutt| 银行家算法的实现 |endl;coutt| |endl;coutt
14、| 08软工何丽茗 |endl;coutt| |endl;coutt| |endl;coutt-endl;coutn;N=n;for(i=0;in;i+)cout资源i+1ming;namei=ming;coutnumber;Avaliablei=number;coutendl;coutm;M=m;cout请输入各进程的最大需求量(m*n矩阵)Max:endl;for(i=0;im;i+)for(j=0;jMaxij;doflag=0;cout请输入各进程已经申请的资源量(m*n矩阵)Allocation:endl;for(i=0;im;i+)for(j=0;jAllocationij;if(
15、AllocationijMaxij) flag=1;Needij=Maxij-Allocationij;if(flag)cout申请的资源大于最大需求量,请重新输入!n;while(flag); showdata();/显示各种资源 safe();/用银行家算法判定系统是否安全 while(choice)coutt-银行家算法演示-endl;cout 1:增加资源 endl;cout 2:删除资源 endl;cout 3:修改资源 endl;cout 4:分配资源 endl;cout 5:增加作业 endl;cout 0:离开 endl;coutt-endl;coutchoice;switch
16、(choice)case 1: addresources();break;case 2: delresources();break;case 3: changeresources();break;case 4: share();break;case 5: addprocess();break;case 0: choice=0;break;default: cout请正确选择功能号(0-5)!endl;break; return 1;2. 运行结果:1) 初始化状态:2) 为进程0分配资源:3) 为进程4分配资源:五、实验总结本程序的设计实现主要是用C+语言。程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,让我彻底认识到自己的不足,也同时从中学到了更多。专心-专注-专业