应操作系统老师的要求:下节课我们来一起讨论一下银行家算法的实现,银行家算法的优化,银行家算法在各个领域的具体实现方式和优化;上来讲的人,我会在他期末考试成绩上直接加5分。
这些可爽了我,虽然我已经可以加5分,但是争取吧,所以也些了个模拟银行家算法,但是...可惜,可惜...没上去讲,又不甘心自己就这样白写了,所以贴出来大家一起看看:
package com.littleworks.bankerAlgorithm;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Banker {
List<Borrower> safeSequence = new ArrayList<Borrower>();
List<Resource> resources = new ArrayList<Resource>();
List<Borrower> borrowers = new ArrayList<Borrower>();
/**
* Constructor
*/
Banker() {
init();
}
/**
* @param args
*/
public static void main(String[] args) {
Banker banker = new Banker();
banker.think();
}
/**
* 初始化
* 在这里添加借贷者和资源,可以手动在这里修改借贷者里的各个属性,可以设置allocation
*/
private void init() {
Resource resource1 = new Resource("resource1", 3);
this.addResource(resource1);
Resource resource2 = new Resource("resource2", 2);
this.addResource(resource2);
Borrower borrower1 = new Borrower("borrower1");
this.addBorrower(borrower1);
Borrower borrower2 = new Borrower("borrower2");
this.addBorrower(borrower2);
}
/**
* 往银行里增加资源的种类
*
* @param resource
*/
public void addResource(Resource resource) {
this.resources.add(resource);
Borrower b = null;
for (int i = 0; i < this.borrowers.size(); i++) {
b = borrowers.get(i);
b.need.put(resource, 0);
b.allocation.put(resource, 0);
b.max.put(resource, 0);
b.request.put(resource, 0);
}
}
/**
* 往银行里增加借贷者的人数
*
* @param borrower
*/
public void addBorrower(Borrower borrower) {
int j = 0;
for (int i = 0; i < resources.size(); i++) {
j = 0;
InputStreamReader isr = new InputStreamReader(System.in);
System.out.println("请输入借贷者" + borrower.name + "对资源"
+ resources.get(i).getName() + "请求的数量:");
try {
j = isr.read() - 48;
} catch (IOException e) {
e.printStackTrace();
}
borrower.need.put(resources.get(i), j);
borrower.max.put(resources.get(i), j);
borrower.allocation.put(resources.get(i), 0);
borrower.request.put(resources.get(i), j);
}
this.borrowers.add(borrower);
}
/**
* 银行家算法
*/
public void think() {
for (Borrower borrower : borrowers) {
for (Resource resource : resources) {
// 1. 如果request向量比need还大,则意味着出错:进程请求的资源多余它自身的需求量
if (borrower.request.get(resource) > borrower.need
.get(resource)) {
System.out.println("好你小子,吃着碗里的看着锅里的是吧......看我不灭了你");
this.deleteBorrowerByName(borrower.name);
}
// 2. 如果request向量比系统目前有的资源量多,则不能满足,让你先等待
else if (borrower.request.get(resource) > resource
.getAvailable()) {
System.out.println(borrower.name
+ ",你先等一等,目前你的资源不能全部满足,我看看怎么分配比较好...");
}
}
}
List<Resource> work = new ArrayList<Resource>();
for (Resource r : resources) {
work.add(r);
}
List<Borrower> finish = new ArrayList<Borrower>();
for (Borrower b : borrowers) {
finish.add(b);
}
while (true) {
boolean isOver = true;
Resource resource = null;
Borrower borrower = null;
boolean has = true;
out: for (int i = 0; i < finish.size(); i++) {
borrower = finish.get(i);
if (!borrower.status) {
for (int j = 0; j < work.size(); j++) {
resource = work.get(j);
if (finish.get(i).need.get(resource) > resource
.getAvailable()) {
has = false;
break;
}
}
if (has) {
break out;
}
}
}
if (has && safeSequence.size() != finish.size()) {
resource.setAvailable(resource.getAvailable()
+ borrower.allocation.get(resource));
borrower.status = true;
safeSequence.add(borrower);
System.out.println(borrower.name);
continue;
} else {
for (Borrower b : safeSequence) {
if (!b.status) {
isOver = false;
break;
}
}
if (isOver && safeSequence.size() != 0) {
System.out.println("此状态安全!");
} else
System.out.println("此状态不安全!");
break;
}
}
}
/**
* 根据名字从借贷者链表中删掉
*
* @param name
*/
public void deleteBorrowerByName(String name) {
int position = 0;
for (; position < borrowers.size(); position++) {
if (borrowers.get(position).name.equals(name)) {
break;
}
}
borrowers.remove(position);
}
}
class Borrower {
// 借贷者的名字
String name;
// 改借贷者当前是否完成任务, true为完成
boolean status = false;
// 当前还需要各种资源的数量
Map<Resource, Integer> need = new HashMap<Resource, Integer>();
// 对资源的最大请求量
Map<Resource, Integer> max = new HashMap<Resource, Integer>();
// 已经被分配的各资源量
Map<Resource, Integer> allocation = new HashMap<Resource, Integer>();
// 当前对银行请求的量
Map<Resource, Integer> request = new HashMap<Resource, Integer>();
Borrower(String name) {
this.name = name;
}
}
class Resource {
// 资源的名字
private String name;
// 该资源可用量
private int available;
Resource(String name, int available) {
this.available = available;
this.name = name;
}
public int getAvailable() {
return available;
}
public void setAvailable(int available) {
this.available = available;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这个还是有点问题的,因为我把借贷者的allocation都最开始就设置为了0,所以如果有安全序列,则安全序列输出的顺序一定是你往借贷者链表中加入的顺序,不过这完全可以改,在init方法中你可以自己手动设置各个借贷者的已分配的资源数量allocation
还有一个就是,也是由于初始化为0的缘故,就是条件1是永远都到不了的,也就是说:好你小子,吃着碗里的看着锅里的是吧......看我不灭了你,这句话永远不会输出,因为添加借贷者时,need和reuest都是被初始化为了同一个值,但是也是可以修改的,在init方法中你可以自己手动设置各个借贷者的request或者need
就写这些了,谢谢大家耐心的看!
分享到:
相关推荐
用java实现银行家调度算法,避免进程死锁!
《Java实现银行家算法详解》 银行家算法是一种经典的避免死锁的策略,它通过预分配资源和安全性检查来防止系统进入不安全状态。在Java中实现银行家算法,主要涉及线程同步、随机资源分配以及安全性判断等关键步骤。...
Java实现银行家算法(GUI界面)A+报告 银行家算法是操作系统中避免死锁的一种经典算法,由Dijkstra提出。该算法可以有效地避免操作系统中出现死锁的问题。本文将详细介绍如何使用银行家算法来处理操作系统给进程分配...
银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于java实现银行家算法的源码资料.zip银行家算法基于...
下面我们将通过 Java 语言来实现银行家算法,并使用 Swing 库来设计一个友好的图形用户界面。 银行家算法简介 银行家算法是一种避免死锁和饥饿的算法,它通过对系统中的资源进行分配,以避免系统中的进程产生死锁...
标签包括 Java 和 银行家算法,表示本文的主要内容是使用 Java 语言实现银行家算法。 四、知识点解释 4.1 银行家算法的基本概念 银行家算法是操作系统中的一种避免死锁的方法,它可以判断是否存在安全状态,从而...
通过这个Java实现,学习者不仅可以了解银行家算法的基本原理,还可以深入理解如何将算法转化为实际代码,并结合图形界面增强用户体验。这不仅对于学习操作系统和并发编程有所帮助,也是提升软件工程实践能力的良好...
### 银行家算法Java实现详解 #### 一、银行家算法简介 银行家算法是一种避免死锁的策略,由Edsger Dijkstra提出。该算法主要用于操作系统中管理资源分配,通过模拟银行家对客户的贷款行为来预防系统陷入死锁状态。...
"使用Java实现银行家算法" 银行家算法是操作系统中的一种资源分配算法,用于避免死锁和饥饿现象。该算法的主要思想是,系统中有多个资源和进程,进程需要请求资源来执行任务,系统需要确保资源的分配是安全的,即...
《银行家算法Java实现带UI界面详解》 银行家算法,由荷兰计算机科学家艾兹格·迪科斯彻提出,是一种预防死锁的策略,它主要用于操作系统中资源的分配,以确保系统的安全性。该算法的核心在于预先分配一部分资源,...
银行家算法:分别应用Java和Python实现银行家算法; 银行家算法:分别应用Java和Python实现银行家算法; 银行家算法:分别应用Java和Python实现银行家算法; 银行家算法:分别应用Java和Python实现银行家算法; 银行...
【银行家算法】是Dijkstra提出的一种用于避免操作系统中死锁的策略。...Java实现的银行家算法图形界面可以直观地展示资源分配过程,帮助用户理解死锁的预防策略,并提供了一个实验平台来模拟和分析系统资源分配的情况。
Java银行家算法是一种经典的资源分配和死锁预防算法,它源于操作系统领域,主要用于解决多进程环境中的资源竞争问题。在银行家算法中,系统被模拟为一个银行,进程是银行的客户,而资源则被视为银行的存款。这个算法...
本实验分为五个小实验,实验一的目的是模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。实验二的目的是理解在不同的存储管理方式下应怎样进行存储空间...实验五的目的是了解死锁的避免,掌握银行家算法。
在JAVA图形化界面中实现银行家算法,通常包括以下几个关键部分: 1. **数据结构**:定义资源和进程的数据结构,如进程、资源类,用于存储每个进程的资源需求、已分配资源和最大需求,以及系统的总资源数量。 2. **...
在这个JAVA16编写的程序中,我们看到一个银行家算法的实现,具有图形化用户界面(GUI),使得用户可以直观地理解该算法的工作原理。 1. **银行家算法**:这是解决资源分配问题的一种预防策略。它假设系统有一个可...
《银行家算法在操作系统中的应用——Java实现及图形界面》 银行家算法是操作系统中用于避免死锁的一种著名策略,由艾兹格·迪杰斯特拉在1965年提出。它主要用于解决资源分配问题,确保系统的安全性,防止因不当的...