OS银行家算法-Java

2023-10-27

OS作业,记录防丢

package Bank;

public class Banker
{

	public static void main(String[] args)
	{
		OS os = new OS(3, 3, 2);
		MyThread p0 = new MyThread(os, 0, 7, 5, 3, 0, 1, 0);
		MyThread p1 = new MyThread(os, 1, 3, 2, 2, 2, 0, 0);
		MyThread p2 = new MyThread(os, 2, 9, 0, 2, 3, 0, 2);
		MyThread p3 = new MyThread(os, 3, 2, 2, 2, 2, 1, 1);
		MyThread p4 = new MyThread(os, 4, 4, 3, 3, 0, 0, 2);
		System.out.println("    Max    |" + " Allocation|" + " Need     |" + "Available");
		System.out.println("    A  B  C|  A  B  C  | A  B  C  |A  B  C");

		p0.start();
		p1.start();
		p2.start();
		p3.start();
		p4.start();

	}

}
package Bank;

import java.lang.Math;

public class MyThread extends Thread {
	int maxA = 0;
	int maxB = 0;
	int maxC = 0;
	
	int num = 0;

	int[] abc_num =new int[3];// 接受request的数组


	int reqA = 0;
	int reqB = 0;
	int reqC = 0;
	private OS os;

	MyThread(OS os,int num,int maxA, int maxB, int maxC,int allocation_a,int allocation_b,int allocation_c) 
	{
		this.maxA = maxA;
		this.maxB = maxB;
		this.maxC = maxC;
		this.os = os;
		os.Allocation[num][0] += allocation_a;
		os.Allocation[num][1] += allocation_b;
		os.Allocation[num][2] += allocation_c;
		os.Need[num][0] += (maxA - allocation_a); 
		os.Need[num][1] += (maxB - allocation_b); 
		os.Need[num][2] += (maxC - allocation_c); 
		this.num = num;
	}

	public void run()// request
	{
		while (os.Need[num][0]!=0||os.Need[num][1]!=0||os.Need[num][2]!=0)// 循环一次请求一次
		{
			reqA = (int) (Math.random() * os.Need[num][0] + 0.1);
			reqB = (int) (Math.random() * os.Need[num][1] + 0.1);
			reqC = (int) (Math.random() * os.Need[num][2] + 0.1);

			try {
				Thread.sleep((int) (Math.random() * 100));
				if (reqA!=0||reqB!=0||reqC!=0)	
				{
					System.out.println("p"+num+"  request A:"+reqA+"  request B:"+reqB+"  request C:"+reqC);
					os.Request(this,os,reqA, reqB, reqC);
					
					System.out.println("p"+num+"  "+maxA+"  "+maxB+"  "+maxC+"|"+"  "+os.Allocation[num][0]+"  "+os.Allocation[num][1]+"  "+os.Allocation[num][2]+"  |"+" "+os.Need[num][0]+"  "+os.Need[num][1]+"  "+os.Need[num][2]+"  |"+os.Available[0]+"  "+os.Available[1]+"  "+os.Available[2]+"|");
					
				}			
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}
		os.Available[0] += maxA;
		os.Available[1] += maxB;
		os.Available[2] += maxC;
		os.Allocation[num][0] -= maxA;
		os.Allocation[num][1] -= maxB;
		os.Allocation[num][2] -= maxC;
		System.out.println("p"+num+"运行完了");
		//notifyAll();
	}
}
package Bank;

public class OS
{
	public int[] Available = { 0, 0, 0 };
	public int[][] Max = new int[5][3];
	public int[][] Allocation = new int[5][3];
	public int[][] Need = new int[5][3];

	OS(int a, int b, int c)
	{
		Available[0] += a;
		Available[1] += b;
		Available[2] += c;
	}

	public synchronized void Request(MyThread th, OS os, int a, int b, int c)
	{
			while (a > os.Available[0] || b > os.Available[1] || c > os.Available[2]||(!Safe(th, os, a, b, c)))
			{
				try
				{
					//System.out.println("w1等");
					wait(100);
					//System.out.println("w2等");
				} catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}

			os.Available[0] -= a;
			os.Available[1] -= b;
			os.Available[2] -= c;

			os.Allocation[th.num][0] += a;
			os.Allocation[th.num][1] += b;
			os.Allocation[th.num][2] += c;

			os.Need[th.num][0] -= a;
			os.Need[th.num][1] -= b;
			os.Need[th.num][2] -= c;

			notifyAll();
	}

