2.4.3 避免死锁(银行家算法)——操作系统笔记


1. 什么是安全序列

  • 所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个
  • 比如:银行家借钱:
    2.4.3 避免死锁(银行家算法)——操作系统笔记
  • 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。
  • 如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁。
  • 因此在分配资源之前预先判断是否会进入不安全状态,就是“银行家算法”的核心思想。

2. 银行家算法

  • 核心思想:在进程提出资源申请时,先预判断此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。

  • 数据结构:

    Max:n * m 矩阵表示各进程对资源的最大需求数
    Allocation:n * m 矩阵表示已经给各进程最分配了多少资源
    Need = Max - Allocation:矩阵表示各进程最多还需要多少资源
    2.4.3 避免死锁(银行家算法)——操作系统笔记
    Available:表示还有多少可用资源
    Requesti :当某进程 Pi 向系统申请资源,可用一个长度为m的一位数组表示本次申请的各种资源量。

  • 算法实现:
    ① 如果 Requesti ⩽ \leqslant Need 便转向 ②;否则出错(因为它所需要的资源数已超过它所宣布的最大值。)
    ② 如果 Requesti ⩽ \leqslant Available 便转向 ③;否则表示尚无足够资源,Pi 必须等待。
    ③ 系统试探着把资源分配给进程 Pi 并修改相应的数据(并非真的分配,修改数值只是为了做预判):

    Available = Available - Requesti
    Allocation = Allocation + Requesti
    Need = Need - Requesti

    ④ 操作系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式分配;否则,恢复相应数据,让进程阻塞等待。

3. 总结

  • 银行家算法步骤:
    • ① 检查此次申请是否超过了之前声明的最大需求数
    • ② 检查此时系统剩余的可用资源是否还能满足这次请求
    • ③ 试探着分配,更改各数据结构
    • ④ 用安全性算法检查此次分配是否会导致系统进入不安全状态
  • 安全性算法步骤:
    • 检查当前的剩余可用资源是否能满足某个进程的需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
    • 不断重复上述过程,看最终是否能让所有进程都加入安全序列。