银行家算法-java

算法第4版如何在idea上运行? 先从github上拉取完整代码。https://github.com/kevin-wayne/algs4 再去官网https://algs4.cs.princeton.edu/code/下载 algs4.jar和algs4-data.zip这两个一个是jar包,一个是所需要的数据。 2.1 这是我下载的jar包的路径F:\Algorithm\algorithm4th\algs4.jar 注意:配置完了要重启!!! 2.2 重启过后,用idea打开下载好的algs4-master,如下图所示。把al. 阅读详情

银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法.

1.算法原理

操作系统是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;(即request <= available)
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;(即request<=need)
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

2.所用到的数据结构
最大需求max数组:max[i][j] 系统中i个进程中的每一个进程对 j 资源的最大需求.

需求need数组:need[i][j] = max[i][j] - allocation[i[[j] .

已分配allocation数组:allocation[i][j] 系统中每一类资源当前已分配给每一进程的资源数.

可利用资源available数组:是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.

安全序列safeList数组:所有线程均执行完毕,会产生一个执行序列,用该数组来存放.

系统资源source数组:存放系统资源的类型.

3.代码实现如下

package OS;

import java.util.Arrays;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description: 银行家算法
 * User: ZHANFEI
 * Date: 19-12-22
 * Time: 下午1:15
 */
public class Banker {
    //每个进程的最大资源
    private int[][] max;
    //每个进程需要的资源
    private int[][] need;
    //每个进程目前有的资源
    private int[][] allocation;
    //可获得的资源
    private int[] available;
    //进程数
    private int processNum;
    //安全性序列
    private int[] safeList;
    //资源种类
    public static String[] source = new String[]{"A","B","C","D","E"};
    public static int sourceNum;
    
    //构造函数
    public Banker() {
        init();
    }
    
    /**
     * 手动初始化
     */
    public void init() {
        Scanner in = new Scanner(System.in);
        System.out.println("输入进程数:");
        processNum = in.nextInt();
        System.out.println("输入资源数量:");
        sourceNum = in.nextInt();
        //对数组初始化
        System.out.println("输入max:");
        max = new int[processNum][sourceNum];
        for (int i = 0; i < processNum; i++) {
            for (int j = 0; j < sourceNum; j++) {
                max[i][j] = in.nextInt();
            }
        }
        System.out.println("输入allocation:");
        allocation = new int[processNum][sourceNum];
        for (int i = 0; i < processNum; i++) {
            for (int j = 0; j < sourceNum; j++) {
                allocation[i][j] = in.nextInt();
            }
        }
        need = new int[processNum][sourceNum];
        for (int i = 0; i < processNum; i++) {
            for (int j = 0; j < sourceNum; j++) {
                need[i][j] = max[i][j] - allocation[i][j];
            }
        }
        System.out.println("输入available:");
        available = new int[sourceNum];
        for (int i = 0; i < sourceNum; i++) {
            available[i] = in.nextInt();
        }
    }

    /**
     * 打印每个进程的相关信息
     */
    public void print() {
        System.out.println("id   MAX   Need   Allocation ");
        System.out.print("   ");
        for(int j=0;j<3;j++) {
            for (int i = 0; i < sourceNum; i++) {
                System.out.print(source[i] + " ");
            }
        }
        System.out.println();
        for (int i = 0; i < processNum; i++) {
            System.out.print(i + "  ");
            //打印i号进程最大资源数
            for(int j=0;j<max[j].length;j++) {
                System.out.print(max[i][j] + " ");
            }
            //打印i号进程需要进程数
            for(int j=0;j<need[j].length;j++) {
                System.out.print(need[i][j] + " ");
            }
            //打印i号进程目前获得进程数
            for(int j=0;j<allocation[j].length;j++) {
                System.out.print(allocation[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println(Arrays.toString(available));
    }

    /**
     * 进行试分配
     * @param requestId   试分配的进程id
     * @param inRequest   请求的资源数组
     * @return
     */
    public boolean change(int requestId,int[] inRequest) {
        int[] request = inRequest;
        //1.判断request和need的大小
        for (int i = 0; i < request.length; i++) {
            if(!(request[i] <= need[requestId][i])) {
                System.out.println("请求的资源超过了所需要的最大值,请求失败");
                return false;
            }
        }
        //2.判断request和available的大小
        for (int i = 0; i < request.length; i++) {
            if( !(request[i] <= available[i])) {
                System.out.println("资源不足,请求失败");
                return false;
            }
        }
        //3.进行试分配
        //need = need - request ;
        //allocation = allocation + request;
        //available = available - request;
        for(int i=0;i<request.length;i++) {
            need[requestId][i] = need[requestId][i] - request[i];
            allocation[requestId][i] = allocation[requestId][i] + request[i];
            available[i] = available[i] - request[i];
        }

        //进行安全性检查
        boolean flag = checkSafe(available);
        if(flag == true) {
            System.out.println("分配成功");
            for(int i=0;i<3;i++) {
                need[requestId][i] = need[requestId][i] + request[i];
                allocation[requestId][i] = allocation[requestId][i] - request[i];
                available[i] = available[i] + request[i];
            }
            return true;
        } else {
            //不能分配,需要将数据恢复到分配之前
            System.out.println("分配失败");

            for(int i=0;i<3;i++) {
                need[requestId][i] = need[requestId][i] + request[i];
                allocation[requestId][i] = allocation[requestId][i] - request[i];
                available[i] = available[i] + request[i];
            }
            return false;
        }
    }

    /**
     * 安全性检查
     * @param available  可获取资源数组
     * @return
     */
    public boolean checkSafe(int[] available) {
        int[] work = new int[available.length];
        for (int i = 0; i < work.length; i++) {
            work[i] = available[i];
        }

        int i=0,n=0;
        int j;
        boolean[] finish = new boolean[processNum];
        safeList = new int[processNum];

        while(i<processNum) {
            if(finish[i] == false && judge(i,need,work)) {
                System.out.println("进程"+i+"分配成功");
                //加入到序列中
                safeList[n++] = i;
                for(int m=0;m<work.length;m++) {
                    work[m] = work[m] + allocation[i][m];
                }
                finish[i] = true;
                //分配成功 从头重新开始
                i = 0;
            } else {
                i++;
            }
        }

        for(i = 0;i<finish.length;i++) {
            if(finish[i] == false) {
//                System.out.println(i+"失败");
                System.out.println(Arrays.toString(safeList));
                return false;
            }
        }
        System.out.println(Arrays.toString(safeList));

        return true;
    }

    /**
     * 安全性检测时比较当前进程的 need 和 work
     * @param id    当前进程id
     * @param need      当前进程所需资源 数组
     * @param work      当前系统可提供资源 数组
     */
    private boolean judge(int id, int[][] need, int[] work) {
        int j;
        for (j = 0; j < work.length; j++) {
            if(!(need[id][j] <= work[j])){
                return false;
            }
        }
        return true;
    }


    public static void main(String[] args) {
        Banker banker = new Banker();
        int requestId;
        int[] request = new int[sourceNum];
        Scanner in = new Scanner(System.in);
        banker.print();

        while(true) {
            System.out.println("输入需要请求的进程号id():");
            requestId = in.nextInt();
            System.out.println("输入需请求的各类资源数目:");
            for(int i=0;i<sourceNum;i++) {
                System.out.println("请求"+source[i]+"资源的数目:");
                request[i] = in.nextInt();
            }
            //进行安全检查
            banker.change(requestId,request);
            System.out.println("是否继续分配 0/1");
            int choice = in.nextInt();
            if(choice == 1) {
                break;
            }
        }

    }
}


运行结果:
在这里插入图片描述在这里插入图片描述
当线程0请求{0,0,0,0} 就相当于检测T0时刻是否安全.

银行家算法的java代码实现,Swing写的界面 java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法。 直接上代码:①界面展示方法:public void ShowFrame() { this.setSize(500, 350); //大小 this.setAlwa 阅读详情

相关推荐

【模型构建器教程】教你在ArcGIS中如何按照字段值批量导出shp文件

【模型构建器教程】教你在ArcGIS中如何按照字段值批量导出shp文件

weixin_45469245的博客 6456

Android多进程加载资源失败问题分析:android.content.res.Resources$NotFoundException: Resource ID #0x7f08XXXX

在Android开发中如果存在多进程共享资源用法时, 会出现资源到不到问题. 真实碰到的问题, 记录下来提供同学们参考 一, 崩溃信息 崩溃日志如下 --------- beginning of crash 08-17 18:54:00.622 17167 17167 E AndroidRuntime: FATAL EXCEPTION: main 08-17 18:54:00.622 17167 17167 E AndroidRuntime: Process: com.mobile.emm.trus

zhanghao_Hulk的专栏 2358

3D Slicer肺部CT病灶体积测量:阈值法实操全流程

在医学影像分析中,病灶体积的精准测量是肿瘤评估、疗效随访和科研统计的重要基础。传统逐层手动勾画不仅耗时,且主观差异大,而基于CT值的阈值分割技术,通过设定灰度区间自动提取目标体素,能够快速生成三维分割结果,具有高效、可重复、边界标准统一的优势,尤其适用于肺部实性结节这类与周围肺实质对比度高的病灶。理解体素与CT值的关系,掌握阈值范围的设定逻辑,并配合连通域分析、边缘修正等工程化操作,即可在3D Slicer中稳定获得可靠的体积数据。本文从技术原理出发,系统梳理了DICOM导入、窗宽窗位调节、阈值选择、三维重

weixin_29050271的博客 252

操作系统银行家算法(java实现)

先上效果图,避免浪费时间 银行家算法步骤: (1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。 (2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。 (3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值: Available=Available-Request[i]; Allocation=Allocation+R...

weixin_46050542的博客 3023

Test-Time Adaptation Induces Stronger Accuracy and Agreement-on-the-Line

TTA不管是否提高了OOD的泛化性都增强了线性的趋势,TTA的初始目的是为了增强OOD的表现,一个人可能会觉得TTA使得ACL更强的原因是他消除了ID和OOD之间的差距,因此所有模型间ID vs OOD的准确率接近于y=x这条线,但是实际上这个解释不能够反映我们的经验发现,因为虽然TTA将分布之间的偏移简化为一种放缩的分布,但是这个放缩的因子幅值可能很大,也就是α<<1但是r>>1,这就会导致很偏离y=x这条线,而且理论分析也是,虽然ID和OOD的差距很大,但是线性关系还在。

m0_62673638的博客 149

通信模组性能调优

本文介绍了高通平台通信模组性能调优的方法,主要包括硬件加速技术和CPU负载优化。针对CPU负载优化,提出了内核RPS/RFS功能启用、网卡队列调整、中断均衡、CPU性能模式设置等措施。同时建议关闭热管理并加强散热,调整TCP接收/发送缓存大小以解决TCP异常报文问题。这些优化手段可显著提高整机吞吐率测试中的网络性能表现。

四儿家的小祖宗的博客 1360

操作系统实验报告

利用C++设计实现银行家算法的基本过程。

m0_70350178的博客 3764

模型预测控制(MPC)解析(二):单输入单输出系统

在上一篇中,为了便于说明,预测控制系统采用单输入单输出系统为例进行设计。由于系统模型使用的是状态空间方程,于是可以很容易的将这种设计方法可以扩展到多输入、多输出系统。

行者无疆的博客 8225

共轭梯度(CG)算法

共轭梯度(CG)方法计算数学与科学工程计算研究所 陆嵩简单介绍共轭梯度方法也是一种迭代方法,不同于Jacobi,Gauss-Seidel和SOR方法,理论上只要n步就能找到真解,实际计算中,考虑到舍入误差,一般迭代3n到5n步,每步的运算量相当与矩阵乘向量的运算量,对稀疏矩阵特别有效。 共轭梯度方法对于求解大型稀疏矩阵是很棒的方法,但是这个方法看起来总不是太靠谱。这个方法也不是越迭代精度越高,有

LSEC小陆的博客 9万+

大数据架构中的数据治理:元数据管理与数据血缘追踪实践

本文将聚焦大数据架构中数据治理的两大核心支柱——元数据管理与数据血缘追踪元数据管理的目标、类型与实施步骤(从需求分析到工具落地);数据血缘追踪的技术实现(静态解析、动态捕获、混合方案)与应用场景;如何将两者结合,构建完整的数据治理体系,并通过真实案例展示落地效果。元数据管理:定义了业务/技术/操作元数据,讲解了工具选型(如Apache Atlas)、采集(Hook/API)、存储(关系库+图数据库)、应用(数据发现、质量监控);数据血缘追踪。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 868

【RT-DETR涨点改进】小目标检测、特征融合改进篇 | TGRS 2024 | RT-DETR引入CSFM上下文选择融合模块,适合多模态检测、红外小目标检测、小目标检测、遥感目标检测等任务有效涨点

本文提出了一种改进RT-DETR目标检测模型的方法,通过引入上下文选择融合模块(CSFM)显著提升复杂背景下小目标和低对比度目标的检测精度。CSFM模块采用多尺度特征融合和动态特征选择机制,有效增强模型的全局上下文感知能力,同时保留细节特征。该模块通过通道减少机制和空间信息调节,实现从粗到细的特征聚合,减少误报并提高轮廓检测精度。实验表明,改进后的RT-DETR模型在多个基准测试中表现优异,计算效率与检测精度均优于现有方法。文章还详细介绍了模块配置和yaml文件修改方法,为模型部署提供指导。

Ai缝合怪、助力小伙伴高效发论文 1725

基于JAVA的银行家算法实现实验报告

一、实验概述 1. 实验名称 基于JAVA平台的银行家算法实现 2. 实验目的 (1)理解利用银行家算法避免死锁的问题; (2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。 (3)理解和掌握安全序列、安全性算法。 3. 实验内容 银行家算法: 银行家算法最初级原为银行系统设计,以确保银行在发放现金贷款时,不会发生...

u011361470的博客 4631

将物理信息神经网络(PINN)应用于微通道湍流的拓扑优化,并结合COMSOL数据进行训练与快速预测

本文提出一种基于物理信息神经网络(PINN)的微通道散热器流场快速预测方法。通过有限组COMSOL仿真数据训练神经网络,结合Navier-Stokes方程和能量方程作为物理约束,构建可快速预测新拓扑结构下速度场和温度场的替代模型。该方法包含数据准备、网络构建、损失函数设计等关键步骤,利用自动微分计算方程残差,显著降低传统CFD优化的计算成本,实现秒级/分钟级的流场预测,为微通道散热器拓扑优化提供高效解决方案。

huanghm88的专栏 536

用JAVA来模拟实现银行家算法

用JAVA来模拟实现银行家算法 此代码每一行代码都是我自己动手实现的,如果有写不好的,或者有错误的地方还请大家指出。 如果对该算法或者java的基础语法不熟悉的同学可以先去看看其他博客: 银行家算法推荐博客 银行家算法的图解(也是转自上述博客): 实验目的: 加深对死锁概念的理解 能够利用银行家算法,有效避免死锁的发生,或者检测死锁的存在 实验内容: 实验要求用高级语言编写和调试一...

东瓜blog 3534

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java模拟实现银行家算法

银行家算法是我们的老朋友迪杰斯特拉为T.H.E系统设计的一种避免死锁产生的算法。该算法最初是为银行系统设计的,为了保证银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。银行家算法是一个非常经典的算法,也是死锁避免算法中的最具代表性的算法,其思想是非常值得我们学习的。死锁处理的四种方法:预防死锁、避免死锁、检测死锁、解除死锁。其中预防死锁最为复杂,需要为OS设定各种定律、准则,较难实现,且较为影响系统的性能,最主要的就是并发效率下降;避免死锁可以让OS不必遵循特定的准则,因此给OS施加的限制较小...

丹丹的后花园 6845

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

银行家算法(Java实现)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

u014634576的博客 5万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

用Java实现银行家算法

用Java实现银行家算法 一、银行家算法   银行家算法是这样一种资源分配算法:系统给进程分配资源时,先检查状态是否安全,方法是看它是否有足够的剩余资源满足一个距最大需求最近的进程。   如果有,那么分配资源给该进程,然后接着检查下一个距最大需求最近的进程,如此反复下去。如果所有进程都能获得所需资源,那么该状态是安全的,最初的进程申请资源可以分配。 二、算法所需的数据结构 Available 表示当前系统可以使用的资源数,使用一维数组来存储 Request 表示进程向系统申请的各类资源数。使用一维数组实现

LinHongHu2的博客 2882

银行家算法(java实现)

银行家算法(java实现) 1.什么是安全序列 所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。 如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,则可能会发

拧发条鸟的博客 1万+

银行家算法概述及Java实现

一、银行家算法 银行家算法是一种最有代表性的避免死锁的算法。又被称为“资源分配拒绝”法。 在银行家算法中需要定义一些数据结构: 1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。 2)最大需求矩阵Max、 这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资...

Jewel’s blog 1万+

java 银行家算法

Arthas 是阿里巴巴开源的一款强大的 Java 诊断工具,支持在线排查问题、动态跟踪代码、监控 JVM 状态等,无需重启应用。算法,由 Edsger Dijkstra 提出,用于确保系统在分配资源时不会进入不安全状态(可能导致死锁)。System.out.println("资源不足,请等待...");System.out.println("分配会导致系统不安全,已回滚!System.out.println("分配成功,系统仍安全!// 无进程可执行,不安全。

leijmdas的专栏 1270

银行家算法JAVA

说明: 银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法。本实验要求用高级语言编写一个银行家的模拟算法。通过本实验可以对预防死锁和银行家算法有更深刻的认识。 内容: (1)设置数据结构 Name[]资源的名称,Max[][]最大需求矩阵,Allocation[][]系统已分配资源矩阵,Need[][]还需要资源矩阵,Available[]可用资源数组,Request[]请求资源向量,Work[]存放系统可提供资源数量,Finish[]标记是否有足够资源分配给各个进程,Security[]安全

Alice_Synthesi的博客 2219

操作系统-银行家算法(Java实现)

一、银行家算法思想 银行家算法是最著名的死锁避免算法,其思想是:将操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。进程运行之前先声明对各种资源的最大需求量,当进程在执行继续申请资源是,先测试该进程已占用的资源数与本次申请的资源数之和是否超过该进程声明的最大需求量。若超过则拒绝分配资源,若未超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前申请量分配资源,否则也要推迟分配。 二、

qq_44111805的博客 2万+

Java实现银行家算法

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。 下面是用Java实现银行家算法的代码: import java.util.Scanner; public class Banker { int available[] = new int[]{3,

孟祥月的专栏 1万+

银行家算法,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) 系统试探着把资源分配

qq_44404616的博客 590

银行家算法java代码

import java.util.Scanner; public class banker { private int Process = 0; // 定义最大进程数目 private int Resource = 0; // 定义最大资源类数 private int Work[]; // 定义系统可提供给进程继续运行所需的各类资源数目 private int MAX[][]; // 定义进程最大资源需求 private int Allocation[]

寻梦&之璐 834
上一篇: 进程与线程
下一篇: SpringMVC简介(常用注解,拦截器,异常处理)
Java-fly
博客等级 码龄9年 13粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值