使用银行家算法进行 C 语言死锁预防

28 Aug 2024 | 5 分钟阅读

银行家算法是一种资源分配和死锁避免算法,它在执行“s-state”检查以寻找潜在活动并确定是否应允许分配继续之前,会模拟对所有资源预先确定的最大可能数量的资源分配。

为什么银行家算法叫做这个名字?

银行家算法之所以得名,是因为它在银行业被用来决定是否批准个人的贷款。假设一家银行有 n 个储户,每个储户的个人余额为 S。当有人申请贷款时,银行会首先从其拥有的总金额中扣除贷款金额,只有当余额大于 S 时才批准贷款。这样做是因为如果所有储户都来取钱,银行可以很容易地满足他们的要求。换句话说,银行绝不会以一种会阻止它满足所有客户需求的方式来安排其资金。银行将始终努力维持安全。

银行家算法使用以下数据结构实现

设 n 为系统中的进程数,m 为资源种类数。

可用

  • 这个大小为“m”的一维数组列出了当前可用的每种资源的数量。
  • 如果 Available[j] = Rj,则有 k 个资源类型实例

Max

  • 系统中每个进程的最大需求由大小为“n*m”的二维数组指定。
  • 如果 Max[i, j] = k,则进程 Pi 可能请求最多 k 个 Rj 类型的资源实例。

分配

  • 目前分配给每个进程的每种资源数量由大小为“n*m”的二维数组指定。
  • 如果 Allocation[i, j] = k,则表示进程 Pi。此时,Pi 已被授予 k 个 Rj 类型的资源实例。

需求

  • 每个进程剩余的资源需求由大小为“n*m”的二维数组表示。
  • 如果 Need[i, j] = k,则表示进程 Pi。此时,Pi 需要 k 个 Rj 类型的资源实例。
  • Allocation[i, j] - Maximum[i, j] = Need[i, j]

现在分配给进程 Pi 的资源由 Allocationi 标识,而进程 Pi 为完成其工作可能还需要额外资源由 Needi 标识。

安全算法和资源请求算法构成了银行家算法。

安全算法

以下是确定系统是否处于安全状态的方法的描述

资源请求算法

设 Requesti 表示进程 Pi 的请求数组。如果 Requesti [j] = k,则表示进程 Pi 请求 k 个 Rj 类型的资源实例。当进程 Pi 请求资源时,会发生以下情况

下面是银行家算法的实现

输出

Following is the SAFE Sequence
 P1 -> P3 -> P4 -> P0 -> P2
........................................................
Process execute din 1.33 seconds
Press any key to continue.

说明

  • 进程进入系统时必须预先估计所需的最大资源量,这可以在合理的时间内完成。
  • 与交互式系统相比,此方法维护固定数量的进程。
  • 必须有一定数量的可用资源才能进行分配,以便此技术能够正常工作。如果某个设备损坏并意外离线,该算法将无法运行。
  • 当进程和资源数量很多时,此方法将产生开销,因为它必须为每个进程调用一次。