public class BankerArithmetic {
private int Possess[];// 系统拥有的资源向量
private int Available[];// 可用资源向量
private int Max[][];// 最大需求矩阵
private int Allocation[][];// 分配矩阵
private int Need[][];// 需求矩阵
private int[] safeSequence;// 保存安全序列
private Map<Integer,String> map = new HashMap<Integer,String>();//存放等待的进程
public static void main(String[] args) {
BankerArithmetic test = new BankerArithmetic();
// 初始化 并显示
test.Init();
test.show();
System.out.println("**********");
// 该时刻状态安全
if(test.isSafe(test.Available))
{
test.safeSequence();
}
else
{
System.out.println("该时刻为不安全状态");
}
System.out.println("**********");
// 循环进行分配
int inProcess;
int choice ;
int[] inputRequest = new int[test.Max[0].length];
while (true)
{
Scanner s = new Scanner(System.in);
System.out.println("请选择:\n0(退出)\n1(请求分配)\n2(初始化)");
choice = s.nextInt();
if (choice==0)
break;
else if(choice==2)
{
test.Init();
test.show();
}
System.out.println("请输入要请求的进程号(0--" + test.Max.length + "):");
inProcess = s.nextInt();
System.out.println("请输入请求的资源数目:");
for (int i = 0; i < 3; i++) {
System.out.print("Request[" + i + "]=");
inputRequest[i] = s.nextInt();
}
System.out.print("Request:");
for(int request:inputRequest)
System.out.print(request+" ");
test.request(inProcess, inputRequest);
test.show();
test.showWaitingProcess();
System.out.println("**********");
}
}
/**
* 初始化Max,Allocation,Need,Possess,Available
*/
private void Init() {
/**
* max:
* 5,5,9
* 4,3,6
* 4,0,11
* 4,2,5
* 4,2,4
* */
Max = new int[][] { { 5, 5, 9 }, { 5, 3, 6 }, { 4, 0, 11 },
{ 4, 2, 5 }, { 4, 2, 4 } };
/**
* Allocation:
* 2,1,2
* 4,0,2
* 4,0,5
* 2,0,4
* 3,1,4
* */
Allocation = new int[][] { { 2, 1, 2 }, { 4, 0, 2 }, { 4, 0, 5 },
{ 2, 0, 4 }, { 3, 1, 4 } };
/**
* Need Need[i][j]=Max[i][j]-Allocation[i][j];
*/
Need = new int[Max.length][Max[0].length];
for (int i = 0; i < Max.length; i++) {
for (int j = 0; j < Max[0].length; j++) {
Need[i][j] = Max[i][j] - Allocation[i][j];
}
}
/**
* 系统资源总和
* */
Possess = new int[] { 17, 5, 20 };
/**
* Available[i] = Posses[i]-Allocation[i];
*
* */
Available = new int[Possess.length];
for (int j = 0; j < Max[0].length; j++) {
int countAllocation = 0;
for (int i = 0; i < Max.length; i++) {
countAllocation += Allocation[i][j];
}
Available[j] = Possess[j] - countAllocation;
}
}
/**显示
* Max,Allocation,Need,
* 系统现有进程
* Possess,Available
*/
public void show() {
System.out.println("Max[][] Allocatio[][] Need[][]");
for (int i = 0; i < Max.length; i++) {
for (int j = 0; j < Max[0].length; j++) {
System.out.print(Max[i][j] + " ");
}
System.out.print(" ");
for (int j = 0; j < Max[0].length; j++) {
System.out.print(Allocation[i][j] + " ");
}
System.out.print(" ");
for (int j = 0; j < Max[0].length; j++) {
System.out.print(Need[i][j] + " ");
}
System.out.println();
}
System.out.print("系统现有进程:");
for (int i = 0; i < Max.length; i++) {
System.out.print("P" + i + " ");
}
System.out.print("\n系统拥有资源:");
for (int i = 0; i < Max[0].length; i++) {
System.out.print(Possess[i] + " ");
}
System.out.print("\n系统可用资源:");
for (int i = 0; i < Max[0].length; i++) {
System.out.print(Available[i] + " ");
}
System.out.println();
}
/**
* 判断系统是否安全.若果安全则返回true
* @param tempAvailable:可用资源
* @return
*/
private boolean isSafe(int[] tempAvailable) {
/**
* 工作向量初始值等于Available[]
*
* 注意如果 将 Work=tempAvailable;会出错 ,地址传递会改变Available的内容
* 此处为引用传递
* 区别值传递与引用传递的机制
*/
int[] Work = new int[Max[0].length];
// 初始值全为false
boolean[] Finish = new boolean[Max.length];
//temp的值表示安全序列
int temp = 0;
//k:安全序列的下标
int k = 0;
//判断是否安全
boolean safe = true;
safeSequence = new int[Max.length];
for (int j = 0; j < Max[0].length; j++) {
Work[j] = tempAvailable[j];//tempAvailable 不随 Work的改变而改变;
}
while (temp < Max.length) {
if (Finish[temp] == false && Need[temp][0] <= Work[0]
&& Need[temp][1] <= Work[1] && Need[temp][2] <= Work[2]) {
for (int i = 0; i < Max[0].length; i++) {
Work[i] += Allocation[temp][i];
Finish[temp] = true;
}
safeSequence[k] = temp;
k++;
temp = 0;
} else {
temp++;
}
}
for (int i = 0; i < Max.length; i++) {
safe&=Finish[i];
}
return safe;
}
/**
* 提出申请,判断是否分配。若分配后为安全状态,则允许,否则,拒绝分配。
* @param process 代表进程
* @param request代表进程申请各资源数组成的集合
*/
private void request(int process, int[] request) {
boolean isOK = true;
/**
* 如果请求Request[i]<=Available&&Request[i]<=Need[i]
* 则分配资源,对修改后的数据执行安全算法,若该时刻系统安全,则分配完成
* 否则,撤销之前的资源分配
*/
String str="P"+process+":";
for(int req:request)
{
str+=req+",";
}
for (int i = 0; i < Max[0].length; i++) {
isOK &= (request[i] <= Available[i]);
if(!isOK)
{
System.out.println("\n请求资源数超过可用资源数,P"+process+"等待");
map.put(i, str);
return;
}
isOK &= (request[i] <= Need[process][i]);
if(!isOK)
{
System.out.println("\n请求资源数超过还需要的资源数,P"+process+"请求错误");
return;
}
}
//isOK=true 满足分配
if (isOK) {
//分配资源
for (int i = 0; i < Max[0].length; i++) {
Available[i] -= request[i];
Allocation[process][i] += request[i];
Need[process][i] -= request[i];
}
if (isSafe(Available)) {
System.out.println("\n条件满足,P" + process + "申请成功");
safeSequence();
} else
{//撤销分配
for (int i = 0; i < Max[0].length; i++) {
Available[i] += request[i];
Allocation[process][i] -= request[i];
Need[process][i] += request[i];
}
System.out.println("\n分配后为不安全状态。撤销分配");
}
}
}
//若该时刻安全则输出安全序列
public void safeSequence()
{
System.out.print("该时刻安全,safe sequence is:");
for (int safeTemp : safeSequence) {
System.out.print("P" + safeTemp + "->");
}
System.out.println();
}
//显示等待的进程申请
public void showWaitingProcess()
{
if(map==null)
{
System.out.println("当前无等待的进程");
return;
}
System.out.println("当前等待的进程申请:");
for (Integer Key : map.keySet())
{
System.out.println(map.get(Key)+" ");
}
}
}
相关推荐
Windows11安装Ubuntu 20.04.3 LTS双系统(详细过程)
一、基础环境 听说BIOS模式的传统MBR模式和新式UEFI模式,会对安装双系统产生影响。Windows11应该都是UEFI吧,可以按win+r输入msinfo32回车确认查看BIOS模式,我的电脑是UEFI+双硬盘 Ubuntu安装准备 1、 官网下载Ubuntu 20.04.3 LTS镜像iso文件:https://ubuntu.com/download/desktop 2、 下载官网推荐的U盘启动制作工具rufus: https://rufus.ie/ 3、制作启动u盘 插入U盘, 运行 rufu
JAVA-银行家算法
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。安全序列:指一个进程序列{p1,......,pn}是安全的,即对于每一个进程pi(1<= i<=n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程pj(j<i)当前占有资源量之和。
基于AXI PCIE IP的FPGA PCIE卡示意图
如果在上图中的AXI互联IP上再连接一个带AXI Slave接口的BRAM控制器,这个BRAM控制器连接一个BRAM,Host PC在系统主存中分配了一些不连续的内存,Host PC可以将这些内存段的起始地址(当然要先转为PCIE总线地址)写到AXI总线上的BRAM中,这样AXI CDMA读取BRAM,将读取到的PCIE总线基地址写到AXIPCIE寄存器块中的AXIBAR2PCIEBAR_n寄存器中,这样就实现了SG DMA。通过动态改变AXIBAR2PCIEBAR_n寄存器的值,可以实现多通道DMA。
银行家算法(java实现)
银行家算法(java实现) 1.什么是安全序列 所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。 如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,则可能会发
静态与动态LACP链路聚合:原理、配置与排错实战指南
链路聚合技术是提升网络带宽与可靠性的核心方案,通过将多个物理端口逻辑捆绑,实现带宽叠加与链路冗余。其原理基于IEEE 802.3ad标准,通过负载均衡算法将数据流分布到不同物理链路,既避免了数据包乱序,又提升了整体吞吐量。该技术的核心价值在于消除单端口瓶颈、提供毫秒级故障切换,并能简化网络拓扑管理。在企业服务器接入、数据中心互联及虚拟化平台等场景中,链路聚合已成为构建高可用网络的基础。实践中,动态LACP模式通过协议报文协商,能主动检测链路故障并防止配置错误导致的网络环路,相比静态聚合更为可靠。本文将深入解
ST7789驱动实战:从SPI时序到RGB565显示的完整配置解析
本文详细解析了ST7789液晶驱动芯片的SPI时序配置与RGB565显示实现,从数据手册解读到代码实战,涵盖SPI接口配置、关键寄存器设置及完整初始化流程。通过优化DMA传输和常见问题排查,帮助开发者高效驱动ST7789显示屏,适用于嵌入式显示项目开发。
Java实现银行家算法(课程设计)
在第一次循环中,找到一个满足条件的进程,即进程的需求小于等于工作向量中的可用资源数量,并且进程未完成。在第二次循环中,找到一个满足条件的进程,即进程的需求小于等于工作向量中的可用资源数量,并且进程未完成。在第三次循环中,找到一个满足条件的进程,即进程的需求小于等于工作向量中的可用资源数量,并且进程未完成。在第四次循环中,找到一个满足条件的进程,即进程的需求小于等于工作向量中的可用资源数量,并且进程未完成。此时,所有进程都完成,说明系统是安全的。因此,根据银行家算法的判断,系统是安全的,可以进行资源的分配。
项目过程记录:ADS-B信号接收并显示(Ubuntu20.04+ANTSDR E310V2)
最近被安排做一个ADS-B信号接收的项目,拿到软件无线电模块(ANTSDR E310V2)后安装环境和软件真的太折磨了。。在此记录以下我走过的弯路,大家可以参考一下。
用JAVA来模拟实现银行家算法
用JAVA来模拟实现银行家算法 此代码每一行代码都是我自己动手实现的,如果有写不好的,或者有错误的地方还请大家指出。 如果对该算法或者java的基础语法不熟悉的同学可以先去看看其他博客: 银行家算法推荐博客 银行家算法的图解(也是转自上述博客): 实验目的: 加深对死锁概念的理解 能够利用银行家算法,有效避免死锁的发生,或者检测死锁的存在 实验内容: 实验要求用高级语言编写和调试一...
RandLA-Net 调通代码1:Windows 11 + Tensorflow 2.4 + S3DIS数据集【踩坑+填坑】
TF不上进啊,学学pytorch
论文阅读: SIGIR 2025 ID-Free Not Risk-Free: LLM-Powered Agents Unveil Risks in ID-Free Recommender Syste
咱们平时用的推荐系统(比如购物APP推商品、视频APP推剧),大多是“有ID”的——每个用户、每个商品都有个专属ID,系统靠这些ID记录你的浏览、购买历史,再给你推喜欢的东西。但这种方式有个大问题:新用户、新商品刚上线时没有ID历史数据,系统没法精准推荐,这就是“冷启动”难题。后来人们搞出了“无ID推荐系统”:不用ID了,改成直接分析商品的文字信息(比如商品标题、描述),靠大语言模型(LLM,类似ChatGPT的技术)把文字转成“语义代码”,再通过这些“代码”判断你可能喜欢什么。
银行家算法(Java实现)
银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
总结个人关于雷达样式的见解(脉内脉间调制)
概述 雷达有各种各样的脉内脉间调制样式,对于雷达的设计者来说,不外乎三个目的: 1、增加雷达性能,如提高测距精度,增大侦察距离等; 2、雷达的工作机制决定雷达必须采用此种样式的调制,如有些SAR雷达为保证径向测距精度,需要使用脉内宽带调制信号; 3、降低雷达被电子战装备截获的概率,也就是LPI设计。 对于雷达对抗方,则只会观察到信号存在脉内及脉间的调制。对于一般的雷达信号,通常只采用脉内调制,脉间频率调制,脉间PRI调制。 脉间调制类型 1、PD雷达的脉间特征 雷达进行脉间调制的主要是PRI..
Java模拟实现银行家算法
银行家算法是我们的老朋友迪杰斯特拉为T.H.E系统设计的一种避免死锁产生的算法。该算法最初是为银行系统设计的,为了保证银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。银行家算法是一个非常经典的算法,也是死锁避免算法中的最具代表性的算法,其思想是非常值得我们学习的。死锁处理的四种方法:预防死锁、避免死锁、检测死锁、解除死锁。其中预防死锁最为复杂,需要为OS设定各种定律、准则,较难实现,且较为影响系统的性能,最主要的就是并发效率下降;避免死锁可以让OS不必遵循特定的准则,因此给OS施加的限制较小...
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
银行家算法概述及Java实现
一、银行家算法 银行家算法是一种最有代表性的避免死锁的算法。又被称为“资源分配拒绝”法。 在银行家算法中需要定义一些数据结构: 1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。 2)最大需求矩阵Max、 这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资...
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
基于JAVA的银行家算法实现实验报告
一、实验概述 1. 实验名称 基于JAVA平台的银行家算法实现 2. 实验目的 (1)理解利用银行家算法避免死锁的问题; (2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。 (3)理解和掌握安全序列、安全性算法。 3. 实验内容 银行家算法: 银行家算法最初级原为银行系统设计,以确保银行在发放现金贷款时,不会发生...
用Java实现银行家算法
用Java实现银行家算法 一、银行家算法 银行家算法是这样一种资源分配算法:系统给进程分配资源时,先检查状态是否安全,方法是看它是否有足够的剩余资源满足一个距最大需求最近的进程。 如果有,那么分配资源给该进程,然后接着检查下一个距最大需求最近的进程,如此反复下去。如果所有进程都能获得所需资源,那么该状态是安全的,最初的进程申请资源可以分配。 二、算法所需的数据结构 Available 表示当前系统可以使用的资源数,使用一维数组来存储 Request 表示进程向系统申请的各类资源数。使用一维数组实现
Java实现银行家算法
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。 下面是用Java实现银行家算法的代码: import java.util.Scanner; public class Banker { int available[] = new int[]{3,
java模拟银行家算法_java实现银行家算法
java实现银行家算法发布于 2021-1-11|复制链接摘记: 本文实例为大家分享了java实现银行家算法的具体代码,供大家参考,具体内容如下```javaimport java.util.Arrays;import javax.swing.JOptionPane;public class Banker_Dijkstra {static int available[]={3,3,2}; ....
操作系统-银行家算法(Java实现)
一、银行家算法思想 银行家算法是最著名的死锁避免算法,其思想是:将操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。进程运行之前先声明对各种资源的最大需求量,当进程在执行继续申请资源是,先测试该进程已占用的资源数与本次申请的资源数之和是否超过该进程声明的最大需求量。若超过则拒绝分配资源,若未超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前申请量分配资源,否则也要推迟分配。 二、
银行家算法,Java实现
Java实现银行家算法原理代码测试结果 原理 设 Request;是进程Pi的请求向量,如果 Requesti[j] = K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检査: (1) 如果 Requesti[j] ≤ Need[i,j]便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。 (2) 如果 Requesti[j] ≤ Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。 (3) 系统试探着把资源分配
银行家java实现图_java实现简单银行家算法
本文实例为大家分享了java实现银行家算法的具体代码,供大家参考,具体内容如下题目:初始时,Allocate[i,j]=0,表示初始时没有进程得到任何资源。假定进程对资源的请求序列为:Request(1)[M]=(1,0);Request(2)[M]=(2,1,1);Request(3)[M]=(2,1);Request(4)[M]=(0,2);Request(2)[M]=(1,1);Reques...
9万+



被折叠的 条评论
为什么被折叠?



