C 语言银行家算法

28 Aug 2024 | 5 分钟阅读

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

银行家算法为何如此命名?

银行家算法之所以如此命名,是因为它被用于银行业,以确定是否批准向个人贷款。假设一家银行有 n 个账户持有人,每个人的余额为 S。当有人申请贷款时,银行首先从其拥有的总金额中扣除贷款金额,只有当余额大于 S 时才批准贷款。之所以这样做,是因为如果所有账户持有人都来取钱,银行可以轻松做到。

换句话说,银行绝不会以一种会使其无法满足所有客户需求的方式安排资金。银行将始终努力保持安全。

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

假设系统中有 n 个进程和 m 种不同的资源类型。

可用

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

Max

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

Max[i, j] = k。

分配

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

需求

  • 它是一个大小为“n*m”的二维数组,显示每个进程还需要多少资源。
  • Need[i, j] = k 表示进程 Pi 当前需要资源类型 Rj 的“k”个实例。
  • Allocation[i, j] - Maximum[i, j] = Need[i, j]

Allocation 标识当前分配给进程 Pi 的资源,而 Need 标识进程 Pi 可能仍需要完成其工作的额外资源。

银行家算法由安全算法和资源请求算法组成。

安全算法

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

资源请求算法

让 Request 代表进程 Pi 的请求数组。进程 Pi 请求资源类型 Rj 的 k 个实例,这由 Request[j] = k 表示。当进程 Pi 请求资源时,会发生以下情况

银行家算法源代码

输出

Following is the SAFE Sequence
 P1 -> P3 -> P4 -> P0 -> P2
.......................................................
Process executed in 2.32 seconds
Press any key to continue.

说明

  • 进程进入系统时必须预期所需的最大资源数量,这可以在合理的时间内完成。
  • 与交互式系统不同,此方法保持固定数量的进程。
  • 此技术要发挥作用,必须有特定数量的资源可供分配。如果设备损坏并意外离线,算法将无法运行。
  • 当有多个进程和资源时,此方法会产生开销成本,因为它必须为每个进程调用。