Java~操作系统实验银行家算法的实现(附带源码),java面试大全带答案

//如果该进程已经得到过足够资源就不进行判断

if (!p.finish) {

//如果该进程不需要等待就直接返回false

if (!needWait§) {

return false;

}

}

}

return true;

}

private void mainOperation(PCB pcb) {

//运行到这说明该进程可以得到足够的资源,那么直接将该进程已分配的资源放回到系统中

//并将finish改为true

for (int i = 0; i < this.work.length; i++) {

this.work[i].num += pcb.allocation[i].num;

pcb.finish = true;

}

}

private boolean needWait(PCB pcb) {

//挨个判断此时pcb这个进程所需要的每个资源,如果need大于系统当前可分配资源,就说明需要等待

for (int i = 0; i < this.work.length; i++) {

if (this.work[i].num < pcb.need[i].num) {

return true;

}

}

return false;

}

}

测试数据及结果

======================================================================

数据


在这里插入图片描述

import java.util.Scanner;

public class Test {

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

System.out.print(“输入资源有几种:”);

int resKindNum = scan.nextInt();

Resources[] Available = new Resources[resKindNum];//系统总资源

System.out.println();

System.out.println(“输入每个系统资源名称、系统资源数量”);

for (int i = 0; i < Available.length; i++) {

System.out.println(“初始化第” + (i +1) + “个资源”);

System.out.println();

System.out.print(“资源名称:”);

String name = scan.next();

System.out.println();

System.out.print(“该资源数量:”);

int num = scan.nextInt();

Available[i] = new Resources(name, num);

System.out.println();

System.out.println(“第” + (i +1) + “个资源初始化完毕”);

System.out.println(“====================”);

}

System.out.println();

System.out.println(“系统资源初始化完毕,开始初始化进程”);

System.out.println();

System.out.print(“输入进程个数:”);

int pcbNums = scan.nextInt();

PCB[] pcbs = new PCB[pcbNums];

for (int i = 0; i < pcbNums; i++) {

System.out.println(“初始化第” + (i +1) + “个进程”);

System.out.println();

System.out.print(“输入进程名:”);

String name = scan.next();

System.out.println();

System.out.print(“输入该进程最大需求资源:”);

Resources[] max = new Resources[resKindNum];

int[] maxResNum = new int[resKindNum];

for (int j = 0; j < resKindNum; j++) {

maxResNum[j] = scan.nextInt();

}

for (int j = 0; j < max.length; j++) {

max[j] = new Resources(Available[j].name, maxResNum[j]);

}

System.out.println();

System.out.print(“输入该进程已分配资源数目:”);

Resources[] allocation = new Resources[resKindNum];

int[] allocReesNum = new int[resKindNum];

for (int j = 0; j < resKindNum; j++) {

allocReesNum[j] = scan.nextInt();

}

for (int j = 0; j < allocation.length; j++) {

allocation[j] = new Resources(Available[j].name, allocReesNum[j]);

}

System.out.println();

//此时一个进程的所有需要的东西都已输入完毕

pcbs[i] = new PCB(name, max, allocation);

System.out.println(“第” + (i +1) + “个进程初始化完毕”);

System.out.println(“====================”);

}

System.out.println();

System.out.println(“所有进程初始化完毕,开始资源分配”);

System.out.println();

boolean key = true;

while (key) {

BetterBankerAlgorithm bankerAlgorithm = new BetterBankerAlgorithm(Available, pcbs);

bankerAlgorithm.resAllocation();

System.out.println();

System.out.println("是否需要再次申请资源输入: y or n ");

char ch = scan.next().charAt(0);

if (ch == ‘n’ || ch == ‘N’) {

key = false;

} else {

System.out.print(“输入要申请资源的进程名:”);

String name = scan.next();

System.out.println();

System.out.print(“输入要申请资源的数量:”);

int[] res = new int[resKindNum];

for (int i = 0; i < resKindNum; i++) {

res[i] = scan.nextInt();

}

System.out.println();

for (PCB p : pcbs

) {

p.finish = false;

if (p.name.equals(name)) {

for (int i = 0; i < p.allocation.length; i++) {

p.allocation[i].num += res[i];

}

}

}

System.out.println();

System.out.println(“再次申请资源完毕,开始资源分配”);

System.out.println();

}

}

}

}

结果


输入资源有几种:4

输入每个系统资源名称、系统资源数量

初始化第1个资源

资源名称:R1

该资源数量:6

第1个资源初始化完毕

====================

初始化第2个资源

资源名称:R2

该资源数量:7

第2个资源初始化完毕

====================

初始化第3个资源

资源名称:R3

该资源数量:12

第3个资源初始化完毕

====================

初始化第4个资源

资源名称:R4

该资源数量:12

第4个资源初始化完毕

====================

系统资源初始化完毕,开始初始化进程

输入进程个数:5

初始化第1个进程

输入进程名:P0

输入该进程最大需求资源:0 0 1 2

输入该进程已分配资源数目:0 0 1 2

第1个进程初始化完毕

====================

初始化第2个进程

输入进程名:P1

输入该进程最大需求资源:2 7 5 0

