预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验三银行家算法 实验内容简要描述 实验目标: 加深了解有关资源申请、避免死锁等概念,并体会与了解死锁与避免死锁得具体实施方法. 要求编写与调试一个系统动态分配资源得简单模拟程序,观察死锁产生得条件,并采用银行家算法,有效得防止与避免死锁得发生。 实验要求: 银行家算法就是避免死锁得一种重要方法,本实验要求用高级语言编写与调试一个简单得银行家算法程序。 用银行家算法实现资源分配. 设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}得系统,例如,{A,B,C}得资源数量分别为10,5,7.进程可动态地申请资源与释放资源,系统按进程得申请动态地分配资源,要求程序具有显示与打印各进程得某一个时刻得资源分配表与安全序列;显示与打印各进程依次要求申请得资源号以及为某进程分配资源后得有关资源数据. 报告主要内容 设计思路 设计进程对各在资源最大申请表示及初值确定。 设定系统提供资源初始状态。 设定每次某个进程对各类资源得申请表示。 编制程序,依据银行家算法,决定其申请就是否得到满足。 主要数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N]M个进程对N类资源得最大需求量 AVAILABLE[N]系统可用资源数 ALLOCATION[M*N]M个进程已经得到N类资源得资源量 NEED[M*N]M个进程还需要N类资源得资源量 银行家算法: 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]〈=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE—REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 安全性检查: (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件得进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GOTO2 (4)如所有得进程Finish[M]=true,则表示安全;否则系统不安全。 主要代码 源程序: #include〈iostream> usingnamespacestd; #defineMAXPROCESS50/*最大进程数*/ #defineMAXRESOURCE100/*最大资源数*/ intAVAILABLE[MAXRESOURCE];/*可用资源数组*/ intMAX[MAXPROCESS][MAXRESOURCE];/*最大需求矩阵*/ intALLOCATION[MAXPROCESS][MAXRESOURCE];/*分配矩阵*/ intNEED[MAXPROCESS][MAXRESOURCE];/*需求矩阵*/ intREQUEST[MAXPROCESS][MAXRESOURCE];/*进程需要资源数*/ boolFINISH[MAXPROCESS];/*系统就是否有足够得资源分配*/ intp[MAXPROCESS];/*记录序列*/ intm,n;/*m个进程,n个资源*/ voidInit(); boolSafe(); voidBank(); intmain() { Init(); Safe(); Bank(); } voidInit()/*初始化算法*/ { inti,j; cout〈<"请输入进程得数目:"; cin〉〉m; cout〈〈"请输入资源得种类:”; cin>>n; cout<〈"请输入每个进程最多所需得各资源数,按照”〈〈m<<"x"<〈n〈<”矩阵输入"<〈endl; for(i=0;i<m;i++) for(j=0;j〈n;j++) cin>>MAX[i][j]; cout〈<"请输入每个进程已分配得各资源数,也按照”〈〈m〈<"x”<<n<〈"矩阵输入”<〈endl; 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<〈"个资源数错误,请重新输入:"<〈endl; j-—; continue; } }