-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathShortestRemainingTime.java
More file actions
67 lines (57 loc) · 3.1 KB
/
ShortestRemainingTime.java
File metadata and controls
67 lines (57 loc) · 3.1 KB
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
import java.util.*;
public class ShortestRemainingTime {
public static List<String> schedule(List<Process> processes) {
// Sort processes by arrival time initially
processes.sort(Comparator.comparingInt(p -> p.arrivalTime));
PriorityQueue<Process> queue = new PriorityQueue<>(
Comparator.comparingInt((Process p) -> p.SRTremainingTime) // Compare by remaining time
.thenComparingInt(p -> p.arrivalTime) // If same, compare by arrival time
);
int currentTime = processes.get(0).arrivalTime; // Start with the earliest arrival time
List<String> ganttChart = new ArrayList<>();
int index = 0;
Process currentProcess = null;
int startTime = currentTime;
while (true) {
// Add processes that have arrived by the current time
while (index < processes.size() && processes.get(index).arrivalTime <= currentTime) {
queue.add(processes.get(index));
index++;
}
// If no process is running and the queue is empty, jump to the next process arrival
if (currentProcess == null && queue.isEmpty()) {
if (index < processes.size()) {
currentTime = processes.get(index).arrivalTime;
continue; // No processes to run, jump to next arrival time
}
break; // All processes are done
}
// If there's a current process, handle potential preemption
if (currentProcess != null && currentProcess.SRTremainingTime > 0) {
// Check if there's a new process with shorter remaining time
if (!queue.isEmpty() && queue.peek().SRTremainingTime < currentProcess.SRTremainingTime) {
queue.add(currentProcess); // Preempt the current process
ganttChart.add("P" + currentProcess.id + "(" + startTime + "-" + currentTime + ")");
currentProcess = null; // Set current process to null for preemption
}
}
// If there's no current process, pick the next one from the queue
if (currentProcess == null && !queue.isEmpty()) {
currentProcess = queue.poll(); // Select process with shortest remaining time
startTime = currentTime;
}
// Run the current process for 1 time unit
currentTime++;
currentProcess.SRTremainingTime--;
// If the current process finishes, update its details and reset
if (currentProcess.SRTremainingTime == 0) {
ganttChart.add("P" + currentProcess.id + "(" + startTime + "-" + currentTime + ")");
currentProcess.finishTime = currentTime;
currentProcess.turnaroundTime = currentProcess.finishTime - currentProcess.arrivalTime;
currentProcess.waitingTime = currentProcess.turnaroundTime - currentProcess.burstTime;
currentProcess = null; // Reset after process finishes
}
}
return ganttChart;
}
}