解密银行家算法:操作系统资源管理的秘密武器

  1.  概述:
    1. 银行家算法是操作系统领域中用于避免死锁的经典算法
    2. 其核心思想是通过模拟资源分配的过程,系统在进行资源分配之前,应先计算此次分分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待
    3. 实现银行家算法,系统必须设置若干数据结构
  2. 死锁(Deadlock):
    1. 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
    2. 称此时系统处于死锁状态或系统产生了死锁
    3. 称这些永远在互相等待的进程成为死进程
  3. 资源与进程:
    1. 在操作系统中,资源是有限的,而多个进程会竞争这些资源
    2. 银行家算法通过以下关键数据结构来描述资源分配的状态:
      1. 资源向量(Available):表示系统中当前可用的每种资源的数量
      2. 最大需求矩阵(Max):记录每个进程对每种资源的最大需求量
      3. 分配矩阵(Allocation):表示当前已分配给每个进程的资源数量
      4. 需求矩阵(Need):表示每个进程还需要的资源数量,计算公式为:Need = Max - Allocation
  4. 安全状态:
    1. 银行家算法的核心目标是确保系统始终处于 "安全状态"
    2. 所谓安全状态,是指在一种资源分配顺序,使得所有进程都能顺利完成,而不会导致死锁
    3. 系统需要满足以下条件:
      1. 每个进程的资源请求不超过其最大需求
      2. 系统能够找到一个安全序列,使得每个进程都能获得所需资源并完成执行
  5. 不安全状态:
    1. 不存在一个安全序列。不安全状态不一定导致死锁
  6. 工作流程:
    1. 初始化:
      1. 在算法开始前,需要初始化以下数据结构:
        1. Need:每个进程还需要的资源数量
        2. Allocation:当前已分配给每个进程的资源数量
        3. Max:每个进程的最大资源需求
        4. Available:系统当前可用的资源数量
    2. 资源请求处理:
      1. 当一个进程请求资源时,系统会执行以下步骤:

        1. 检查请求合法性:如果请求的资源数量超过进程的最大进程需求,请求将被拒绝
        2. 检查资源可用性:如果请求的资源数量超过系统当前可用资源,进程需要等待
        3. 试探性分配:假设分配资源,并跟新 Available、Allocation 和 Need 矩阵
        4. 安全性检查:检查系统是否仍处于安全状态
          1. 如果是,则正式分配资源
          2. 否则,撤销试探性分配
    3. 安全性检查:
      1. 安全性检查是银行家算法的核心步骤,其目的是找到一个安全序列,步骤如下:
        1. 初始化工作项量 Work 和完成标志 Finish
        2. 查找一个未完成的进程,其资源需求小于等于 Work
        3. 如果找到这样的进程,假设其可以完成,并释放其占用的资源
        4. 重复上述步骤,直到所有进程都完成或无法找到满足条件的进程
  7. 实现银行家算法:
    1. 定义全局变量:
      private static