一、 实验目的
通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。
二、 实验内容
- 初始化让系统拥有一定的资源。
- 用户用键盘输入的方式请求资源。
- 如果预分配后,系统处于安全状态,则修改系统的资源分配情况。
- 如果预分配后,系统处于不安全状态,则提示不能满足请求。
三、 算法解释
(1) 基本过程
先对用户提出的请求进行合法性检查,即检查请求的资源是否不大于需求的资源,是否不大于可利用的资源。若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。
若安全,则分配,否则不分配,恢复原来状态,拒绝申请。
(2) 数据结构
⚫ 可利用资源向量 int Available[N] N 为资源种类
⚫ 最大需求矩阵 int Max[M][N] M 为进程的数量
⚫ 分配矩阵 int Allocation[M][N]
⚫ 还需资源 int Need[i][j] = Max[i][j] - Allocation[i][j]
⚫ 申请资源数量 int Request[N]
⚫ 工作向量 int Work[N] int Finish[M]
(3) bank()银行家算法
Requesti:进程 Pi 的请求向量。0 <= j <= N-1
- 若 Requesti[j] ≤ Need[i,j],转向(2),否则出错。
- 若 Requesti[j] ≤ Available[j],转向(3),否则等待。
- 系统试探着把资源分配给进程 Pi,修改下面内容:
Available[j] = Available[j] – Requesti[j];
Allocation[i,j] = Allocation[i,j] + Requesti[j];
Need[i,j] = Need[i,j] – Requesti[j]; - 试分配后,执行安全性算法,检查此次分配后系统是否处于安全
状态。若安全,才正式分配;否则,此次试探性分配作废(逆向恢
复),进程 Pi 等待。
(4) safe()安全性算法
- 初始化:设置两个向量 Work(1×N)和 Finish(1×M)。
Work:系统可提供给进程继续运行所需各类资源数
(初态赋值:Work[i] = Available[i])
Finish:系统是否有足够资源分配给进程
(初值 false) - 从进程集合中找寻满足下面条件进程:
Finish[i] = false; Need[i,j] ≤ Work[j];
若找到,执行(3),否则,执行(4)。 - 进程 Pi 获得资源,可顺利执行,完成释放所分配的资源。
Work[j] = Work[j]+Allocation[i,j];
Finish[i] = true; go to (2);
注意:以上式子还可以写为:
Work[k] = Work[k] - Need[i][k];
Work[k] = Work[k] + Max[i][k];
Finish[i] = true; go to (2); - 若所有进程 Finish[i] = true,表示系统处于安全状态,否则处
于不安全状态。
四、 程序流程
/* 案例 */