操作系统中的银行家算法


在计算机系统中,银行家算法用于避免死锁,以便可以安全地将资源分配给每个进程。之所以这样命名,是因为它可以用于银行系统,以确保银行永远不会分配其可用现金,以至于无法满足所有客户的要求。

在本文中,我们将详细讨论银行家算法。但在那之前,让我们了解一个与其类似的现实世界情况。

银行家算法:它是如何工作的?

让我们假设一家银行有“n”个账户,“M”是银行的总现金。如果客户申请贷款,则银行首先从可用的总现金中减去贷款金额,然后验证现金差额必须大于总现金“M”才能批准贷款。此过程帮助银行在没有任何限制的情况下管理和执行所有银行业务。

同样,银行家算法在计算机系统的操作系统中也适用。在计算机系统中,当一个新进程进入系统时。然后,该进程必须声明其可能需要执行的最大数量的每种资源类型的实例。此数字不得超过系统中资源的总数。现在,当一个新进程请求资源时,系统必须计算分配请求的资源是否会使计算机系统处于安全状态。如果是,则进程将获得分配的请求资源,否则它必须等待直到其他一些进程释放请求的资源。

通过遵循此实践,银行家算法避免了死锁并安全地分配了资源。因此,在操作系统中它也被称为死锁检测算法死锁避免算法

银行家算法中使用的数据结构

在计算机系统中,如果进程数等于“n”,资源类型数等于“m”。实现银行家算法需要以下四种数据结构:

  • Available(可用) - 它是一个长度为“m”的向量,指示系统中每种类型的可用资源数量。如果 Available [j] = k,则“k”为系统中可用资源类型 Rj 的实例数。

  • Max(最大) - 它是一个 [n × m] 矩阵,定义每个进程的最大资源需求。当 Max [I, j] = k 时,进程 Pi 可以请求资源类型 Rj 的最大 k 个实例。

  • Allocation(分配) - 它也是一个 [n × m] 矩阵,定义当前分配给每个进程的每种类型的资源数量。因此,如果 Allocation [i, j] = k,则进程 Pi 当前分配了资源类型 Rj 的“k”个实例。

  • Need(需求) - 它是一个 [n × m] 矩阵,表示每个进程剩余的资源需求。当 Need [i, j] = k 时,进程 Pi 可能需要资源类型 Rj 的“k”个更多实例才能完成分配的任务。

  • Finish(完成) - 它是一个长度为“m”的矩阵。它包含一个布尔值,即 TRUE 或 FALSE,以指示是否已将进程分配给所需的资源,或者在完成分配的工作后所有资源是否都已释放。

此外,需要注意的是,

Need [i, j] = Max [i, j] – Allocation [i, j]

银行家算法是两种算法的组合,即安全算法资源请求算法。这两种算法共同控制进程并避免系统死锁。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

安全算法

安全算法用于确定系统是否处于安全状态。它遵循银行家算法中的以下安全顺序:

步骤 1

  • 考虑两个分别命名为 Work 和 Finish 的向量,长度分别为“m”和“n”。

  • 初始化:Work = Available

  • Finish [i] = false;对于 i = 0, 1, 2, 3, 4, 5 … n。

步骤 2

  • 找到“i”,使得 Finish [i] = false 且 Needi ≤ Work

  • 如果不存在这样的“i”,则转到步骤 4。

步骤 3

  • Work = Work + Allocation

  • Finish [i] = true

  • 转到步骤 2。

步骤 4

  • 如果 Finish [i] 对所有“i”都为 true,则表示系统处于安全状态,否则处于不安全状态。

  • 该算法需要 (m × n2) 次操作才能确定状态是安全还是不安全。

现在,让我们讨论资源请求算法。

资源请求算法

此算法确定系统在进程请求系统中每种类型的资源时如何运行。

让我们考虑一个进程 Pi 的请求向量 Requesti。当 Requesti [j] = k 时,进程 Pi 需要资源类型 Rj 的 k 个实例。

当进程 Pi 请求资源时,将遵循以下顺序:

步骤 1

如果 Requesti ≤ Needi,则转到步骤 2。否则,由于进程已超过其对资源的最大索取,因此给出错误。

步骤 2

如果 Requesti ≤ Available,则转到步骤 3。否则,进程 Pi 必须等待直到资源可用。

步骤 3

如果通过如下修改状态,将请求的资源分配给进程 Pi:

Available = Available – Requesti;
Allocationi = Allocationi + Requesti;
Needi = Needi – Requesti;

如果生成的资源分配状态安全,则将请求的资源分配给进程 Pi。如果新状态不安全,则进程 Pi 必须等待 Requesti,并且恢复旧的资源分配状态。

更新于: 2023 年 4 月 21 日

13K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始
广告