银行家算法实验报告
- 格式:docx
- 大小:103.25 KB
- 文档页数:20
计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
三、问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:(1)如果ReqUeSt k or =Need则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果RequeS k or=AVailable,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程 Pi,并修改下面数据结构中的数值:AVaiIabIe=AVailable-Request[i];Allocatio n=Allocatio n+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:(1)设置两个向量①工作向量Work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,WOrk=AIlocatio n;②布尔向量FiniSh。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令 Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:①Fini sh[i]=false②Needvor=Work如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:WOrk=Work+Allocatio n;Fini sh[i]=true;转向步骤(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
4、流程图:系统主要过程流程图I进W「银行家算法流程图安全性算法流程图四、实验代码:〃#defi ne M 5〃#defi ne N 3#i nclude VStdio.h> Il#i nclude<stdlib.h>#in clude <string.h>int max [ 5][1]; //int allocation[5][1];int need [ 5][1];int available[1];int request[5][1];Char *fini sh[5];int safe[5]; (mSaftyi }⅛J ⅛)本实验中使用到的库函数开始定义银行家算法中需要用到的数据int n,i,m; int k=0;int j=0;int work[1];int WorkS[5][1];void Iin e() Il 美化程序,使程序运行时更加明朗美观{Printf(" ---------------------------- ∖n");for (n=0;n<5;n++){Printf(" 请输入进程P%d 的相关信息:\n",n);Prin tf("Max:");for (m=0;m<1;m++)SCan f("%d", &max[ n][m]);void Start() // {Iin e();Printf(" Printf(" Iin e();}void en d() // {Iin e();Printf(" Iin e();}void in put() // 表示银行家算法开始表示银行家算法结束银行家算法开始\n");死锁避免方法 银行家算法结束,谢谢使用\n");输入银行家算法起始各项数据∖n");Prin tf("Allocatio n:");for (m=0;m<1;m++)SCan f("%d", &allocatio n[n ][m]);for (m=0;m<1;m++)n eed[ n][m]=max[ n][m]-allocatio n[n ][m];}Prin tf(" 请输入系统可利用资源数Available:");for (m=0;m<1;m++)SCa nf("%d",&available[m]);}void OUtPUt() ZZ 输出系统现有资源情况{Iin e();Printf("资源情况MaX Allocation Need AVailable∖n");Prin tf("进程 A A A A ∖n");Iin e();for(n=0;n<5;n++){Prin tf("P%d%3d%3d%3d", n,max[ n][0],allocatio n[n ][0], need[ n][0]); if (n==0)Prin tf("%3d%3d∖n",available[0]);elsePrin tf("∖n");}Iin e();}void Cha nge() ZZ时,系统把资源分配给进程 P[i] ,AVaiIable[j] 当ReqUeSt[i,j]<=Available[j]和Need[i,j] 发生改变for (m=0;m<1;m++) {available[m]-=request[i][m]; allocati On [i][m]+=request[i][m];n eed[i][m]-=request[i][m];}}void OUtPUtSafe() // 输出安全序列的资源分配表{Printf( "该安全序列的资源分配图如下: ∖n");Iin e();Printf( "资源情况 Work NeedAllocatio nWork+Allocatio nFi nish∖ n");Printf("进程 A A A A ∖n");Iin e();for(n=0;n<5;n++)Prin tf("P%d%9d%3d%3d%5d%12s∖n",safe[ n],works[safe[ n]][0], need[saf e[n ]][0],allocatio n[ safe[ n] ][0],works[safe[ n]][0]+allocation[safe[ n] ][0],fini sh[ n]);Iin e();}int CheCk() // 安全性算法{Printf(" 开始执行安全性算法……∖n");for (m=0;m<1;m++) // 数组 work 和 finish 初始化work[m]=available[m];for (n=0;n<5;n++)0 fin ish[ n]="false";safe[ n]=0;}k=0;for (m=0;m<5;m++)for (n=0;n<5;n++)if(strcmp(finish[n],"false")==。
&&need[ n][0]<=work[0] ) //查找可以分配资源但尚未分配到资源的进程{safe[k]=n; // 以数组safe[k]记下各个进程得到分配的资源的顺序works[safe[k]][0]=work[0]; work[0]+=allocatio n[n ][0]; //放出分配给它的资源 finish[n]="ture"; /∕finish[n]程完成本次分k++;}{if (StrCmp(fi ni sh[m],"false")==0){Printf(" 找不到安全序列,系统处于不安全状态。
∖n"); return 0; // 找不到安全序列,结束 CheCk 函数,返回 进程执行后释变为1以示该进 for (m=0;m<5;m++) //判断是否所有进程分配资源完成else 0if (m==4) // 此处m=4表示所有数组finish 的所有元素都为ture{Prin tf("找到安全序列 P%d->P%d->P%d->P%d- >P%d 系统是安全的∖n",safe[0],safe[1],safe[2],safe[3],safe[4]);j=1;OUtPUtSafe(); // 输出安全序列的资源分配表}}return 1;}void mai n() // 主程序开始{Start();for (;j==0;) Il确认输入数据的正确性,若输入错误,重新输入{in put();Printf(" 以下为进程资源情况,请确认其是否正确:∖n");OUtPUt();Printf(" 数据是否无误:∖n正确:输入1∖n错误:输入0∖n请输入:");SCa nf("%d",&j);}Printf(" 数据确认无误,算法继续。
∖n");if (CheCk()==0) Il 若CheCk函数返回值为0,表示输入的初始数据找不到安全序列,无法进行下一步,程序结束{en d();for(;j==1;) Il 当有多个进程请求资源时,循环开始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 <1; n++)SCan f("%d",&reques t[i][n]);for (;reques t[i] [0]> need[i][0];) // 若请求向量大于需求资源,则认为是输入错误,要求重新输入{Printf(" 数据输入有误,请重试!\n请输入进程P%d的请求向量 ReqUeSt%d: ",i,i);for(n=0;n <1; n++)SCan f("%d", &request[i][ n]);}if(reques t[i] [0]<=available[0]) // 判断系统是否有足够资源提供分配{Printf(" 系统正在为进程P%d分配资源……∖n",i);Chan ge(); // 分配资源j=0;}elsePrintf(" 系统没有足够的资源,进程P%d需要等待。