程序仍然存在问题,仅供参考
想要练习相关实例和原理,可参考其他文章。本文章主要展示如何用可视化界面进行银行家算法
目录
一、简介
银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。 [1]
二、算法原理
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
三、代码实现
1.初始界面:
主要代码:
<h1>银行家算法</h1>
<div id="input">
请输入进程数:<input type="text" id="t_process" name="t_process"/>
<br >
请输入资源数:<input type="text" id="t_resource" name="t_resource" />
<br ><br > <br >
<input type="button" id="b_ok" value="确定" name="b_ok" onClick="onClickOK()" />
<br >
</div>
2.读取完进程数和资源数后会弹窗确认,然后输入各资源总数
主要代码如下
function onClickOK() {
num_process = parseInt(document.getElementById("t_process").value);
num_resource = parseInt(document.getElementById("t_resource").value);
alert(num_process + "个进程" + num_resource + "个资源");
for (i = 0; i < num_resource; i++) {
available[i] = window.prompt("第" + (i + 1) + "个资源总数:");
}
CreateTable();
document.getElementById("d_display").style.display = "";
}
3.输入完总资源数后会出现第一个表格需要用户填写相应数据,点击提交会出现第二个表格,同时输出安全序列
主要代码:
1'创建第一个表格
//动态创建表格(第一个表格)
function CreateTable() {
var tabletext = "";
tabletext = "</br>系统资源的总数依次是:";
for (i = 0; i < num_resource; i++) {
tabletext += " " + available[i] + " ";
}
tabletext += "<p><p/><hr/>";
tabletext += "请输入各个进程的最大需求数(Max)和已分配数(Allocation)</br>";
tabletext += "<table border='1' cellspacing='1' class='bd1''><tr><td>资源</td><td colspan=" + num_resource + ">Max</td><td colspan=" + num_resource + ">Allocation</td><td colspan=" + num_resource + ">Need</td><td colspan=" + num_resource + ">Available</td></tr>";
tabletext += "<tr>" + "<td>进程</td>";
for (i = 0; i < 4; i++) {
for (j = 0; j < num_resource; j++) {
tabletext += "<td>" + String.fromCharCode((65 + j)) + "</td>";
}
}
tabletext += "</tr>";
for (i = 0; i < num_process; i++) {
tabletext += "<tr><td>P" + i + "</td>";
for (j = 0; j < 4; j++) {
for (x = 0; x < num_resource; x++) {
tabletext += "<td class='numtd'><input type=text id=e" + i + j + x + " class= 'numtext'";
if (j == 2 || j == 3) {
tabletext += " readonly=\"readonly\" "
}
tabletext += "></td>";
}
}
tabletext +&#