-
Notifications
You must be signed in to change notification settings - Fork 0
/
bankers.js
118 lines (108 loc) · 3.38 KB
/
bankers.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
let allocation = [];
let max = [];
let available = [];
let need = [];
let numProcesses = 0;
let numResources = 0;
function createTable() {
// Get the number of processes and resources
numProcesses = document.getElementById("numProcesses").value;
numResources = document.getElementById("numResources").value;
// Create the table header
let tableHeader = "<br><tr><th>Process</th>";
for (let i = 0; i < numResources; i++) {
tableHeader += "<th>Resource " + i + "</th>";
}
tableHeader += "</tr>";
// Create the table rows for allocation, max, and need
let tableRows = "";
for (let i = 0; i < numProcesses; i++) {
// Create the row for allocation
let rowAllocation = "<tr><td>Process " + i + " (Allocation)</td>";
for (let j = 0; j < numResources; j++) {
rowAllocation += "<td><input type='number' id='allocation-" + i + "-" + j + "'></td>";
}
rowAllocation += "</tr>";
tableRows += rowAllocation;
// Create the row for max
let rowMax = "<tr><td>Process " + i + " (Max Need)</td>";
for (let j = 0; j < numResources; j++) {
rowMax += "<td><input type='number' id='max-" + i + "-" + j + "'></td>";
}
rowMax += "</tr>";
tableRows += rowMax;
}
// Create the table rows for available
let rowAvailable = "<tr><td>Available</td>";
for (let i = 0; i < numResources; i++) {
rowAvailable += "<td><input type='number' id='available-" + i + "'></td>";
}
rowAvailable += "</tr>";
tableRows += rowAvailable;
// Create the table
let table = "<table>" + tableHeader + tableRows + "</table>";
document.getElementById("table").innerHTML = table;
document.getElementById("table").style.justifyContent = "center";
document.getElementById("table").style.alignContent = "center";
document.getElementById("table").style.display = "flex";
}
function calculate() {
// Initialize the arrays
allocation = [];
max = [];
available = [];
need = [];
for (let i = 0; i < numProcesses; i++) {
allocation.push([]);
max.push([]);
need.push([]);
for (let j = 0; j < numResources; j++) {
allocation[i].push(parseInt(document.getElementById("allocation-" + i + "-" + j).value));
max[i].push(parseInt(document.getElementById("max-" + i + "-" + j).value));
need[i].push(max[i][j] - allocation[i][j]);
}
}
for (let i = 0; i < numResources; i++) {
available.push(parseInt(document.getElementById("available-" + i).value));
}
// Run the Banker's Algorithm
let work = available.slice();
let finish = [];
for (let i = 0; i < numProcesses; i++) {
finish.push(false);
}
let safeSequence = [];
let numFinished = 0;
while (numFinished < numProcesses) {
let found = false;
for (let i = 0; i < numProcesses; i++) {
if (!finish[i] && checkNeedLessOrEqualWork(i, work)) {
for (let j = 0; j < numResources; j++) {
work[j] += allocation[i][j];
}
finish[i] = true;
safeSequence.push(i);
numFinished++;
found = true;
break;
}
}
if (!found) {
break;
}
}
// Display the result
if (numFinished == numProcesses) {
document.getElementById("result").innerHTML = "Safe sequence: " + safeSequence;
} else {
document.getElementById("result").innerHTML = "Deadlock detected";
}
}
function checkNeedLessOrEqualWork(process, work) {
for (let i = 0; i < numResources; i++) {
if (need[process][i] > work[i]) {
return false;
}
}
return true;
}