《操作系统实验银行家算法》由会员分享,可在线阅读,更多相关《操作系统实验银行家算法(11页珍藏版)》请在金锄头文库上搜索。
1、昆明理工大学信息工程与自动化学院学生实验报告(2012 2013 学年第二学期)课程名称:操作系统开课实验室:信自楼4442013年12月10日年级、专业、班物联网111学号201010410125姓名丁洪超成绩实验项目名称银行家算法指导教师教师 评 语该同学是否了解实验内容与要求:A.了解口B.基本了解口C.不了解口设计思想或流程图是否正确:A.正确口B.基本正确口C.较差 口该同学的实验能力:A.强口B.中等口C.差口该同学的实验是否达到要求:A.达到口B.基本达到口C.未达到口实验报告是否规范:A.规范口B.基本规范口C.不规范口是否有运行结果与分析:A.详细口B.一般口C.没有口是否有
2、总结与体会:A.详细口B.一般口C.没有口教师签名:年月日、实验目的银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的 银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死 锁的具体实施方法。二、实验题目1. 设计进程对各类资源最大申请表示及初值确定。2. 设定系统提供资源初始状况。3. 设定每次某个进程对各类资源的申请表示。4. 编制程序,依据银行家算法,决定其申请是否得到满足。三、算法设计的思想或流程图1.设计思想a. 数据结构假设有M个进程N类资源,则有如下数据结构:MAXM*N M个进程对N类资源的最大需求量AVAILABLEN系统可
3、用资源数ALLOCATIONM*N M个进程已经得到N类资源的资源量NEEDM*N M个进程还需要N类资源的资源量b. 银行家算法设进程I提出请求RequestN,则银行家算法按如下规则进行判断。(1) 如果 RequestNv=NEEDI, N,则转(2);否则,出错。(2) 如果 RequestNv=AVAILABLE,则转(3);否则,出错。(3) 系统试探分配资源,修改相关数据:AVAILABLE=AVAILABLE-REQUESTALLOCATION=ALLOCATION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作
4、废,系统恢复原状, 进程等待。c. 安全性检查(1) 设置两个工作向量 WORK=AVAILABLE; FINISHM=FALSE(2) 从进程集合中找到一个满足下述条件的进程,FINISHi=FALSENEEDv=WORK如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。WORK=WORK+ALLOCATIONFINISH=TRUEGO TO 2如所有的进程FinishM=true,则表示安全;否则系统不安全。 画出程序的流程图如下:四、编写的相关程序代码#include vstring.h#include vstdio.h#includevstd
5、lib.h#include viostream.h#define FALSE 0#define TRUE 1#define W 10#define R 10int M ; /总进程数int N ; /资源种类int ALL_RESOURCEW;各种资源的数目总和int MAXWR; / M个进程对N类资源最大资源需求量int AVAILABLER; /系统可用资源数int ALLOCATIONWR; / M个进程已经得到N类资源的资源量int NEEDWR; / M个进程还需要N类资源的资源量int RequestR; /请求资源个数void output()int i,j;coutvvend
6、lvvvvendl;cout各种资源的总数量:vvendl;for (j=0;jvN;j+)coutvv资源vvjvv: ALL_RESOURCEj;coutvvendl;coutvvvvendl;coutvv目前各种资源可利用的数量为:vvendl;for (j=0;jvN;j+)coutvv资源vvjvv: vvAVAILABLEj;coutvvendl;coutvvvvendl;coutvv各进程还需要的资源数量:vvendlvvendl;for(i=O;ivN;i+)coutvv资源vvi;coutvvendl;for (i=0;ivM;i+)coutvv进程vvivv:;coutvv
7、endl;for (j=0;jvN;j+)coutvvNEEDijvv coutvvendl;coutvvvvendl;coutvv各进程已经得到的资源量:vvendlvvendl;for(i=0;ivN;i+)coutvv资源vvi;coutvvendl;for (i=0;iM;i+)coutvv进程让:;for (j=0;jvN;j+)coutvvALLOCATIONijvv;coutvvendl;coutvvendl;void distribute(int k)int j;for (j=0;jvN;j+)AVAILABLEj=AVAILABLEj-Requestj;ALLOCATIONk
8、j=ALLOCATIONkj+Requestj;NEEDkj=NEEDkj-Requestj;void restore(int k)int j;for (j=0;jvN;j+)AVAILABLEj=AVAILABLEj+Requestj;ALLOCATIONkj=ALLOCATIONkj-Requestj;NEEDkj=NEEDkj+Requestj;int check()int WORKR,FINISHW;int i,j;for(j=0;jvN;j+) WORKj=AVAILABLEj;for(i=0;iM;i+) FINISHi=FALSE;for(i=0;iM;i+)for(j=0;jN
9、;j+)if(FINISHi=FALSE&N EEDijv=WORKj)WORKj=WORKi+ALLOCAriONij;FINISHi=TRUE;for(i=0;ivM;i+)if(FINISHi=FALSE)coutvvendl;coutvv系统不安全!!本次资源申请不成功!vvendl;coutvvendl;return 1;elsecoutvvendl;coutvv经安全性检查,系统安全,本次分配成功。vvendl;coutvvendl;return 0;void bank() /银行家算法int i=0,j=0;char flag=Y;while(flag=Yllflag=y)i=-
10、1;while(i=M)coutvvvvendl;coutwendlvv 请输入需申请资源的进程号:;cini;if(ivOlli=M) coutvv输入的进程号不存在,重新输入!vvendl;coutvv 请输入进程vvivv申请各类资源的数量:vvendl; for (j=O;jvN;j+)coutvv资源vvjvv: ;cinRequestj; if(RequestjNEEDij) /若请求的资源数大于进程还需要i类资源的资源量j coutvvendlvv进程vvivv申请的资源数大于进程vvivv还需要vvjvv类资源的数量!”;coutvv若继续执行系统将处于不安全状态!vvendl
11、;flag=N;break;elseif(RequestjAVAILABLEj) /若请求的资源数大于可用资源数coutvvendlvv进程vvivv申请的资源数大于系统可用vvjvv类资源的数量!; coutvv若继续执行系统将处于不安全状态!vvendl;flag=N;break; if(flag=Yllflag=y)distribute(i); / 调用 change(i)函数,改变资源数 if(check() /若系统安全restore(i); /调用restore(i)函数,恢复资源数output();/输出资源分配情况else/若系统不安全output(); /输出资源分配情况el
12、se/ 若 flag=Nllflag=ncoutvvendl;coutvv是否继续银行家算法演示,按Y或y键继续,按N或n键退出演示:”;cinflag;void version()coutvvendl;coutvvt银行家算法vvendl;void main() / 主函数int i=O,j=O,p;char ch;version();printf(请按照提示依次输入相应的数据:nn);printf(”继续(Y/y) 退出(N/E or n/e) n);ch=getchar();if(Y=ch II y =ch)printf(现在请继续!nn);elseprintf(输入有误或者退出)再见!
13、 n);exit(0);coutvvendlvv请输入总进程数:;cinM;coutvvendlvvvvendl;coutvv请输入总资源种类:;cinN;coutvvendlvvvvendl;coutvv请输入各类资源总数:(需要输入数为vvNvv个)”;for(i=0;ivN;i+)cinALL_RESOURCEi;coutvvendlvvvvendl;coutvv输入各进程所需要的各类资源的最大数量(需要输入数为vvM*Nvv个)”;for (i=0;ivM;i+)for (j=0;jvN;j+)docinMAXij;if (MAXijALL_RESOURCEj)coutvvendlvv占有资源超过了声明的该资源总数请重新输入vvendl;while (MAXijALL_RESOURCEj);coutvvendlvvvvendl;coutvv输入各进程已经占据的各类资源的数量:(需要输入数为vvM*Nvv个)”;for (i=0;iM;i+)for (j=0;jMAXij)coutvvendlvv