MST
星途 面试题库

面试题:并发与同步:死锁避免算法中的银行家算法基本原理

请详细阐述银行家算法在操作系统死锁避免中的工作原理,包括数据结构的定义以及算法执行的主要步骤。
18.9万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

银行家算法工作原理

银行家算法是一种资源分配与死锁预防算法,其核心思想是通过模拟银行系统的资源分配方式,在每次资源分配前先判断此次分配是否会导致系统进入不安全状态,若不会则进行分配,以此来避免死锁的发生。

数据结构定义

  1. 资源向量Available:一个长度为m的数组,其中Available[j]表示系统中第j类资源的可用数量。例如,Available = [3, 3, 2] 表示系统中有3个A资源,3个B资源和2个C资源可供分配。
  2. 最大需求矩阵Max:一个n×m的矩阵,Max[i][j]表示进程i对第j类资源的最大需求数量。例如,进程P0对A、B、C三类资源的最大需求为Max[0] = [7, 5, 3]。
  3. 分配矩阵Allocation:一个n×m的矩阵,Allocation[i][j]表示进程i当前已分配到的第j类资源的数量。比如,进程P1当前已分配到的资源数量为Allocation[1] = [0, 1, 0]。
  4. 需求矩阵Need:一个n×m的矩阵,Need[i][j] = Max[i][j] - Allocation[i][j],表示进程i还需要的第j类资源的数量。例如,进程P2的Need[2] = [6, 0, 0] - [4, 0, 0] = [2, 0, 0]。

算法执行主要步骤

  1. 安全状态检查
    • 初始化一个长度为m的工作向量Work,Work = Available。
    • 初始化一个长度为n的布尔数组Finish,所有元素初始值为false,表示所有进程尚未完成。
    • 遍历所有进程,寻找满足以下两个条件的进程i:
      • Finish[i] == false
      • Need[i][j] <= Work[j] 对于所有的j(即进程i所需的资源都小于等于当前可用资源)
    • 如果找到这样的进程i,则将资源分配给进程i,即Work[j] = Work[j] + Allocation[i][j],并将Finish[i]设为true,表示进程i可以运行完成并释放资源。
    • 重复上述步骤,直到所有进程的Finish值都为true,此时系统处于安全状态;如果找不到满足条件的进程且仍有进程的Finish值为false,则系统处于不安全状态。
  2. 资源请求处理
    • 当进程i发出资源请求Request[i]时,首先检查Request[i][j] <= Need[i][j] 对于所有的j(确保请求不超过最大需求),并且Request[i][j] <= Available[j] 对于所有的j(确保系统有足够的可用资源)。
    • 如果上述条件都满足,则假设将资源分配给进程i,即Available[j] = Available[j] - Request[i][j];Allocation[i][j] = Allocation[i][j] + Request[i][j];Need[i][j] = Need[i][j] - Request[i][j]。
    • 然后执行安全状态检查,如果新状态是安全的,则正式分配资源;如果新状态不安全,则撤销刚才的假设分配,拒绝进程i的请求,让进程i等待。