银行家算法-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 阅读详情

相关推荐

基于TI C2000的CCS安装与工程创建完整示例

手把手演示基于TI C2000系列的CCS安装过程及首个工程创建步骤,涵盖环境配置与常见问题处理,助力快速上手嵌入式开发,ccs安装和工程搭建不再难。

weixin_42476987的博客 972

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

智能驾驶感知模块的测试评估方法(上)

对于智能驾驶系统而言,感知模块是开发难度最大、投入资源最多的核心部分。在智能驾驶开发团队内部,感知模块需要独立进行评测才能及早发现潜在缺陷或判断性能是否有改进。随着近几年BEV、OCC、E2E等新技术方案被越来越多企业应用,感知的评测变得越来越艰难,效率也变得越来越低下。本文作者基于在智驾测试行业多年经验,试图总结感知评测的基本规律和效率提升方法,以供读者一些启发。

vincent_321的博客 2559

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

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

weixin_46050542的博客 3023

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行。

吻等离子的博客 3358

开源的预测气象大模型与数据获取/可视化

「开源气象大模型与数据获取指南」摘要: 当前主流AI气象模型(如ECMWF的AIFS、DeepMind的GraphCast、华为Pangu等)主要基于ERA5/HRES数据训练。开源资源可通过ECMWF OpenData、GitHub仓库及Google Cloud获取,其中AIFS数据采用CCBY-4.0许可可商用,其他模型多有限制性许可。典型应用流程包括:1)通过Python包获取实时预报数据;2)加载预训练权重进行推理;3)使用xarray/cartopy或Zarr进行可视化。训练数据可从CDS下载ER

专注AI大模型,软件混淆,授权 797

操作系统实验报告

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

m0_70350178的博客 3764

从零到一构建一个智能爬虫 Agent 完整教程

本文将打造一个具备自主决策、动态解析、反反爬、持久化能力的智能爬虫 Agent

数据知道的博客 4798

共轭梯度(CG)算法

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

LSEC小陆的博客 9万+

Rockchip开发系列 - 3.4.GPIO扩展芯片AW95xx和PCA953X(2)

Rockchip开发系列 - 3.3.GPIO扩展芯片AW95xx和PCA953X(2)

fulinux的博客 1007

LLM制造业最佳实践:基于大语言模型处理最优化问题,制造业如何更优排产,提升资源利用率

随着制造业数字化转型加速,生产排产优化成为提升企业效率和竞争力的关键环节。大语言模型(LLM)凭借其强大的多模态数据处理、动态优化和智能推理能力,在复杂排产场景中展现出独特优势。谷歌、DeepSeek等机构的研究表明,LLM可通过自然语言交互和生成式决策,突破传统优化算法的局限性。本报告结合半导体行业实践案例与技术路径,系统分析LLM在排产优化中的应用潜力与挑战。

shiter编写程序的艺术 939

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

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

u011361470的博客 4631

Pixhawk2.4.8接口及引脚定义

pixhawk2.4.8接口定义图解

加斯顿工程师的博客 8753

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

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

东瓜blog 3534

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java模拟实现银行家算法

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

丹丹的后花园 6845

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

银行家算法(Java实现)

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

u014634576的博客 5万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

用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、付费专栏及课程。

余额充值