任务五 模拟银行家算法,用银行家算法实现资源分配 一.实验内容
在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。用银行家算法实现资源分配,可以避免死锁的发生。
本实验就是通过利用C/C++,根据下面给出的资源情况和进程情况,模拟银行家算法。
T0 时刻的资源分配表(各种资源的数量分别为:10、5、7) 资源情况 Max 进程 Allocation Need A B C 0 1 0 2 0 0 3 0 2 2 1 1 0 0 2 Available A B C 3 3 2 A B C 7 5 3 3 2 2 9 0 2 2 2 2 4 3 3 A B C 7 4 3 1 2 2 6 0 0 0 1 1 4 3 1 P0 P1 P2 P3 P4 二.实验思路
1.银行家算法中的数据结构:
(1)可利用资源向量available
它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。 (2)最大需求短阵max
这是—个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=K,表示进程i需要Rj类资源的最大数目为K。 (3)分配短阵allocation 这是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每个进程的资源数。如果Allocation(i,j)=K,表示进程i当前已分得Rj类资源的数目为K。 (4)需求矩阵need 它是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数,如果Need[i,j]=K,则表示进程i还需要Rj类资源k个,方能完成其任务。 上述三个矩阵间存在下述关系:
need[i,j]=max[i,j]-allocation[i,j]
(5)工作向量work。它表示系统可提供给进程继续运行所需要的各类资源数目,它含有m个元素,执行安全算法开始时,work = available。
(6)finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做finish[i]:=false ;当有足够资源分配给进程时,令 finish[i]:=true。
2.银行家算法关键代码分析:
(1)void output() 输出某时刻的资源分配情况;
以printf(\ Max Allocation Need Available\\n\
printf(\ A B C A B C A B C A B C\\n\的形式输出
(2)void bank() 银行家算法实体;
设requesti是进程Pi的请求向量。如果requesti[j]=k,表示进程只需要k个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
①如果 requesti[j]<=need[i,j],则转向步骤②;否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
②如果requesti[j]<=available[j] ,则转向步骤③;否则,表示系统中尚无足够的资源,Pi必须等待。
③系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
available[j]:=available[j]-requesti[j]; need[i,j]:=need[i,j]requesti[j]; allocation[i,j]:=allocation[i,j]+requesti[j];
④系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
(3)int security(int i,int j) 进行安全性检查; ①设置了两个向量work和finish。
②从进程集合中找到一个能满足下述条件的进程:finish[i]=false; Need[i,j]<=Work[j];如找到,执行步骤③;否则,执行步骤④。
③当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: work[j]:=work[i]+allocation[i,j]; finish[i]:=true; goto step 2;
④如果所有进程的finish[i]:=true,则表示系统处于安全状态;否则系统处于不安全状态。(4)void proc_require0(void) 输入要求申请资源的进程号和请求分配的资源大小; (5)int over_need() 请求资源超过需求资源的情况; if(request[serial_proc][j]>need[serial_proc][j]) { printf(\请求资源超过需求资源\\n\ return 1; }
(6)int over_avail() 请求资源超过可利用资源的情况;
if(request[serial_proc][j]>available[j]) { printf(\请求资源超过可利用资源\\n\ return 1; }
(7)int apply_success(int be_need,int be_avail) 申请资源成功;
三.程序运行
1.执行后的初始状态,此时进程状态安全。
2.P1进程要求资源[1 0 2],此时available[2 3 0]=available[3 3 2]-request[1 0 2], P1进程的need[0 2 0]=need[1 2 2]-request[1 0 2];
allocation[3 0 2]=allocation[2 0 0]+request[1 0 2]
3.P4进程要求资源[3 3 0],因为request[3 3 0]>available[2 3 0],所以输出P4请求资源超过可利用资源。
4.P0进程要求资源[0 2 0],因为available[2 1 0]=available[2 3 0]-request[0 2 0], 而这时available[0 2 0]不满足任何need,所以输出Available不满足任何进程需要,不安全。
四.源代码

