写不来的算法代码

1.分数规划
2.莫对算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法是一种避免死锁的重要方法,它的思路是预分配资源,然后判断新状态下是否状态安全,如果安全状态,则判断一下该对应进程是否满足执行的全部资源,如果满足,就回收掉该进程的资源,如果不满足则不作处理。如果是不安全状态,则进行状态的回退。下面是Java实现银行家算法代码: 1. 首先定义一个进程类Process,用来标记进程的名称,进程的其他属性(need,allocation等)都在Bank的矩阵中包含。 2. 定义一个Bank类,用来实现银行家算法的主要逻辑。其中包含了银行家算法的三个主要函数:securityExamine()、request()和printState()。 3. securityExamine()函数用来检查系统是否处于安全状态。 4. request()函数用来处理进程的资源请求。 5. printState()函数用来打印当前系统的状态。 下面是Java实现银行家算法代码: ``` import java.util.Scanner; /** * 进程类,主要是用来标记进程的名称,进程的其他属性(need,allocation等)都在Bank的矩阵中包含 */ class Process { /** 进程名称 */ private String name; /** * 构造函数 * @param name 进程名称 */ public Process(String name) { this.name = name; } /** * 获取进程名称 * @return 返回对应进程的名称 */ public String getName() { return name; } /** * 设置进程名称 * @param name 传入对应进程的名称进行设置操作 */ public void setName(String name) { this.name = name; } @Override public String toString() { return "Process{" + "name='" + name + '\'' + '}'; } } /** * 银行家算法类 */ public class Bank { /** 系统中可用的资源 */ private int[] available; /** 系统中所有进程所需的最大资源 */ private int[][] max; /** 系统中所有进程已经分配的资源 */ private int[][] allocation; /** 系统中所有进程还需要的资源 */ private int[][] need; /** 系统中所有进程的数量 */ private int processNum; /** 系统中所有进程的名称 */ private Process[] processes; /** * 构造函数 */ public Bank() { Scanner scanner = new Scanner(System.in); System.out.println("请输入系统中可用的资源数量:"); int resourceNum = scanner.nextInt(); available = new int[resourceNum]; System.out.println("请输入系统中所有进程的数量:"); processNum = scanner.nextInt(); max = new int[processNum][resourceNum]; allocation = new int[processNum][resourceNum]; need = new int[processNum][resourceNum]; processes = new Process[processNum]; for (int i = 0; i < processNum; i++) { System.out.println("请输入进程" + i + "的名称:"); processes[i] = new Process(scanner.next()); System.out.println("请输入进程" + i + "所需的资源数量:"); for (int j = 0; j < resourceNum; j++) { max[i][j] = scanner.nextInt(); } } System.out.println("请输入系统中可用的资源数量:"); for (int i = 0; i < resourceNum; i++) { available[i] = scanner.nextInt(); } // 计算need矩阵 for (int i = 0; i < processNum; i++) { for (int j = 0; j < resourceNum; j++) { need[i][j] = max[i][j] - allocation[i][j]; } } } /** * 检查系统是否处于安全状态 * @return 如果系统处于安全状态,返回true;否则返回false */ public boolean securityExamine() { int[] work = new int[available.length]; System.arraycopy(available, 0, work, 0, available.length); boolean[] finish = new boolean[processNum]; for (int i = 0; i < processNum; i++) { finish[i] = false; } int count = 0; while (count < processNum) { boolean flag = false; for (int i = 0; i < processNum; i++) { if (!finish[i]) { boolean temp = true; for (int j = 0; j < available.length; j++) { if (need[i][j] > work[j]) { temp = false; break; } } if (temp) { for (int j = 0; j < available.length; j++) { work[j] += allocation[i][j]; } finish[i] = true; count++; flag = true; } } } if (!flag) { break; } } if (count == processNum) { System.out.println("系统处于安全状态!"); return true; } else { System.out.println("系统处于不安全状态!"); return false; } } /** * 处理进程的资源请求 */ public void request() { Scanner scanner = new Scanner(System.in); System.out.println("请输入请求资源的进程名称:"); String processName = scanner.next(); int processIndex = -1; for (int i = 0; i < processNum; i++) { if (processes[i].getName().equals(processName)) { processIndex = i; break; } } if (processIndex == -1) { System.out.println("没有找到对应的进程!"); return; } System.out.println("请输入请求的资源数量:"); int[] request = new int[available.length]; for (int i = 0; i < available.length; i++) { request[i] = scanner.nextInt(); } // 判断请求是否合法 for (int i = 0; i < available.length; i++) { if (request[i] > need[processIndex][i]) { System.out.println("请求的资源数量超过了进程所需的资源数量!"); return; } if (request[i] > available[i]) { System.out.println("请求的资源数量超过了系统中可用的资源数量!"); return; } } // 模拟分配资源 for (int i = 0; i < available.length; i++) { available[i] -= request[i]; allocation[processIndex][i] += request[i]; need[processIndex][i] -= request[i]; } // 检查系统是否处于安全状态 if (securityExamine()) { System.out.println("资源分配成功!"); } else { // 回滚分配的资源 for (int i = 0; i < available.length; i++) { available[i] += request[i]; allocation[processIndex][i] -= request[i]; need[processIndex][i] += request[i]; } System.out.println("资源分配失败!"); } } /** * 打印当前系统的状态 */ public void printState() { System.out.println("系统中可用的资源数量:"); for (int i = 0; i < available.length; i++) { System.out.print(available[i] + " "); } System.out.println(); System.out.println("系统中所有进程所需的最大资源:"); for (int i = 0; i < processNum; i++) { for (int j = 0; j < available.length; j++) { System.out.print(max[i][j] + " "); } System.out.println(); } System.out.println("系统中所有进程已经分配的资源:"); for (int i = 0; i < processNum; i++) { for (int j = 0; j < available.length; j++) { System.out.print(allocation[i][j] + " "); } System.out.println(); } System.out.println("系统中所有进程还需要的资源:"); for (int i = 0; i < processNum; i++) { for (int j = 0; j < available.length; j++) { System.out.print(need[i][j] + " "); } System.out.println(); } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值