2.4.3 避免死锁(银行家算法)——操作系统笔记
文章目录
1. 什么是安全序列
- 所谓
安全序列
,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态
。当然,安全序列可能有多个
。 - 比如:银行家借钱:
- 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了
不安全状态
。这就意味着之后可能
所有进程都无法顺利的执行下去。 - 如果系统处于
安全状态
,就一定不会
发生死锁。如果系统进入不安全状态
,就可能
发生死锁。 - 因此在分配资源之前
预先判断
是否会进入不安全状态,就是“银行家算法
”的核心思想。
2. 银行家算法
-
核心思想:在进程提出资源申请时,先预判断此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。
-
数据结构:
Max:n * m 矩阵表示各进程对资源的最大需求数
Allocation:n * m 矩阵表示已经给各进程最分配了多少资源
Need = Max - Allocation:矩阵表示各进程最多还需要多少资源
Available:表示还有多少可用资源
Requesti :当某进程 Pi 向系统申请资源,可用一个长度为m的一位数组表示本次申请的各种资源量。 -
算法实现:
① 如果 Requesti ⩽ \leqslant ⩽ Need 便转向 ②;否则出错
(因为它所需要的资源数已超过它所宣布的最大值。)
② 如果 Requesti ⩽ \leqslant ⩽ Available 便转向 ③;否则表示尚无足够资源,Pi 必须等待。
③ 系统试探着
把资源分配给进程 Pi 并修改相应的数据(并非真的分配,修改数值只是为了做预判
):Available = Available - Requesti;
Allocation = Allocation + Requesti;
Need = Need - Requesti;④ 操作系统执行
安全性算法
,检查此次资源分配后,系统是否处于安全状态
。若安全,才正式分配;否则,恢复相应数据,让进程阻塞等待。
3. 总结
- 银行家算法步骤:
- ① 检查此次申请是否超过了之前声明的最大需求数
- ② 检查此时系统剩余的可用资源是否还能满足这次请求
- ③ 试探着分配,更改各数据结构
- ④ 用安全性算法检查此次分配是否会导致系统进入不安全状态
- 安全性算法步骤:
- 检查当前的剩余可用资源是否能满足某个进程的需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
- 不断重复上述过程,看最终是否能让所有进程都加入安全序列。