	private boolean Safe(MyThread th, OS os, int a, int b, int c)
	{
		boolean IsSafe = false;
		int[] work = new int[3];
		os.Available[0] -= a;
		os.Available[1] -= b;
		os.Available[2] -= c;
		work[0] = os.Available[0];
		work[1] = os.Available[1];
		work[2] = os.Available[2];
		os.Allocation[th.num][0] += a;
		os.Allocation[th.num][1] += b;
		os.Allocation[th.num][2] += c;
		os.Need[th.num][0] -= a;
		os.Need[th.num][1] -= b;
		os.Need[th.num][2] -= c;
		boolean[] Finish = new boolean[5];
		int i = 0;
		while(i!=6)
		{
			i = Find_i(Finish,work);
			if (i!=6)
			{
				work[0] += os.Allocation[i][0];
				work[1] += os.Allocation[i][1];
				work[2] += os.Allocation[i][2];
				Finish[i] = true;
				if (IsAllFinish(Finish))
					break;
			}
		}
		if (IsAllFinish(Finish))//4
			IsSafe = true;
		else
			IsSafe = false;
		os.Available[0] += a;
		os.Available[1] += b;
		os.Available[2] += c;
		os.Allocation[th.num][0] -= a;
		os.Allocation[th.num][1] -= b;
		os.Allocation[th.num][2] -= c;
		os.Need[th.num][0] += a;
		os.Need[th.num][1] += b;
		os.Need[th.num][2] += c;
		return IsSafe;
	}
	private int Find_i(boolean[] Finish,int[] work)
	{
		for(int i=0;i<5;i++)
		{
			if (!Finish[i]&&Need[i][0] <= work[0] && Need[i][1] <= work[1] && Need[i][2] <= work[2])
			{
				return i;
			}
		}
		return 6;//6就是没有true
	}