输入该进程已分配资源数目:2 0 0 0

第2个进程初始化完毕

====================

初始化第3个进程

输入进程名:P2

输入该进程最大需求资源:6 6 5 6

输入该进程已分配资源数目:0 0 3 4

第3个进程初始化完毕

====================

初始化第4个进程

输入进程名:P3

输入该进程最大需求资源:4 3 5 6

输入该进程已分配资源数目:2 3 5 4

第4个进程初始化完毕

====================

初始化第5个进程

输入进程名:P4

输入该进程最大需求资源:0 6 5 2

输入该进程已分配资源数目:0 3 3 2

第5个进程初始化完毕

====================

所有进程初始化完毕,开始资源分配

P0进程已得到足够资源

此时系统可用资源为:

====================

资源R1有2

资源R2有1

资源R3有1

资源R4有2

====================

P3进程已得到足够资源

此时系统可用资源为:

====================

资源R1有4

资源R2有4

资源R3有6

资源R4有6

====================

P4进程已得到足够资源

此时系统可用资源为:

====================

资源R1有4

资源R2有7

资源R3有9

资源R4有8

====================

P1进程已得到足够资源

此时系统可用资源为:

====================

资源R1有6

资源R2有7

资源R3有9

资源R4有8

====================

P2进程已得到足够资源

此时系统可用资源为:

====================

资源R1有6

资源R2有7

资源R3有12

资源R4有12

====================

系统处于安全状态

是否需要再次申请资源输入: y or n

Y

输入要申请资源的进程名:P2

输入要申请资源的数量:0 1 0 0

再次申请资源完毕,开始资源分配

P0进程已得到足够资源

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

L9-1711051425960)]
[外链图片转存中…(img-XsgrN4Di-1711051425961)]
[外链图片转存中…(img-bFhRkTVh-1711051425961)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-3sHE0gbg-1711051425962)]

最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

[外链图片转存中…(img-RJ3Hm1CI-1711051425962)]

[外链图片转存中…(img-6u0Z4Vr4-1711051425963)]

[外链图片转存中…(img-K5IHW7g6-1711051425965)]

[外链图片转存中…(img-aEo3lTkx-1711051425966)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是操作系统哲学家进餐问题的Java程序实现: ```java import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class DiningPhilosophers { private static final int NUMBER_OF_PHILOSOPHERS = 5; private static final int SIMULATION_TIME = 1000; public static void main(String[] args) throws InterruptedException { Philosopher[] philosophers = new Philosopher[NUMBER_OF_PHILOSOPHERS]; Object[] forks = new Object[NUMBER_OF_PHILOSOPHERS]; Lock[] locks = new Lock[NUMBER_OF_PHILOSOPHERS]; for (int i = 0; i < NUMBER_OF_PHILOSOPHERS; i++) { forks[i] = new Object(); locks[i] = new ReentrantLock(); } for (int i = 0; i < NUMBER_OF_PHILOSOPHERS; i++) { philosophers[i] = new Philosopher(i, forks[i], forks[(i + 1) % NUMBER_OF_PHILOSOPHERS], locks[i], locks[(i + 1) % NUMBER_OF_PHILOSOPHERS]); new Thread(philosophers[i]).start(); } Thread.sleep(SIMULATION_TIME); for (Philosopher philosopher : philosophers) { philosopher.setFull(true); } } } class Philosopher implements Runnable { private final int id; private final Object leftFork; private final Object rightFork; private final Lock leftLock; private final Lock rightLock; private volatile boolean isFull = false; public Philosopher(int id, Object leftFork, Object rightFork, Lock leftLock, Lock rightLock) { this.id = id; this.leftFork = leftFork; this.rightFork = rightFork; this.leftLock = leftLock; this.rightLock = rightLock; } @Override public void run() { try { while (!isFull) { think(); pickUpForks(); eat(); putDownForks(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } } private void think() throws InterruptedException { System.out.println("Philosopher " + id + " is thinking"); Thread.sleep((long) (Math.random() * 10000)); } private void pickUpForks() throws InterruptedException { leftLock.lock(); try { System.out.println("Philosopher " + id + " picked up left fork"); rightLock.lock(); try { System.out.println("Philosopher " + id + " picked up right fork"); } catch (Exception e) { leftLock.unlock(); throw e; } } catch (Exception e) { rightLock.unlock(); throw e; } } private void eat() throws InterruptedException { System.out.println("Philosopher " + id + " is eating"); Thread.sleep((long) (Math.random() * 10000)); } private void putDownForks() { leftLock.unlock(); rightLock.unlock(); System.out.println("Philosopher " + id + " put down forks"); } public void setFull(boolean isFull) { this.isFull = isFull; } } ``` 这个程序中,有5个哲学家和5个餐叉,每个哲学家需要同时拿到左右两边的餐叉才能进餐,否则需要等待。使用 `Lock` 和 `ReentrantLock` 来实现锁定餐叉。程序的运行时间为1000毫秒,每个哲学家会先思考一段时间,然后尝试拿起餐叉,进餐,然后放下餐叉,最后再开始思考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值