1、实习报告书写参考 -银行家算法的实现 一、 设计 目的: 熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法 ,加深记 忆 。 二、设计内容 设计一个 n 个并发进程共享 m 个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。要求采用银行家算法实现。 三、开发环境 windows 环 境, VC6.0 平台。 四、分析设计 一实验原理 银行家算法是从当前状态出发,逐个按安全序列检查各客户中谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作的客户。如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。 与预防死锁的几种方法相
2、比较,限制条件少,资源利用程度提高了。 缺点:该算法要求客户数保持固定不变,这在多道程序系统中是难以做到的;该算法保证所有客户在有限的时间内得到满足,但实时客户要求快速响应,所以要考虑这个因素;由于要寻找一个安全序列,实际上增加了系 统的开销 . Banker algorithm 最重要的一点是:保证操作系统的安全状态!这也是操作系统判断是否分配给一个进程资源的标准!那什么是安全状态?举个小例子,进程 P 需要申请 8个资源(假设都是一样的),已经申请了 5 个资源,还差 3 个资源。若这个时候操作系统还剩下 2 个资源。很显然,这个时候操作系统无论如何都不能再分配资源给进程 P 了,因为即使
3、全部给了他也不够,还很可能会造成死锁。若这个时候操作系统还有 3 个资源,无论 P 这一次申请几个资源,操作系统都可以满足他,因为操作系统可以保证 P 不死锁,只要他不把 剩余的资源分配给别人,进程 P 就一定能顺利完成任务。 为什么银行家算法是可行的呢?这里需要严格的证明一下。不管任何时候,操作系统分配资源的时候都可以保证当前接受资源的进程不会陷入死锁,因为操作系统总是可以满足该进程需要的资源的。假设有 n个进程 p1, p2, p3, pn ,最后一个分配到资源的是 pi , pi 还需要 mi 个资源,假设此时操作系统还有 m 个资源剩余。那么很显然 m=mi !而且如果之后操作系统又把
4、资源分配给其他进程了,假设是 pj , pj 还需要 mj 个资源,同理可知 m=mj!也就是说在所有的进程中,还需要的资源数总是有小于 m 的!这样就可以保证资源数永远不会为 0 ,即使可能暂时性为 0 。另外,还需要保证资源数不会减少!而且,所有已经分配到资源的进程总有一天会归还它所拥有的资源!根据操作系统再分配的时候的状态即可判定。 二程序结构 当进程 pi 提出资源申请时,系统执行下列步骤: ( 1)若 RequestiNeedi, 转( 2);否则错误返回 ( 2)若 RequestiAvailable, 转( 3);否则进程等待 (3)假设系统分配了资源,则有: Available
5、:=Available-Requesti; Allocationi:=Allocationi+Requesti; Needi:=Needi-Requesti 若系统新状态是安全的,则分配完成若系统新状态是不安全的,则恢复原状态,进程等待 模拟实现 Dijkstra 的银行家算法以避免死锁的出现 .分两部分组成 : 第一部分 :银行家算法 (扫描 ) 1如果 Request using namespace std; #define MAXPROCESS 50 /*最大进程数 */ #define MAXRESOURCE 100 /*最大资源数 */ int AVAILABLEMAXRESOURC
6、E; /*可用资源数组 */ int MAXMAXPROCESSMAXRESOURCE; /*最大需求矩阵 */ int ALLOCATIONMAXPROCESSMAXRESOURCE; /*分配矩阵 */ int NEEDMAXPROCESSMAXRESOURCE; /*需求矩阵 */ int REQUESTMAXPROCESSMAXRESOURCE; /*进程需要资源数 */ bool FINISHMAXPROCESS; /*系统是否有足够的资源分配 */ int pMAXPROCESS; /*记录序列 */ int m,n; /*m个进程 ,n个资源 */ void Init(); bo
7、ol Safe(); void Bank(); int main() Init(); Safe(); Bank(); void Init() /*初始化算法 */ int i,j; coutm; coutn; coutMAXij; coutALLOCATIONij; NEEDij=MAXij-ALLOCATIONij; if(NEEDijAVAILABLEi; void Bank() /*银行家算法 */ int i,cusneed; char again; while(1) coutcusneed; coutREQUESTcusneedi; for(i=0;iNEEDcusneedi) coutAVAILABLEi) coutagain; if(again=y|again=Y) continue; break; bool Safe() /*安全性算法 */ int i,j,k,l=0; int WorkMAXRESOURCE; /*工作数组 */ for(i=0;iWorkj) break; if(j=n) FINISHi=true; for(k=0;k“; cout“endl; return true; cout“系统是不安全的 “endl; return false;