	private static boolean IsAllFinish(boolean[] finish)
	{
		boolean IsAllFinish = true;
		for (int i = 0; i < 5; i++)
		{
			if (finish[i] == false)
			{
				IsAllFinish = false;
			}
		}
		return IsAllFinish;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OS银行家算法-Java 的相关文章

  • Java课程设计之学习成绩管理系统

    package System import java awt import java awt event import java io import javax swing import javax swing table Abstract
  • 6.OS运行机制(补充)

    中断
  • texlive支持中文的简单方法

    1 确保tex文件的编码方式是UTF 8 2 在文档开始处添加一行命令即可 即 usepackage UTF8 ctex 如下所示 documentclass article usepackage UTF8 ctex begin artic
  • 线程和进程的区别(面试必备)

    参考文章 https www jianshu com p 2dc01727be45 线程与进程的区别通俗的解释 https www jianshu com p 8ad441510860 附加可参考文章 https baijiahao bai
  • 小白学协程笔记2-c语言实现协程-2021-2-10

    文章目录 前言 一 c语言中协程切换方式 二 使用setjmp 和 longjmp实现协程切换 1 setjmp和longjmp函数简介 2 协程实现 三 使用switch case实现协程切换 1 switch case小技巧 2 协程实
  • redis主从同步,总是显示master_link_status:down的解决方法

    前几天 在修改一台从节点的redis的监听端口后 重启了下redis 发现master link status 很长时间一直都是down状态 查看了redis日志 发现日志里出现很多的 I O error trying to sync wi
  • mapengpeng1999@163.com 操作系统4~处理机调度

    处理机调度 1 三级调度体系 1 处理机调度主要是对处理机运行时间进行分配 即 按照一定算法或策略 将处理机运行时间分配给各个并发进程 同时尽量提高处理机的使用效率 2 现代操作系统中 按调度所实现的功能分3种类型 高级调度 中级调度和低级
  • 操作系统学习(九)进程通信

    一 知识总览 二 定义 进程通信是指进程之间的信息交换 每个进程都拥有自己的内存空间 是相互独立的 这样在每个进程执行时 才不会被其他进程所干扰 三 进程通信的方式 1 共享存储 1 两个进程对共享区的访问必须是互斥的 即在同一时间内 只允
  • pycharm内存不足时如何修改设置?

    Help gt Find Action gt type VM Options gt Click Edit Custom VM Options Pycharm 2016 2 will open the appropriate vmoption
  • RTX线程通信之——线程标志

    文章目录 Thread Flags 概念 RTX线程标志API 案例 LED灯同步闪亮 小结 参考资料 Thread Flags In a real application we need to be able to communicate
  • 设备管理过程

    复杂度2 5 机密度2 5 最后更新2021 04 19 AIX中对设备会有如下五个操作 define aix下能看到设备的定义 但驱动程序并没有加载或初始化 该设备不可用 lsdev看到设备时defined 很多逻辑设备 vg lv等 只
  • gpuz怎么看显存颗粒

    gpuz可以帮助一些用户查看电脑的一切显卡参数 对于想要了解显卡的网友来说使用起来是非常方便的 不过有些网友是刚开始使用 还不知道gpuz怎么看显存颗粒 下面小编就教下大家gpuz查看显存颗粒的方法 首先 显存颗粒是显存的物理存储组成单元
  • CF、SF、OF、ZF标志位

    没学汇编 这种题我真是做一道错一道 OF overflow flag 溢出标志位 溢出标志位 OF 1 表示带符号整数运算时结果发生溢出 对于无符号整数运算 OF没有意义 对于有符号数的溢出判断方式有 1 采用一位符号位 思想为 或 则为溢
  • Linux,Network manager 导致节点异常重启

    推断是Network manager 导致的 原因待查今天在VmWare的虚拟机上装了个测试RAC 又遇到了一个摸不到头绪的问题CRS装好后 一旦登陆图形界面 节点就重启 事情就有这么巧不登陆图形界面 观察了1个小时没问题 一旦登陆后 立刻
  • Linux学习--CentOS7.5

    CentOS7命令大全 Linux系统简介 Unix Linux发展史 Linux目录结构 树形结构 查看 切换以及创建目录 文本内容操作 grep工具 关机和重启 Linux命令 基本用法 ls list 使用通配符 mkdir 别名 g
  • Visual studio 2005 hangs on startup AppHangXProcB1 svchost devenv.exe svchost.exe:{2a811bb2-303b-48b...

    This problem has been torturing me for the whole afternoon and after searching on the web for a long time I finally get
  • 自己动手写操作系统(一)

    本系列文章将一步步实现一个简单的操作系统 实验环境是在Linux系统下通过Bochs虚拟机运行我们自己写的操作系统 一 实验环境搭建 1 Ubuntu的安装 Windows用户可以选择在虚拟机中安装Ubuntu 具体安装教程可自行搜索 2
  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • 《OSPF和IS-IS详解》一1.7 独立且平等

    本节书摘来自异步社区 OSPF和IS IS详解 一书中的第1章 第1 7节 作者 美 Jeff Doyle 更多章节内容可以访问云栖社区 异步社区 公众号查看 1 7 独立且平等 OSPF和IS IS详解与TCP IP相比 OSI协议对各国

随机推荐

  • jvm-04运行时数据区(方法区)

    1 堆 栈 方法区的交互关系 运行时数据区结构图 堆 栈 方法区的交互关系 2 方法区的理解 Java虚拟机规范 中明确说明 尽管所有的方法区在逻辑上属于堆的一部分 但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩 但对于HotSpo
  • QSPI协议详解(二)

    1 QSPI协议简介 QSPI是Queued SPI的简写 是Motorola公司推出的SPI接口的扩展 比SPI应用更加广泛 在SPI协议的基础上 Motorola公司对其功能进行了增强 增加了队列传输机制 推出了队列串行外围接口协议 即
  • Linux和Windows中下载FFmpeg

    Linux和Windows中下载FFmpeg 注意 在Linux下下载FFmpeg 必须要让 usr local ffmpeg中的目录为空 否则无法生成新的版本内容 我就是了 1 Linux下 1 打开官网 点击Download 然后点击L
  • coderforces round 894(div.3)

    Problem A Codeforces AC代码 include
  • 【跑实验03】如何可视化GT边界框,如何选择边界框内部的边界框,如何可视化GT框和预测框,如何定义IoU阈值下的不同边界框?

    文章目录 一 如何可视化GT边界框 二 GT框和预测框的可视化 三 根据IoU阈值来选择 一 如何可视化GT边界框 from PIL import Image ImageDraw def draw bboxes image bboxes c
  • Spring实现控制反转(IOC)的三种方式(零)——理解IOC

    学过Spring的应该都知道Spring的IOC和AOP 然而我刚接触Spring不久 学习了IOC 发现掌握的不是很好 停留在概念上 今天就以例子来总结一下Spring的IOC 也希望各位大大能够指点迷津 IOC 也就是控制反转 创建对象
  • 函数重载与函数模板

    键盘输入10个数 可能为整形 浮点型 双精度型及其字符类型 分别利用函数重载和函数模板 求出其中的最大值和最小值 函数重载 include
  • 连接数据库报错 -- Access denied for user ‘‘@‘192.168.121.1‘ (using password: NO)

    问题 用idea配置好数据库配置文件application yml 在连接虚拟机数据库时 控制台报错 Access denied for user 192 168 121 1 using password NO 解决方法 1 密码配置出错
  • Win10及Win11安装及使用Wsl2 Linux子系统

    一 安装Wsl2 环境要求 必须运行 Windows 10 版本 2004 及更高版本 内部版本 19041 及更高版本 或 Windows 11 WSL2 是 WSL 1 的升级版 带来的主要优势 提高文件系统性能 支持完全的系统调用兼容
  • 你不知道的javascript之this的全面解析之绑定规则(一)

    1 1 默认绑定 首先介绍的是函数调用类型 独立函数调用 在没有其他应用下的默认规则 首先看以下代码 function foo console log this a var a 2 foo 2 我们可以看到调用foo 时 this a被解析
  • java对数据库中Date类型的处理

    java对数据库中Date类型的处理 想必在日常的敲代码生活总 用java操作数据库中的Date类型是不同于其他的 因为Date在导包的时候就分为 import java sql Date import java util Date 这两种
  • nginx 配置 ssl

    1 1 Nginx如果未开启SSL模块 配置Https时提示错误 原因也很简单 nginx缺少http ssl module模块 编译安装的时候带上 with http ssl module配置就行了 但是现在的情况是我的nginx已经安装
  • Seq2Seq 模型知识总结

    Seq2Seq 模型知识总结 目录 Seq2Seq 模型知识总结 1 模型的提出 2 RNN 结构及使用 2 1 N vs N 2 2 1 vs N 2 3 N vs 1 3 Seq2Seq 模型 3 1 Seq2Seq 结构 3 2 编码
  • 你应该掌握的七种回归技术

    摘要 本文解释了回归分析及其优势 重点总结了应该掌握的线性回归 逻辑回归 多项式回归 逐步回归 岭回归 套索回归 ElasticNet回归等七种最常用的回归技术及其关键要素 最后介绍了选择正确的回归模型的关键因素 编者按 回归分析是建模和分
  • Java大数字运算(BigInteger类和BigDecimal类)

    Java中的超大数BIgInteger和BigDecimal 在我们处理大位数运算的时候 我们经常用的int和long类型的数已经不能够满足我们的运算了 那么这个时候就需要用到一个超大数来运算 这个时候我们会用到java math BigI
  • javaweb项目中完成数据的增删改查操作((maven,mybaits,tomcat,servlet,jsp包含 MVC模式 和 三层架构 ))

    目录 需求 完成品牌数据的增删改查操作 1 环境准备 1 1 创建工程模块 引入坐标 1 2创建三层架构的包结构 1 3创建数据库表 tb brand 1 4 创建实体类Brand 1 5 准备mybatis环境 2 查询所有 2 1编写B
  • JS将数组相同的元素进行分类

    js实现将数组中相同元素进行分类 思路是先将数组去重 这里采用对象的方式进行去重 然后将相同的元素重新放入一个数组内 实例如下
  • struts1 logic:iterate bean:write标签使用

    只是截取项目中部分代码 供参考及日后查阅 用struts1标签html select 展现select下拉列表 刚开始为如下代码 html view plain copy
  • 搭建RP-pppoe服务器

    1 安装rp pppoe 测试环境 PPPoe Server Ubuntu 20 04 PPPoe Client Windows 11 首先 我们先安装PPPoe服务器 我们需要下载rp pppoe的源码 然后自行编译安装 在安装之前需要安
  • OS银行家算法-Java

    OS作业 记录防丢 package Bank public class Banker public static void main String args OS os new OS 3 3 2 MyThread p0 new MyThre