java实现银行家算法 四舍五入中的一个 +=不理解 请求大神解答

与《》相关:java实现银行家算法 - CSDN博客
java实现银行家算法
南昌航空大学实验报告
课程名称:& 操作系统&&&&&& 实验名称:& _避免死锁(银行家算法)
班级:110462&&&&&&&& &姓名:XXX && 学号: &
一 实验目的
&&&&& 1.&&&
2.&能够利用银行家算法,有效避免死锁的发生,或检测死锁的存在。
二 实验内容
实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
1.&&&&&& 设计进程对各类资源最大申请表示及初值确定。
2.&&&&&& 设定系统提供资源初始状况。
3.&&&&&& 设定每次某个进程对各类资源的申请表示。
4.&&&&&& 编制程序,依据银行家算法,决定其申请是否得到满足。
三 实验分析
1.&&&& 设计程序类Bank,在其中设计两个类:Sources资源类和Processo类用于管理资源和进程的调度,
&&&&&&&&&&&&&&&&&&&&&&i.&&&&&&&&&&&&&Bank拥有一个系统字段和可分配资源字段allSources
&&&&&&&&&&&&&&&&&&&&ii.&&&&&&&&&&&&&拥有一个分配资源的方法:Assign(),将进程的资源请求进行处理
&&&&&&&&&&&&&&&&&iii.&&&&&&&&&&&&&拥有一个检查资源分配后,是否能安全运行的checkSafeQueue方法
2.&&&&在类Sources中主要设计的是三个字段,用于标志A,B,C类,这三类资源
3.&&&&在类Processor中 设计有三个字段
&&&&&&&&&&&&&&&&&&&&&&&i.&&&&&&&&&&&&&字段name属于String类,用与标记进程的名字
&&&&&&&&&&&&&&&&&&&&&ii.&&&&&&&&&&&&&字段maxSources属于Sources类,用于说明程序的最大资源占用
&&&&&&&&&&&&&&&&&&&iii.&&&&&&&&&&&&&字段allSources属于Sources类,用于说明当前程序已经分配有的内容
&&&&&&&&&&&&&&&&&&&&iv.&&&&&&&&&&&&&字段needSources属于Sources类,用于说明当前程序最多还能申请的最大资源
4.&&&&&&程序最后设计了一个test()方法,用与测试程序的状态
测试函数对参数进行了初始化,并设计了从键盘输入进行检测数据的正确性,数据请看实验结果
四 实验程序设计
package com.rainplus.
import java.util.S
public class Bank {
// private Sources sysSources = new Sources(10, 5, 7);
private Sources allSources = new Sources(3, 3, 2);// TODO
// 资源类假设一共三类资源;
class Sources {
private int A;
private int B;
private int C;
public Sources(int B, int A, int C) {
this.B = B;
this.A = A;
this.C = C;
public Sources(Sources sources) {
this.B = sources.getB();
this.A = sources.getA();
this.C = sources.getC();
public int getB() {
public void setB(int B) {
this.B = B;
public int getA() {
public void setA(int A) {
this.A = A;
public int getC() {
public void setC(int C) {
this.C = C;
// 进程类,包进程使用最大内存,当前已分配内存,和需要分配内存
class Processor {
private Sources maxS
private Sources allS
private Sources needS
public String getName() {
public void setName(String name) {
this.name =
public Sources getMaxSources() {
return maxS
public void setMaxSources(Sources maxSources) {
this.maxSources = maxS
public Sources getNeedSources() {
return needS
public void setNeedSources(Sources needSources) {
this.needSources = needS
public Sources getAllSources() {
return allS
public void setAllSources(Sources allSources) {
this.allSources = allS
// 显示当前系统和各个进程的资源使用情况
public void showdata(Processor[] processors) {
// 显示当前可用资源
System.out.print(&当前系统可分配资源为:&);
showSources(allSources);
System.out.println(&-----------------进程状态-------------&);
System.out.println(&进程号
Allocation
System.out.println(&
for (int i = 0; i & processors. i++) {
System.out.print(processors[i].getName() + &
+ processors[i].getMaxSources().getA() + & &
+ processors[i].getMaxSources().getB() + & &
+ processors[i].getMaxSources().getC() + &
System.out.print(processors[i].getAllSources().getA() + & &
+ processors[i].getAllSources().getB() + & &
+ processors[i].getAllSources().getC() + &
System.out.println(processors[i].getNeedSources().getA() + & &
+ processors[i].getNeedSources().getB() + & &
+ processors[i].getNeedSources().getC() + & &);
System.out.println(&-----------------------------------&);
// 显示资源的数据
public void showSources(Sources sources) {
System.out.println(&A:& + sources.getA() + & B:& + sources.getB()
+ & C:& + sources.getC());
public boolean assign(Processor[] processors, int requestNum, Sources req) {
Processor pro = processors[requestNum];
if (!(req.getA() &= pro.getNeedSources().getA()
&& req.getB() &= pro.getNeedSources().getB() && req.getC() &= pro
.getNeedSources().getC())) {
System.out.println(&请求的资源数超过了所需要的最大值,分配错误&);
if (!(req.getA() &= allSources.getA()
&& req.getB() &= allSources.getB() && req.getC() &= allSources
.getC())) {
System.out.println(&尚无足够资源分配,必须等待&);
// 分配资源
allSources.setA(allSources.getA() - req.getA());
allSources.setB(allSources.getB() - req.getB());
allSources.setC(allSources.getC() - req.getC());
pro.getAllSources().setA(pro.getAllSources().getA() + req.getA());
pro.getAllSources().setB(pro.getAllSources().getB() + req.getB());
pro.getAllSources().setC(pro.getAllSources().getC() + req.getC());
pro.getNeedSources().setA(pro.getNeedSources().getA() - req.getA());
pro.getNeedSources().setB(pro.getNeedSources().getB() - req.getB());
pro.getNeedSources().setC(pro.getNeedSources().getC() - req.getC());
boolean flag = checkSafeQueue(processors, allSources);// 进行安全性检查并返回是否安全
if (flag == true) {
System.out.println(&能够安全分配&);
System.out.println(&不能够安全分配&);
public boolean checkSafeQueue(Processor[] pros, Sources all) {
Sources temp = new Sources(all);
boolean assigned[] = new boolean[5];
int i = 0;
while (i & 5) {
if (!assigned[i] && temp.getA() &= pros[i].getNeedSources().getA()
&& temp.getB() &= pros[i].getNeedSources().getB()
&& temp.getC() &= pros[i].getNeedSources().getC()) {
temp.setA(temp.getA() + pros[i].getAllSources().getA());
temp.setB(temp.getB() + pros[i].getAllSources().getB());
temp.setC(temp.getC() + pros[i].getAllSources().getC());
System.out.println(&分配成功的是:& + pros[i].getName());
assigned[i] =
for (i = 0; i & 5; i++) {
if (assigned[i] == false)
public void test() {
int processNum = 5;
// 初始化进程数据
Sources[] all = new Sources[processNum];
Sources[] max = new Sources[processNum];
Sources[] need = new Sources[processNum];
int[][] allData = { { 0, 1, 0 }, { 2, 0, 0 }, { 3, 0, 2 }, { 2, 1, 1 },
{ 0, 0, 2 } };
int[][] maxData = { { 7, 5, 3 }, { 3, 2, 2 }, { 9, 0, 2 }, { 2, 2, 2 },
{ 4, 3, 3 } };
int[][] needData = { { 7, 4, 3 }, { 1, 2, 2 }, { 6, 0, 0 },
{ 0, 1, 1 }, { 4, 3, 1 } };
for (int i = 0; i & processN i++) {
all[i] = new Sources(allData[i][0], allData[i][1], allData[i][2]);
max[i] = new Sources(maxData[i][0], maxData[i][1], maxData[i][2]);
need[i] = new Sources(needData[i][0], needData[i][1],
needData[i][2]);
Processor[] processors = new Processor[processNum];
for (int i = 0; i & processors. i++) {
processors[i] = new Processor();
processors[i].setName(&P& + i);
processors[i].setMaxSources(max[i]);
processors[i].setAllSources(all[i]);
processors[i].setNeedSources(need[i]);
showdata(processors);
Scanner s = new Scanner(System.in);
int requestNum = 0;
int[] input = { 0, 0, 0 };
Sources requestSources = new Sources(0, 0, 0);
while (true)// 循环进行分配
System.out.println(&请输入要请求的进程号(0--4):&);
requestNum = s.nextInt();
System.out.println(&请输入请求的资源数目:&);
for (int i = 0; i & 3; i++) {
input[i] = s.nextInt();
requestSources.setA(input[0]);
requestSources.setB(input[1]);
requestSources.setC(input[2]);
assign(processors, requestNum, requestSources);
showdata(processors);
public static void main(String[] args) {
new Bank().test();
五 实验结果
1.& 正确安全分配:
当前系统可分配资源为:A:3B:3 C:2
-----------------进程状态-------------
进程号&&&&&
Max&&&Allocation&&&&& Need&&
&&&& AB C&&&& A B C&&&&&& A B C
P0&& 57 3&&&& 1 0 0&&&&&& 4 7 3
P1&& 23 2&&&& 0 2 0&&&&&& 2 1 2
P2&& 09 2&&&& 0 3 2&&&&&& 0 6 0
P3&& 22 2&&&& 1 2 1&&&&&& 1 0 1
P4&& 34 3&&&& 0 0 2&&&&&& 3 4 1
-----------------------------------
请输入要请求的进程号(0--4):1
请输入请求的资源数目:102
分配成功的是:P1
分配成功的是:P3
分配成功的是:P0
分配成功的是:P2
分配成功的是:P4
能够安全分配
当前系统可分配资源为:A:2B:3 C:0
-----------------进程状态-------------
进程号&&&&&
Max&&&Allocation&&&&& Need&&
&&&& AB C&&&& A B C&&&&&& A B C
P0&& 57 3&&&& 1 0 0&&&&&& 4 7 3
P1&& 23 2&&&& 1 2 2&&&&&& 1 1 0
P2&& 09 2&&&& 0 3 2&&&&&& 0 6 0
P3&& 22 2&&&& 1 2 1&&&&&& 1 0 1
P4&& 34 3&&&& 0 0 2&&&&&& 3 4 1
-----------------------------------
请输入要请求的进程号(0--4):
 2.不能安全运行:
当前系统可分配资源为:A:3B:3 C:2
-----------------进程状态-------------
进程号&&&&&
Max&&&Allocation&&&&& Need&&
&&&& AB C&&&& A B C&&&&&& A B C
P0&& 57 3&&&& 1 0 0&&&&&& 4 7 3
P1&& 23 2&&&& 0 2 0&&&&&& 2 1 2
P2&& 09 2&&&& 0 3 2&&&&&& 0 6 0
P3&& 22 2&&&& 1 2 1&&&&&& 1 0 1
P4&& 34 3&&&& 0 0 2&&&&&& 3 4 1
-----------------------------------
请输入要请求的进程号(0--4):4
请输入请求的资源数目:3 3
不能够安全分配
当前系统可分配资源为:A:0B:0 C:1
-----------------进程状态-------------
进程号&&&&&
Max&&&Allocation&&&&& Need&&
&&&& AB C&&&& A B C&&&&&& A B C
P0&& 57 3&&&& 1 0 0&&&&&& 4 7 3
P1&& 23 2&&&& 0 2 0&&&&&& 2 1 2
P2&& 09 2&&&& 0 3 2&&&&&& 0 6 0
P3&& 22 2&&&& 1 2 1&&&&&& 1 0 1
P4&& 34 3&&&& 3 3 3&&&&&& 0 1 0
-----------------------------------
请输入要请求的进程号(0--4):
六 实验体会
加深了对死锁概念的理解,能够利用银行家算法,有效避免死锁的发生,或检测死锁的存在。对进程之间的运行情况有了更加深层次的理解
本文已收录于以下专栏:
相关文章推荐
关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来。
由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统...
银行家算法问题描述
       银行家算法(Banker’s
Algorithm)是一个避免死锁(Deadlock)的著名算法,由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产...
银行家算法核心是
先寻找满足系统当前剩余的资源量(avaliable )&=进程运行所需的资源数的进程(need),再假设这个进程安全校验是成功的,当这个进程运行完毕后,释放资源后,现在系统当前剩余...
package B
import java.util.S
public class TestBanker
public static void ...
银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理...
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
import java.util.HashM
import java.util.M
import java.util.S
public class BankerArith...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
模拟银行家算法实现死锁避免毕业设计报_告.doc 36页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:200 &&
你可能关注的文档:
··········
··········
\* MERGEFORMAT 36
《操作系统》课程设计报告
系:计算机与信息工程学院
目:模拟银行家算法实现死锁避免
课题名称
指导教师
评
成绩评定姓 名成
绩学 号日期年
 TOC \o &1-3& \h \z \u 题
目:模拟银行家算法实现死锁避免 1
评分表: 2

课程设计目的 3

课程设计内容 3

课程设计环境 4

课程设计步骤 4
41.需求分析 4
4.1.1 问题的提出 4
4.1.2
银行家算法原理 4
4.1.3银行家算法详细解析 5
4.1.4
银行安全性算法目的 6
4.2概要设计 6
4.2.1
功能模块设计如下: 6
4.2.2
功能模块描述 7
4.3详细设计 7
4.3.1基本数据???构的设计 7
4.3.2算法的设计 8

课程设计结果 9
5.1运行结果 9
5.2测试分析 12

课程设计心得与体会 12
总结 12

参考文献 13

程序清单 14
8.1
操作主界面代码: 14
8.2 功能实现代码: 17

课程设计目的
在熟练掌握死锁发生原理和解决死锁问题的基础上,利用一种程序设计语言模拟实现利用银行家算法实现死锁避免,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。

课程设计内容
模拟实现银行家算法对系统资源进行分配,以防止死锁的出现。本课题肯定不可能实现对实际操作系统的资源管理,而是通过对模拟资源数据的处理,检测银行家算法在防止死锁出现的作用。
银行家算法描述:
第一部分:银行家算法(扫描)
1.如果Request&=Need,则转向2;否则,出错
2.如果Request&=Available,则转向3,否则等待
3.系统试探分配请求的资源给进程
4.系统执行安全性算法
第二部分:安全性算法
1.设置两个向量
(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False
2.若Finish[i]=False&&Need&=Work,则执行3;否则执行4(i为资源类别)
3.进程P获得第i类资源,则顺利执行直至完成,并释放资源:
Work=Work+A
Finish[i]=
转2
请充分理解以上银行家算法描述的核心思想。(详细银行家算法描述见p95)
课程设计环境
Windows操作系统
eclipse编程工具

课程设计步骤
41.需求分析
4.1.1 问题的提出
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系银行家算法统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
银行家算法原理
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定: (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
  操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
4.1.3银行家算法详细解析
1、安全性算法:确定计算机系统是否处于安全状态的算法分为如下几步:
(1)设置两个工作向量
正在加载中,请稍后...&>&java实现银行家算法操作系统
java实现银行家算法操作系统
上传大小:6KB
java实现银行家算法
1、给出系统可用资源向量(例如:系统可用资源=(5,3,8,2,10))。
2、若干进程最大需求矩阵如下表所示:
3、采用时间片轮转法调度进程。
4、进程执行时提出资源请求(可利用随机数给出或从键盘输入)。
5、判断资源是否可以安全分配,要求进程每提出一个资源请求,都要进行安全
综合评分:4.5(8位用户评分)
所需积分/C币:
下载个数:75
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有4条
有点错误 正在看是因为什么报错的
简单易懂,最好有注释,很多地方我看了很久都不懂,但是很好运行
简单易懂,但是数据如果是外部输入就更好了,最好有注释,很多地方我看了很久都不懂
是我需要的
很有用,不过也助长了我偷懒我的心理。。。检讨~
审核通过送C币
Windows组件集
创建者:mfkbbdx1
国外著名软件专用注册机系列 2017
创建者:mfkbbdx1
windriver workbench3.0 for ppc
创建者:longfei_3
上传者其他资源上传者专辑
操作系统-内存管理 java实现代码
matlab实现SOR法
java设计模式
操作系统热门标签
VIP会员动态
下载频道积分规则调整V1710.18
CSDN下载频道积分调整公告V1710.17
开通VIP,海量IT资源任性下载
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&VIP年卡&4000万程序员的必选
为了良好体验,不建议使用迅雷下载
java实现银行家算法操作系统
会员到期时间:
剩余下载个数:
剩余C币:593
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
全站600个资源免积分下载
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
全站600个资源免积分下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
全站600个资源免积分下载
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
nayangxingfu
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
java实现银行家算法操作系统}

我要回帖

更多关于 银行家算法例题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信