1、否则,该申请暂不能满足。实现银行家算法要有若干数据结构,它们用来表示资源分配系统的状态。令n表示系统中进程的数目,m表示资源的分类数。还需要以下数据结构:1. Available是一个长度为m的向量,它表示每类资源可用的数量。Available j=k,表示rj类资源可用的数量为k。2.Max是一个nm矩阵,它表示每个进程对资源的最大需求。Max i,j=k,表示进程pi至多可以申请k个rj类资源单位。3. Allocation是一个nm矩阵,它表示当前分给每个进程的资源数目。Allocation i,j=k,表示进程pi当前分到k个rj类资源。4. Need是一个nm矩阵,它表示每个进程还缺
2、少多少资源。Needi,j=k,表示进程pi尚需k个rj类资源才能完成其任务。显然Needi,j= Max i,j- Allocation i,j。这些数据结构的大小和数值随时间推移而改变。系统所执行的安全性算法描述如下:1.设置2个向量:工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work = Available。 Finishi :它表示系统是否有足够的资源分配给进程,使之完成运行。开始时先做Finishi=true。2.从进程集合中找到一个满足下述条件的进程:Finishi=flase;Needi,jWorkj;若找到,则执行
3、步骤3,否则,执行步骤4。3.当进程pi获得资源后,可顺利执行,直至完成,并释放分配给它的资源。4.如果所有进程的Finishi=true都满足。则表示系统处于安全状态;否则,系统处于不安全状态。2. 详细设计2.1 程序源代码#includestringstdiousing namespace std;#define False 0#define True 1int Max100100=0;/各进程所需各类资源的最大需求int Avaliable100=0;/系统可用资源char name100=0;/资源的名称int Allocation100100=0;/系统已分配资源int Need1
4、00100=0;/还需要资源int Request100=0;/请求资源向量int temp100=0;/存放安全序列int Work100=0;/存放系统可提供资源int M=100;/作业的最大数为100int N=100;/资源的最大数为100void showdata()/显示资源矩阵 int i,j; cout系统目前可用的资源Avaliable:endl; for(i=0;iN;i+)namei ; for (j=0;jj+)Avaliablej/输出分配资源 Max Allocation Need进程名 for(j=0;3;j+) M;i+)MaxijAllocationijNe
5、edijint changdata(int i)/进行资源分配 int j;for (j=0;j+) Avaliablej=Avaliablej-Requestj; Allocationij=Allocationij+Requestj; Needij=Needij-Requestj;return 1;int safe()/安全性算法int i,k=0,m,apply,Finish100=0;int flag=0;Work0=Avaliable0;Work1=Avaliable1;Work2=Avaliable2;for(i=0;i+) apply=0; if (Finishi=False&=W
6、orkj) apply+; if(apply=N) for(m=0;mm+) Workm=Workm+Allocationim;/变分配数 Finishi=True; tempk=i; i=-1; k+; flag+; if(Finishi=False)系统不安全/不成功系统不安全 return -1;系统是安全的!/如果安全,输出成功分配的序列:i+)/输出运行进程数组tempi; if(iM-1) cout return 0;void share()/利用银行家算法对申请资源对进行判定char ch;int i=0,j=0;ch=ycout请输入要求分配的资源进程号(0-M-1i;/输入须
7、申请的资源号请输入进程 申请的资源:for(j=0;namejNeedij)/判断申请是否大于需求,若大于则出错 进程 申请的资源大于它需要的资源 分配不合理,不予分配! ch=n break; else Avaliablej)/判断申请是否大于当前资源,若大于则 /出错进程申请的资源大于系统现在可利用的资源 分配出错,不予分配! if(ch=) changdata(i);/根据进程需求量变换资源 showdata();/根据进程需求量显示变换后的资源 safe();/根据进程需求量进行银行家算法判断void addresources()/添加资源 int n,flag;请输入需要添加资源种类
8、的数量:cinn;flag=N;N=N+n;for(int i=0;名称:nameflag;数量:Avaliableflag+;showdata();safe();void changeresources()/修改资源函数 for(int i=0;AvaliableiAvaliable1Avaliable2;经修改后的系统可用资源为for (int k=0;kk+)namekAvaliablekvoid delresources()/删除资源char ming;int i,flag=1;请输入需要删除的资源名称:doming; if(ming=namei) flag=0;if(i=N)该资源名
9、称不存在,请重新输入:while(flag);for(int j=i;N-1; namej=namej+1; Avaliablej=Avaliablej+1;N=N-1;void addprocess()/添加作业 int flag=M;M=M+1;请输入该作业的最大需求量MaxMaxflagi; Needflagi=Maxflagi-Allocationflagi;int main()/主函数 int i,j,number,choice,m,n,flag;*资源管理系统的设计与实现*请首先输入系统可供资源种类的数量:N=n;资源i+1的名称: namei=ming;资源的数量:number;
10、 Avaliablei=number;请输入作业的数量:m;M=m;请输入各进程的最大需求量(*nMaxij) flag=1; Needij=Maxij-Allocationij; if(flag)申请的资源大于最大需求量,请重新输入!n/显示各种资源/用银行家算法判定系统是否安全 while(choice)*银行家算法演示* 1:增加资源 2:删除资源 3:修改资源 4:分配资源 5:增加作业 0:离开 *请选择功能号:choice; switch(choice) case 1: addresources();break; case 2: delresources(); case 3: ch
11、angeresources(); case 4: share(); case 5: addprocess(); case 0: choice=0; default:请正确选择功能号(0-5)! return 1;3. 调试及运行结果3.1 程序调试及运行结果经过调试,改正了越界错误,定义错误,死循环和一些语法错误。程序最终运行成功。检测结果如下: 总结和体会 一周的课程设计结束了。在这一周里,我做一个模拟银行家算法。我觉得在着手设计前设计的思路是很重要的。只有思路清晰才能进行下一阶段的设计。这样才能完成整个程序的设计,完成整个文报告的书写。课程设计这几天学到的东西还真不少。以前不清楚的现在都暴露出来了。以前认为学了没用的东西现在也用到了。这次的课程设计使我进一步了解了调度与死锁的问题。以及有关资源申请的问题、避免死锁的具体实施方法。深入了解了银行家算法的资源申请和资源分配的过程及原则。保证系统处于安全状态。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2