-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRoundRobinScheduling.java
More file actions
156 lines (132 loc) · 4.97 KB
/
Copy pathRoundRobinScheduling.java
File metadata and controls
156 lines (132 loc) · 4.97 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
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package algorithms;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class RoundRobinScheduling {
public void schedule(Process[] processes, int quantum) {
// Create a copy of the processes to avoid modifying the original array
Process[] processesCopy = new Process[processes.length];
for (int i = 0; i < processes.length; i++) {
processesCopy[i] = new Process(processes[i].id,
processes[i].burstTime, processes[i].priority,
processes[i].arrivalTime);
}
// Sort processes by arrival time
Arrays.sort(processesCopy, (a, b) -> a.arrivalTime - b.arrivalTime);
// Initialize variables
int currentTime = 0;
int[] remainingBurstTime = new int[processesCopy.length];
boolean[] completed = new boolean[processesCopy.length];
int completedCount = 0;
// Initialize remaining burst time
for (int i = 0; i < processesCopy.length; i++) {
remainingBurstTime[i] = processesCopy[i].burstTime;
}
// Initialize data structures for Gantt chart
ArrayList<Integer> executionOrder = new ArrayList<>();
ArrayList<Integer> executionTimes = new ArrayList<>();
executionTimes.add(0); // Start time
// Initialize queue for ready processes
Queue<Integer> readyQueue = new LinkedList<>();
// Add initially arrived processes to ready queue
for (int i = 0; i < processesCopy.length; i++) {
if (processesCopy[i].arrivalTime == 0) {
readyQueue.add(i);
}
}
while (completedCount < processesCopy.length) {
// If ready queue is empty, find the next arriving process
if (readyQueue.isEmpty()) {
int nextArrival = Integer.MAX_VALUE;
int nextProcess = -1;
for (int i = 0; i < processesCopy.length; i++) {
if (!completed[i]
&& processesCopy[i].arrivalTime > currentTime
&& processesCopy[i].arrivalTime < nextArrival) {
nextArrival = processesCopy[i].arrivalTime;
nextProcess = i;
}
}
if (nextProcess != -1) {
currentTime = nextArrival;
readyQueue.add(nextProcess);
} else {
// This should not happen with valid input
break;
}
}
// Get the next process from ready queue
int currentProcess = readyQueue.poll();
// If this is the first time the process executes, set its start
// time
if (remainingBurstTime[currentProcess] == processesCopy[currentProcess].burstTime) {
processesCopy[currentProcess].startTime = currentTime;
}
// Calculate execution time for this quantum
int executeTime = Math.min(remainingBurstTime[currentProcess],
quantum);
// Update Gantt chart data
executionOrder.add(processesCopy[currentProcess].id);
currentTime += executeTime;
executionTimes.add(currentTime);
// Reduce remaining burst time
remainingBurstTime[currentProcess] -= executeTime;
// Check for new arrivals during this time quantum
for (int i = 0; i < processesCopy.length; i++) {
if (!completed[i] && !readyQueue.contains(i)
&& i != currentProcess
&& processesCopy[i].arrivalTime <= currentTime
&& processesCopy[i].arrivalTime > currentTime
- executeTime) {
readyQueue.add(i);
}
}
// Check if process is completed
if (remainingBurstTime[currentProcess] == 0) {
completed[currentProcess] = true;
completedCount++;
// Update process metrics
processesCopy[currentProcess].completionTime = currentTime;
processesCopy[currentProcess].turnAroundTime = processesCopy[currentProcess].completionTime
- processesCopy[currentProcess].arrivalTime;
processesCopy[currentProcess].waitingTime = processesCopy[currentProcess].turnAroundTime
- processesCopy[currentProcess].burstTime;
} else {
// Process still has remaining time, add back to ready queue
readyQueue.add(currentProcess);
}
}
// Store Gantt chart data in the first process for access
if (processes.length > 0) {
processes[0].ganttData = executionOrder;
processes[0].ganttTimes = executionTimes;
}
// Update the original process array with computed values
for (Process process : processesCopy) {
for (Process originalProcess : processes) {
if (originalProcess.id == process.id) {
originalProcess.startTime = process.startTime;
originalProcess.completionTime = process.completionTime;
originalProcess.turnAroundTime = process.turnAroundTime;
originalProcess.waitingTime = process.waitingTime;
break;
}
}
}
}
public double getAverageWaitingTime(Process[] processes) {
double totalWaitingTime = 0;
for (Process process : processes) {
totalWaitingTime += process.waitingTime;
}
return totalWaitingTime / processes.length;
}
public double getAverageTurnaroundTime(Process[] processes) {
double totalTurnaroundTime = 0;
for (Process process : processes) {
totalTurnaroundTime += process.turnAroundTime;
}
return totalTurnaroundTime / processes.length;
}
}