TypechoJoeTheme

鱼一的博客 ◡̈

yuyi

知不可乎骤得,托遗响于悲风
网站页面
标签搜索
c++

银行家算法

银行家算法(Banker's Algorithm)是一种著名的用于避免死锁的资源分配算法。它由 Edsger Dijkstra 提出,并因其模拟银行家借贷的行为而得名。银行家算法的核心思想是仅在系统处于安全状态时分配资源,以确保系统不会进入死锁状态。

银行家算法的基本概念

银行家算法的基本概念包括以下几个关键点:

  1. 系统资源:系统中有若干种资源,每种资源有一定数量。
  2. 进程:系统中有若干进程,每个进程需要若干资源才能完成其工作。
  3. 最大需求:每个进程对每种资源的最大需求量。
  4. 已分配资源:每个进程当前已经分配到的资源数量。
  5. 需要资源:每个进程还需要的资源数量,即最大需求量减去已分配资源。
  6. 可用资源:系统当前可以分配的资源数量。

银行家算法的步骤

银行家算法通过以下步骤来决定是否分配资源:

  1. 安全性检查:在分配资源前,系统模拟分配资源并检查是否处于安全状态。安全状态意味着系统能够按某种顺序分配资源,使得所有进程都能完成工作。
  2. 资源分配:如果系统处于安全状态,则分配资源;否则,拒绝资源请求。

安全性检查算法

为了检查系统是否处于安全状态,银行家算法使用以下步骤:

  1. 初始化

    • 定义向量 Work 表示当前可用资源。
    • 定义向量 Finish 表示每个进程是否完成。
  2. 寻找可满足进程

    • 寻找一个满足条件的进程 iFinish[i] == falseNeed[i] <= Work
    • 如果找到这样的进程,则假定将所有资源分配给该进程,使其完成,然后释放资源,即:

      • Work = Work + Allocation[i]
      • Finish[i] = true
  3. 检查完成状态

    • 如果所有进程都能完成(即所有 Finish[i] 都为 true),则系统处于安全状态;否则,不安全。

资源请求算法

当进程 i 请求资源时,银行家算法执行以下步骤:

  1. 检查请求合法性

    • 如果 Request[i] > Need[i],则出错,因为请求超过了最大需求。
    • 如果 Request[i] > Available,则等待,因为当前没有足够的资源。
  2. 试探性分配资源

    • 试探性地分配资源:

      • Available = Available - Request[i]
      • Allocation[i] = Allocation[i] + Request[i]
      • Need[i] = Need[i] - Request[i]
  3. 安全性检查

    • 执行安全性检查算法。如果系统处于安全状态,则正式分配资源;否则,撤销试探性分配,并让进程等待。

示例

下面是一个示例,演示银行家算法如何避免死锁。

假设系统有如下资源和进程:

  • 资源种类:A, B, C,总数量分别为 10, 5, 7。
  • 进程数:5。

资源分配表如下:

进程最大需求 (Max)已分配 (Allocation)需要 (Need = Max - Allocation)
P0(7, 5, 3)(0, 1, 0)(7, 4, 3)
P1(3, 2, 2)(2, 0, 0)(1, 2, 2)
P2(9, 0, 2)(3, 0, 2)(6, 0, 0)
P3(2, 2, 2)(2, 1, 1)(0, 1, 1)
P4(4, 3, 3)(0, 0, 2)(4, 3, 1)

当前可用资源:

ABC
332

步骤示例

安全性检查

初始状态:

  • Work = (3, 3, 2)
  • Finish = (false, false, false, false, false)
  1. 找到 P1 满足 Need[1] <= Work,完成 P1

    • Work = Work + Allocation[1] = (3, 3, 2) + (2, 0, 0) = (5, 3, 2)
    • Finish[1] = true
  2. 找到 P3 满足 Need[3] <= Work,完成 P3

    • Work = Work + Allocation[3] = (5, 3, 2) + (2, 1, 1) = (7, 4, 3)
    • Finish[3] = true
  3. 找到 P0 满足 Need[0] <= Work,完成 P0

    • Work = Work + Allocation[0] = (7, 4, 3) + (0, 1, 0) = (7, 5, 3)
    • Finish[0] = true
  4. 找到 P2 满足 Need[2] <= Work,完成 P2

    • Work = Work + Allocation[2] = (7, 5, 3) + (3, 0, 2) = (10, 5, 5)
    • Finish[2] = true
  5. 找到 P4 满足 Need[4] <= Work,完成 P4

    • Work = Work + Allocation[4] = (10, 5, 5) + (0, 0, 2) = (10, 5, 7)
    • Finish[4] = true

所有 Finish[i] 均为 true,系统处于安全状态。

总结

银行家算法通过安全性检查确保系统不会进入死锁状态。通过模拟资源分配,检查是否存在一个顺序,使得所有进程都能顺利完成,从而决定是否进行资源分配。银行家算法适用于需要严格避免死锁的系统,但由于其复杂性和计算开销,通常在资源有限且系统规模较小时使用。

赞(0)
版权属于:

鱼一的博客 ◡̈

本文链接:

https://yuyi.monster/archives/237/(转载时请注明本文出处及文章链接)

评论 (0)

More Info for me 📱

IP信息

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月