1、银行家算法实验报告计算机操作系统实验报告一、 实验名称:银行家算法二、 实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死 锁等概念,并体会和了解死锁和避免死锁的具体实施方法。三、 问题分析与设计:1、 算法思路:先对用户提出的请求进行合法性检查,即检查 请求是否大于需要的,是否大于可利用的。若请求合法,则进 行预分配,对分配后的状态调用安全性算法进行检查。若安 全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒 绝申请。2、 银行家算法步骤:(1)如果ReqUeStk or =Need则转向步骤(2);否则,认为出错,因为它所需要
2、的资源数已超过它所宣布的最大值。(2)如果RequeSkor=AVailable,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。(3)系统试探把要求的资源分配给进程 Pi,并修改下面数据结构中的数值:AVaiIabIe=AVailable-Requesti;Allocatio n=Allocatio n+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于 安全状态。3、安全性算法步骤:(1)设置两个向量工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时, WOrk=AIlocati
3、o n;布尔向量FiniSh。它表示系统是否有足够的资源分配给进程,使 之运行完成,开始时先做Finishi=false,当有足够资源分配给进程 时,令 Finishi=true。(2)从进程集合中找到一个能满足下述条件的进程:1Fini shi=false2Needvor=Work如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配 给它的资源,故应执行:WOrk=Work+Allocatio n;Fini shi=true;转向步骤(2)。(4)如果所有进程的Finishi=true,则表示系统处于安全状态;否 则,系统处于不安全状态。
4、4、流程图:系统主要过程流程图I进W银行家算法流程图安全性算法流程图(mSaftyi J)四、实验代码:#defi ne M 5#defi ne N 3本实验中使用到的库函数开始定义银行家算法中需要用到的数据#i nclude VStdio.h Il#i nclude #in clude int max 51; /int allocation51;int need 51;int available1;int request51;Char *fini sh5;int safe5;int n,i,m;int k=0;int j=0;int work1;int WorkS51;void Iin e(
5、) Il 美化程序,使程序运行时更加明朗美观void Start() /Iin e();Printf(Printf(Iin e();void en d() /Iin e();Printf(Iin e();void in put() /表示银行家算法开始表示银行家算法结束银行家算法开始n);死锁避免方法银行家算法结束,谢谢使用n);输入银行家算法起始各项数据n);Printf( n);for (n=0;n5;n+)Printf( 请输入进程P%d的相关信息:n,n);Prin tf(Max:);for (m=0;m1;m+)SCan f(%d, &max nm);Prin tf(Allocati
6、o n:);for (m=0;m1;m+)SCan f(%d, &allocatio nn m);for (m=0;m1;m+)n eed nm=max nm-allocatio nn m;Prin tf( 请输入系统可利用资源数 Available:);for (m=0;m1;m+)SCa nf(%d,&availablem);void OUtPUt() ZZ 输出系统现有资源情况Iin e();Printf(资源情况 MaX Allocation Need AVailablen);Prin tf(进程 A A A A n);Iin e();for(n=0;n5;n+)Prin tf(P%d
7、%3d%3d%3d, n,max n0,allocatio nn 0, need n0); if (n=0)Prin tf(%3d%3dn,available0);elsePrin tf(n);Iin e();时,系统把资源分配给void Cha nge() ZZ 进程 Pi , AVaiIablej 当 ReqUeSti,j=Availablej和Needi,j 发生改变for (m=0;m1;m+) availablem-=requestim; allocati On im+=requestim; n eedim-=requestim;void OUtPUtSafe() / 输出安全序列的
8、资源分配表Printf(该安全序列的资源分配图如下: n);Iin e();Printf(资源情况 WorkNeedAllocatio n Work+Allocatio nFi nish n);Printf(进程 A AAA n);Iin e();for(n=0;n5;n+)Prin tf(P%d%9d%3d%3d%5d%12sn,safe n,workssafe n0, needsaf en 0,allocatio n safe n 0,workssafe n0+allocatio nsafe n 0,fini sh n);Iin e();int CheCk() / 安全性算法Printf(
9、 开始执行安全性算法n);for (m=0;m1;m+) / 数组 work 和 finish 初始化workm=availablem;for (n=0;n5;n+)fin ish n=false;safe n=0;k=0;for (m=0;m5;m+)for (n=0;n5;n+)if(strcmp(finishn,false)=。&need n0=work0 ) / 查找可以分配资源但尚未分配到资源的进程safek=n; / 以数组safek记下各个进程得到分配的资源的顺序workssafek0=work0;进程执行后释变为1以示该进work0+=allocatio nn 0; /放出分配
10、给它的资源finishn=ture; /finishn程完成本次分k+;for (m=0;mP%d-P%d-P%d- P%d 系统是安全的 n,safe0,safe1,safe2,safe3,safe4);j=1;OUtPUtSafe(); / 输出安全序列的资源分配表return 1;void mai n() / 主程序开始Start();for (;j=0;) Il 确认输入数据的正确性,若输入错误,重新输入in put();Printf( 以下为进程资源情况,请确认其是否正确: n);OUtPUt();Printf( 数据是否无误:n正确:输入1n错误:输入0n请输入:);SCa nf(
11、%d,&j);Printf( 数据确认无误,算法继续。n);if (CheCk()=0) Il 若CheCk函数返回值为0,表示输入的初始数据找不到安全序列,无法进行下一步,程序结束en d();exit(0);Printf( 请输入请求资源的进程i(0、1、2、3、4) : ); Zz 输入发出请求向量的进程及请求向量SCa nf(%d,&i);Printf( 请输入进程P%d的请求向量ReqUeSt%d: ,i,i);for(n=0;n needi0;) / 若请求向量大于需求资源,则认为是输入错误,要求重新输入Printf( 数据输入有误,请重试! n请输入进程P%d的请求向量 ReqU
12、eSt%d: ,i,i);for(n=0;n 1; n+)SCan f(%d, &requesti n);if(reques ti 0=available0) / 判断系统是否有足够资源提供分配Printf( 系统正在为进程P%d分配资源n,i);Chan ge(); / 分配资源j=0;elsePrintf( 系统没有足够的资源,进程 P%d需要等待。n,i);if (j=0) /j=0 表示系统有足够资源分配的情况Printf( 当前系统资源情况如下:n); / 输出分配资源后的系统资源分配情况OUtPUt();if(check()=0) /若找不到安全系列,则之前的资源分配无效状态。n);资源状态Prin tf( 本次资源分配作废,恢复原来的资源分配for (m=0;m1;m+) ZZ 恢复分配资源前的系统availablem+=requestim;allocati On im-=requestim;n eedim+=requestim;OUtPUt(); ZZ 输出系统资源状态
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1