银行家算法和安全性检查
一、实验目的
- 实现银行家算法模拟
- 理解死锁避免的概念和死锁的解决措施
二、实验软硬件环境
- Windows或Linux平台
三、实验内容及要求
实验内容:
假设某银行有可借免息工程资助款项共10亿,现有三个工程队分别名为A队、B队、C队。每个工程队各要完成一个需5亿金额的项目,各队皆无分文,需从银行借款以完成各自的项目。各队每次从银行借部分款项以完成项目的一部分,多次借款借足所需5亿后,其项目即可顺利完工,然后再向银行归还所借5亿款项。请用银行家算法来实现上述过程,每个工程队由一线程来模拟,各队每次借款金额由一随机数来产生。
实验报告:要求纸质版的实验报告和实验结果。给出代码、流程图和代码解释,给出运行结果。
流程图:银行家算法
参考:安全性检查算法
因为这个实验要求很简单,资源就只有一类,所以无论是申请资源还是安全性检测都非常轻松,毕竟只用处理一类资源,直接上代码。
使用Java实现
- worker类(工程队实体类)
存在的意义就是生成每次要借多少钱然后向bank类申请借钱,借完钱就睡觉(工作)。total是用来自增生成id的。need是存储还需要多少资金。
唯一需要注意的就是因为申请的钱是用Math.random生成的随机数,所以申请借的钱可能会比需要的还大,这是就让申请的钱 = need再向bank申请就好了。
public class worker implements Runnable {
private static int total = 0;
private bank bank;
private int id;
private float need = 5;
public worker(bank bank) {
this.bank = bank;
this.id = total++;
}
@Override
public void run() {
while(need != 0) {
float money = (float) Math.random() * 5;
if (money > need) {
money = need;
}
try {
if (bank.request(money, id) == 1) {
need -= money;
}
Thread.sleep((int) money * 1000);
} catch (Exception e) {
e.printStackTrace();
}
}
bank.back(id);
}
}
- bank类(银行)
注释的挺清楚了,安全检测写成了一个方法isSafe。思路完全是参照上面的流程图😪
public class bank {
public float Available = 10; //可借资金
public float[] Max = {5, 5, 5}; // 三个队伍需要的最大资金
public float[] Allocation= {0, 0, 0}; //三个队伍已经借去对资金
public float[] Need = {5, 5, 5}; //三个队伍还需对资金
//申请借钱
public synchronized int request(float want, int id) throws Exception{
if(want <= Need[id]){ //申请的金额大于原本需要的金额
if(want <= Available){ //申请的资金大于银行剩余的资金
Available -= want;
Need[id] -= want;
Allocation[id] += want;
if(!isSafe()){ //安全检测
Available += want;
Need[id] += want;
Allocation[id] -= want;
System.out.println(id + " 队的申请被驳回");
}
}else {
System.out.println(id + " 队的申请被驳回");
return 0;
}
System.out.println(id + " 队借走" + want + " 亿");
return 1;
}else {
System.out.println(id + " 队的申请被驳回");
return 0;
}
}
//还钱
public void back (int id){
Available += 5;
System.out.println(id + " 队归还5 亿");
}
public boolean isSafe(){ //安全检测
float Work = Available;
int flag = 0;
boolean[] finish = new boolean[3];
while(flag != 3){
flag = 0;
for(int i = 0; i < 3; i++){
if (!finish[i] && Need[i] <= Work){
Work += Allocation[i];
finish[i] = true;
}else {
++flag;
}
}
if(flag == 0){
return true;
}
}
return false;
}
}
希望对大家有帮助