1、银行家算法实验报告计算机操作系统实验报告一、 实验名称: 银行家算法二、 实验目的: 银行家算法是避免死锁的一种重要方法,通过编写 一个简单的银行家算法程序,加深了解有关资源申请、避免死 锁等概念,并体会和了解死锁和避免死锁的具体实施方法。三、 问题分析与设计:1、算法思路 :先对用户提出的请求进行合法性检查,即检查 请求是否大于需要的,是否大于可利用的。若请求合法,则进 行预分配,对分配后的状态调用安全性算法进行检查。若安 全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒 绝申请。2、银行家算法步骤:(1)如果Requestk or二Need则转向步骤(2);否则,认为出错,因为它所需
2、要的资源数已超过它所宣布的最大值。(2)如果Request or二Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。(3) 系统试探把要求的资源分配给进程 Pi,并修改下面数据结构中的数值:Available=Available-Requesti;Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于 安全状态。3、安全性算法步骤:(1)设置两个向量工作向量 Work 。它表示系统可提供进程继续运行所需要的各类资 源数目,执行安全算法开始时, Work=Allo
3、cation;布尔向量Finish。它表示系统是否有足够的资源分配给进程,使 之运行完成,开始时先做 Finishi=false ,当有足够资源分配给进程 时,令 Finishi=true 。(2) 从进程集合中找到一个能满足下述条件的进程:1Finishi=false2Needor=Work如找到,执行步骤( 3);否则,执行步骤( 4)。(3) 当进程 P 获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finishi=true;转向步骤( 2)。( 4)如果所有进程的 Finishi=true, 则表示系统处于安全状态;否 则
4、,系统处于不安全状态。4、流程图:系统主要过程流程图银行家算法流程图安全性算法流程图四、实验代码:#defi ne M 5#defi ne N 3本实验中使用到的库函数#i nclude II#i nclude #in elude 开始定义银行家算法中需要用到的数据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;printf(n);void start()
5、/ line(); printf(printf(line();void end() / line(); printf(表示银行家算法开始银行家算法开始 n);- 死锁避免方法表示银行家算法结束银行家算法结束,谢谢使用 n);n);line();输入银行家算法起始各项数据void input() /for (n=0;n5;n+)printf(” 请输入进程P%d的相关信息:n,n);printf(Max:);for (m=0;m1;m+)scanf(%d,&maxnm);printf(Allocation:);for (m=0;m1;m+)scanf(%d,&allocationnm);for
6、(m=0;m1;m+)neednm=maxnm-allocationnm;printf( 请输入系统可利用资源数 Available:);for (m=0;m1;m+)scanf(%d,&availablem);void output() / 输出系统现有资源情况line();printf( 资源情况 Max Allocation Need Availablen);printf( 进程 A A A A n);line();for(n=0;n5;n+)printf(P%d%3d%3d%3d,n,maxn0,allocationn0,needn0);if (n=0)printf(%3d%3dn,a
7、vailable0);elseprintf(n);line();void change() / 当 Requesti,j=Availablej 时,系统把资源分配给 进程 Pi , Availablej 和 Needi,j 发生改变for (m=0;m1;m+)availablem-=requestim; allocationim+=requestim; needim-=requestim;void outputsafe() / 输出安全序列的资源分配表printf(该安全序列的资源分配图如下: n);line();printf(资源情况 WorkNeedAllocation Work+All
8、ocationFinishn);printf(进程 A AAA n);line();for(n=0;n5;n+)printf(P%d%9d%3d%3d%5d%12sn,safen,workssafen0,needsaf en0,allocationsafen0,workssafen0+allocationsafen0 ,finishn);line();int check() / 安全性算法printf(” 开始执行安全性算法n ”);for (m=0;m1;m+) / 数组 work 和 finish 初始化workm=availablem;for (n=0;n5;n+)finishn=fal
9、se; safen=0;k=0;for (m=0;m5;m+)for (n=0;n5;n+)if(strcmp(finishn,false)=0 & needn0P%d-P%d-P%d- P%d 系统是安全的 n,safe0,safe1,safe2,safe3,safe4);j=1;outputsafe(); / 输出安全序列的资源分配表return 1;void main() / 主程序开始start();for (;j=0;) / 确认输入数据的正确性,若输入错误,重新输入input();printf( 以下为进程资源情况,请确认其是否正确: n);output();printf( 数据是
10、否无误: n 正确:输入 1n 错误:输入 0n 请输 入:);scanf(%d,&j);printf( 数据确认无误,算法继续。 n);if (check()=0) / 若 check 函数返回值为 0,表示输入的初始数据找不到安全序列,无法进行下一步,程序结束end();exit(0);for(;j=1;) / 当有多个进程请求资源时,循环开始printf( 请输入请求资源的进程 i(0 、1、2、3、4):); / 输入 发出请求向量的进程及请求向量scanf(%d,&i);printf( 请输入进程P%d的请求向量Request%d: ,i,i);for(n=0;nneedi0;) /
11、 若请求向量大于需求资源,则认为是输入错误,要求重新输入printf(” 数据输入有误,请重试! n请输入进程P%d的请求向量 Request%d: ,i,i);for(n=0;n1;n+)scanf(%d,&requestin);if(requesti0=available0) / 判断系统是否有足够资源提供分配printf(” 系统正在为进程P%d分配资源n”,i);change(); / 分配资源j=0;elseprintf(” 系统没有足够的资源,进程 P%d需要等待。n,i);if (j=0) /j=0 表示系统有足够资源分配的情况printf( 当前系统资源情况如下: n); /
12、输出分配资源后的系统资源分配情况output();if(check()=0) / 若找不到安全系列,则之前的资源分配无效printf( 本次资源分配作废,恢复原来的资源分配 状态。 n);for (m=0;m1;m+) / 恢复分配资源前的系统资源状态availablem+=requestim;allocationim-=requestim;needim+=requestim;output(); / 输出系统资源状态printf( 是否还有进程请求资源? n 是:输入 1n 否:输入 0n 请输入: );scanf(%d,&j); / 若还有进程请求资源, j=1 ,之前的 for 循环条件满
13、足end();五、 程序执行结果:资源情况 Work 进程 A全序列的资源分配图妇下;Need Allocation Work+Allocation FinishA A A13402351111047622003577110ture ture ture ture tore请输入请求浚源的进程i (CK K 2、MO 2|请输入进程P2的请求向量Request2: 1 系统正在为进程巴分配资源 当前系统资源情况如下:Max Allocatiun Need AvailableA A A A开始执厅女全性鼻法找到安全序列Pl-P3-P4-P2-P0,系统是安全的 该安全序列的资源分配图如下:资源情况 Vork Need Allocation Vork+Allocation Finish逑程 A A A AP1 2124tureP3 4026turP4 6406tureP2 65410tureP0 101010ture是否还有进程请求资源?是:输入1否:输入0请输关:六、实验总结多个进程同时运行时,系统根据各类系统资源的最大需求和各 类系统的剩余资源为进程安排安全序列,使得系统能快速且安 全地运行进程,不至发生死锁。银行家算法是避免死锁的主要 方法,其思路在很多方面都非常值得我们来学习借鉴 。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1