admin 管理员组文章数量: 887019
银行家算法是 Dijkstra在1965年提出的一种避免死锁的算法。银行家算法陈述如下: 1) 当一个进程提出一个资源的请求时,假定分配给它,并调用检查系统状态安全性的算法。如果系统是安全的,则对申请者的假分配变为实际的分配。否则,推迟它的请求,让其阻塞等待。 2) 检查系统状态安全性的算法。根据系统剩余的资源情况,银行家进行检查,看满足请求者的要求后,是否仍是系统中的所有进程都能正常完成(即能找到一个进程完成序列)。若能,系统是安全的。否则,系统是不安全的。 银行家算法主要如下: 输入:资源个数 m、进程个数n、最大请求矩阵max、分配矩阵allocation 输出:进程运行情况和安全状况提示(如果安全,输出一个可能的进程完成序列) 主要算法: 1) 初始化,输入各个参数,初始化各变量 2) 判断系统安全性 程序中安全性算法的描述如下: a. 设置如下两个工作向量: Work:表示系统可提供给进程继续运行的各类资源的空闲资源数目,它含有m个元素,执行安全性算法开始时,Work=Available。 Finish:表示系统是否有足够的资源分配给进程,使之运行完成。开始时,Finish[i]=false;当有足够的资源分配给进程Pi时,令Finish[i]=true。 b. 从进程集合中找到一个能满足下列条件的进程: Finish[i]= false; Need[i] <= Work; 如果找到了就执行步骤c,否则执行步骤d。 c. 当进程Pi获得资源后,可执行直到完成,并释放出分配给它的资源,故应执行 Work = Allocation[i]+Work; Finish[i]=true; 然后转向b。 d. 若所有进程中的Finish[i]都是true,则表示系统处于安全状态;否则,系统处于不安全状态。 3) 当系统请求资源时,调用系统状态安全性算法 系统状态安全性算法: 当某一进程提出资源申请时,系统须做出判断,能否将所申请资源分配给该进程。设Request[i]是进程Pi的请求向量,Request[i][j]=k表示进程Pi请求分配 j类资源有k个。当Pi发出资源请求后,系统按照下述步骤进行检查: a. 如果Request[i]<= Need[i],则转向 b;否则出错,因为进程所需要的资源数已超过它所宣布的最大值; b. 如果Request[i]<=Available,则转向步骤 c;否则,表示系统中尚无足够的资源满足进程Pi的申请,让进程Pi等待。 c. 假设系统把申请的资源分配给进程Pi,则对应下面的数据结构进行修改: Available= Available-Request[i]; Allocation[i]= Allocation[i]+Request[i]; Need[i]= Need[i]-Request[i]; d. 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,就将资源分配给Pi,满足其资源申请要求;否则,让进程等待,并恢复原来的资源分配状态。 数据结构: class bank { private: int m; //资源数量 int n; //进程数量 int available[M]; //可利用资源向量 int max[M][N]; //最大需求矩阵 int allocation[M][N]; //分配矩阵 int need[M][N]; //需求矩阵 public: bool Initilize(); //初始化各变量 bool IsSafe(); //检查系统是否安全 bool Resoure_allocate();//分配资源 bool IsFinish(); //检查系统是否运行完毕 }; 测试用例: 本测试用例为《操作系统原理教程(第二版)》 P62页用例,先给P2分配一个打印机,分配成功,然后分配给P5一台打印机,分配失败,然后按照P4,P1,P5,P2,P3执行系统。 Available=( 1,0,2,0)
进程 | 磁带机 | 绘图机 | 打印机 | 光驱 |
P1 | 3 | 0 | 1 | 1 |
P2 | 0 | 1 | 0 | 0 |
P3 | 1 | 1 | 1 | 0 |
P4 | 1 | 1 | 0 | 1 |
P5 | 0 | 0 | 0 | 0 |
版权声明:本文标题:用银行家算法实现系统资源分配 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1727378830h1111287.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论