-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScheduler.java
83 lines (70 loc) · 2.3 KB
/
Scheduler.java
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
package cpu_scheduler;
import java.util.*;
// Source code
public class Scheduler {
int timer;
ArrayList<Process> listOfProcesses;
ArrayList<Process> readyQueue;
ArrayList<Process> endProcesses;
int timeQuantum;
int contextSwitch; // small number (less than half the timeQuantum).. ex:
// 0.1 * timeQuantum
Process cpu;
int counter;
public Scheduler(ArrayList<Process> listOfProcesses, int timeQuantum) {
this.timeQuantum = timeQuantum;
this.listOfProcesses = listOfProcesses;
}
public void rr() {
timer = 0;
contextSwitch = 0;
cpu = null;
readyQueue = new ArrayList<>();
endProcesses = new ArrayList<>();
while (!readyQueue.isEmpty() || !listOfProcesses.isEmpty() || cpu != null) {
// add to readyQueue
for (int i = 0; i < listOfProcesses.size(); i++) {
if (listOfProcesses.get(i).arrivalTime == timer) {
readyQueue.add(listOfProcesses.remove(i));
}
}
// add to cpu
if (cpu == null) {
cpu = readyQueue.remove(0);
}
counter++;
cpu.serviceTime++;
if (cpu.burstTime == cpu.serviceTime) { // done
cpu.completionTime = timer; // completion time is set
endProcesses.add(cpu);
cpu = null;
contextSwitch++;
counter = 0;
} else if (counter == timeQuantum) { // exceeds timeQuantum
readyQueue.add(cpu);
cpu = null;
contextSwitch++;
counter = 0;
}
timer++; // real time
}
double sumTurnAroundTime = 0.0;
double sumWaitingTime = 0.0;
double sumUtil = 0.0;
for (int i = 0; i < endProcesses.size(); i++) {
sumTurnAroundTime += endProcesses.get(i).completionTime - endProcesses.get(i).arrivalTime;
sumWaitingTime += (endProcesses.get(i).completionTime - endProcesses.get(i).arrivalTime)
- endProcesses.get(i).burstTime;
sumUtil += endProcesses.get(i).burstTime;
}
double avgTurnAroundTime = sumTurnAroundTime / endProcesses.size();
double avgWaitingTime = sumWaitingTime / endProcesses.size();
double cpuUtilization = (sumUtil - (contextSwitch * .01)) / timer;
double throughput = (double) endProcesses.size() / timer;
System.out.println("");
System.out.println("CPU Utilization: " + cpuUtilization);
System.out.println("Throughput: " + throughput);
System.out.println("Average Waiting Time: " + avgWaitingTime);
System.out.println("Average Turnaround Time: " + avgTurnAroundTime);
}
}