死锁避免——银行家算法(简述)

1.算法介绍

银行家算法最早是为解决银行贷款问题而提出的,在多个用户申请贷款时,首先要确定资源充足,也就是申请资源数目不应超过系统拥有的资源总量,如果符合,则认为系统处于安全状态,把资源分配给该进程,否者,认定系统处于不安全状态,让进程等待,等待其他进程释放资源后,再做处理。

2.算法变量

由于算法的需要,我们要设置4个变量,分别为:

  1. 当前可利用资源(Available):表示当前可利用的资源数目。这个比以下的三个变量要高一个层面。如果Available[j]=K,则表示系统中现有Rj类资源K个。
  2. 最大需求(Max): 表示某个进程对某种资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
  3. 当前分配资源数(Allocation):表示某个进程当前以分得某类资源的数目。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
  4. 需求(Need):表示某个进程离完成任务还需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
    注:R为资源集合的类型。
    有关系:
Need[i, j]=
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
银行家算法是一种避免的经典算法,它主要用于分配有限的资源,以避免出现的情况。下面是Java实现避免银行家算法的示例代码: ```java import java.util.Scanner; public class BankerAlgorithm { private int[][] need; // 还需要的各类资源 private int[][] allocate; // 已分配的各类资源 private int[] available; // 可用的各类资源 private int[] safeSequence; // 安全序列 public void init() { Scanner scanner = new Scanner(System.in); System.out.println("请输入进程数量:"); int processCount = scanner.nextInt(); System.out.println("请输入资源种类数量:"); int resourceCount = scanner.nextInt(); need = new int[processCount][resourceCount]; allocate = new int[processCount][resourceCount]; available = new int[resourceCount]; safeSequence = new int[processCount]; System.out.println("请输入每个进程需要的各类资源:"); for (int i = 0; i < processCount; i++) { for (int j = 0; j < resourceCount; j++) { need[i][j] = scanner.nextInt(); } } System.out.println("请输入每个进程已分配的各类资源:"); for (int i = 0; i < processCount; i++) { for (int j = 0; j < resourceCount; j++) { allocate[i][j] = scanner.nextInt(); } } System.out.println("请输入系统可用的各类资源:"); for (int i = 0; i < resourceCount; i++) { available[i] = scanner.nextInt(); } } public void run() { int processCount = need.length; int resourceCount = available.length; int[] work = new int[resourceCount]; System.arraycopy(available, 0, work, 0, resourceCount); boolean[] finish = new boolean[processCount]; for (int i = 0; i < processCount; i++) { finish[i] = false; } int count = 0; while (count < processCount) { boolean found = false; for (int i = 0; i < processCount; i++) { if (!finish[i]) { boolean enough = true; for (int j = 0; j < resourceCount; j++) { if (need[i][j] > work[j]) { enough = false; break; } } if (enough) { safeSequence[count] = i; count++; finish[i] = true; found = true; for (int j = 0; j < resourceCount; j++) { work[j] += allocate[i][j]; } } } } if (!found) { System.out.println("系统处于不安全状态,无法分配资源!"); return; } } System.out.println("安全序列:"); for (int i = 0; i < processCount; i++) { System.out.print("P" + safeSequence[i]); if (i != processCount - 1) { System.out.print(" -> "); } } System.out.println(); } public static void main(String[] args) { BankerAlgorithm bankerAlgorithm = new BankerAlgorithm(); bankerAlgorithm.init(); bankerAlgorithm.run(); } } ``` 在这个示例代码中,我们通过输入进程数量、资源种类数量、每个进程需要的各类资源、每个进程已分配的各类资源、系统可用的各类资源来初始化我们的银行家算法。接着,我们通过遍历所有进程来找到一个安全的序列。如果无法找到一个安全的序列,则说明当前系统处于不安全状态,无法分配资源。如果找到了一个安全的序列,则输出这个序列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤米先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值