import
java.util.Arrays;
import
java.util.LinkedList;
import
java.util.Queue;
class
GFG {
public
static
void
checkForNewArrivals(Process[] processes,
int
n,
int
currentTime,
Queue<Integer> readyQueue)
{
for
(
int
i =
0
; i < n; i++) {
Process p = processes[i];
if
(p.arrivalTime <= currentTime && !p.inQueue
&& !p.isComplete) {
processes[i].inQueue =
true
;
readyQueue.add(i);
}
}
}
public
static
void
updateQueue(Process[] processes,
int
n,
int
quantum,
Queue<Integer> readyQueue,
int
currentTime,
int
programsExecuted)
{
int
i = readyQueue.remove();
if
(processes[i].burstTimeRemaining <= quantum) {
processes[i].isComplete =
true
;
currentTime += processes[i].burstTimeRemaining;
processes[i].completionTime = currentTime;
processes[i].waitingTime
= processes[i].completionTime
- processes[i].arrivalTime
- processes[i].burstTime;
processes[i].turnaroundTime
= processes[i].waitingTime
+ processes[i].burstTime;
if
(processes[i].waitingTime <
0
)
processes[i].waitingTime =
0
;
processes[i].burstTimeRemaining =
0
;
if
(programsExecuted != n) {
checkForNewArrivals(
processes, n, currentTime, readyQueue);
}
}
else
{
processes[i].burstTimeRemaining -= quantum;
currentTime += quantum;
if
(programsExecuted != n) {
checkForNewArrivals(
processes, n, currentTime, readyQueue);
}
readyQueue.add(i);
}
}
public
static
void
output(Process[] processes,
int
n)
{
double
avgWaitingTime =
0
;
double
avgTurntaroundTime =
0
;
Arrays.sort(processes, (Process p1, Process p2) -> {
return
p1.pid - p2.pid;
});
for
(
int
i =
0
; i < n; i++) {
System.out.println(
"Process "
+ processes[i].pid
+
": Waiting Time: "
+ processes[i].waitingTime
+
" Turnaround Time: "
+ processes[i].turnaroundTime);
avgWaitingTime += processes[i].waitingTime;
avgTurntaroundTime
+= processes[i].turnaroundTime;
}
System.out.println(
"Average Waiting Time: "
+ avgWaitingTime / n);
System.out.println(
"Average Turnaround Time: "
+ avgTurntaroundTime / n);
}
public
static
void
roundRobin(Process[] processes,
int
n,
int
quantum)
{
Queue<Integer> readyQueue
=
new
LinkedList<Integer>();
readyQueue.add(
0
);
processes[
0
].inQueue =
true
;
int
currentTime
=
0
;
int
programsExecuted
=
0
;
while
(!readyQueue.isEmpty()) {
updateQueue(processes, n, quantum, readyQueue,
currentTime, programsExecuted);
}
}
public
static
class
Process {
int
pid;
int
arrivalTime;
int
burstTime;
int
burstTimeRemaining;
int
completionTime;
int
turnaroundTime;
int
waitingTime;
boolean
isComplete;
boolean
inQueue;
}
public
static
void
main(String[] args)
{
int
n, quantum;
System.out.println(
"Enter the number of processes: "
);
n = Integer.parseInt(System.console().readLine());
System.out.println(
"Enter time quantum: "
);
quantum
= Integer.parseInt(System.console().readLine());
Process[] processes =
new
Process[n +
1
];
for
(
int
i =
0
; i < n; i++) {
System.out.println(
"Enter arrival time and burst time of each process "
+ (i +
1
) +
": "
);
processes[i].arrivalTime = Integer.parseInt(
System.console().readLine());
processes[i].burstTime = Integer.parseInt(
System.console().readLine());
processes[i].burstTimeRemaining
= processes[i].burstTime;
processes[i].pid = i +
1
;
System.out.println();
}
Arrays.sort(processes, (Process p1, Process p2) -> {
return
p1.arrivalTime - p2.arrivalTime;
});
roundRobin(processes, n, quantum);
output(processes, n);
}
}