「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」
目的
银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法。本实验通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。
思路
先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。
若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。
若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。
内容
- 设置数据结构:
可利用资源向量(Availiable)
最大需求矩阵(Max),分配矩阵(Allocation),需求矩阵(Need) - 设计安全性算法:
设置工作向量Work 表示系统可提供进程继续运行可利用资源数目,Finish 表示系统是否有足够的资源分配给进程
寻找安全序列 - 设计银行家算法:
用键盘输入的方式申请资源;
如果预分配后,系统处于安全状态,则修改系统的资源分配情况;
如果预分配后,系统处于不安全状态,则提示不能满足请求。
主要数据结构
可利用资源向量 int Available[m] m为资源种类
最大需求矩阵 int Max[n][m] n为进程的数量
分配矩阵 int Allocation[n][m]
还需资源矩阵 int need[i][j]= Max[i][j]- Allocation[i][j]
申请资源数量 int Request [m]
工作向量 int Work[m] int Finish[n]
实例
假定系统中有五个进程{P0、P1、P2、P3、P4}和三种类型资源{A、B、C},每一种资源的数量分别为10、5、7。各进程的最大需求、T0时刻资源分配情况如下 所示。
试问:
1 | scss复制代码 一、T0时刻是否安全? |
解:一、T0时刻是否安全?
工作向量Work.它表示系统可提供给进程继续运行所需要的各类资源的数目
(1) T0时刻安全性分析
存在安全序列{P1, P3, P0, P2, P4},系统安全。
二、T0之后的T1时刻P1请求资源Request1(1,0,2)可否允许?
① Request1(1,0,2) ≤ Need1(1,2,2),P1请求在最大需求范围内;
② Request1(1,0,2) ≤ Available1(3,3,2),可用资源可满足P1请求需要;
③ 假定可为P1分配,修改Available,Allocation1,Need1向量。
Available(2,3,0) = Available(3,3,2)-Request1(1,0,2);
Need1(0,2,0) = Need1(1,2,2)-Request1(1,0,2);
Allocation1(3,0,2) =Allocation1(2,0,0)+Request1(1,0,2);
④ 利用安全性算法检查试探将资源分配后状态的安全性
存在安全序列{P1, P3, P0, P2, P4},所以试探将资源分配给进程P1后的状态是安全的,可将资源分配给进程P1。
三、
T1之后的T2时刻P4请求资源Request4(3,3,0)是否允许?
Request4(3,3,0)≤Need4(4,3,1),P4请求在最大需求范围内。
Request4(3,3,0)≤Available(2,3,0)不成立,即可用资源暂不能满足P4请求资源需要,P4阻塞等待。
P4请求资源Request4(3,3,0)不允许。
四、
T2之后的T3时刻P0请求资源Request0(0,2,0)是否允许?
Request0(0,2,0)≤Need0(7,4,3);
Request0(0,2,0)≤Available(2,3,0);
系统暂时先假定可为P0分配资源,并修改有关数据,如下图所示。
进行安全性检查:可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。
如果在银行家算法中,把P0发出的请求向量改为Request0(0,1,0),系统是否能将资源分配给它,请考虑。
程序代码如下
1 | java复制代码package com.lzl.bank; |
测试代码
1 | java复制代码package com.lzl.bank; |
运行结果如下
本文转载自: 掘金