Round Robin is a CPU scheduling algorithm where each process is assigned a fixed time slot in a cyclic way. It is basically the preemptive version of First come First Serve CPU Scheduling algorithm.
- Round Robin CPU Algorithm generally focuses on Time Sharing technique.
- The period of time for which a process or job is allowed to run in a pre-emptive method is called time quantum.
- Each process or job present in the ready queue is assigned the CPU for that time quantum, if the execution of the process is completed during that time then the process will end else the process will go back to the waiting table and wait for its next turn to complete the execution.
Characteristics of Round Robin CPU Scheduling Algorithm
- It is simple, easy to implement, and starvation-free as all processes get fair share of CPU.
- One of the most commonly used technique in CPU scheduling as a core.
- It is preemptive as processes are assigned CPU only for a fixed slice of time at most.
- The disadvantage of it is more overhead of context switching.
Advantages of Round Robin CPU Scheduling Algorithm
- There is fairness since every process gets equal share of CPU.
- The newly created process is added to end of ready queue.
- A round-robin scheduler generally employs time-sharing, giving each job a time slot or quantum.
- While performing a round-robin scheduling, a particular time quantum is allotted to different jobs.
- Each process get a chance to reschedule after a particular quantum time in this scheduling.
Disadvantages of Round Robin CPU Scheduling Algorithm
- There is Larger waiting time and Response time.
- There is Low throughput.
- There is Context Switches.
- Gantt chart seems to come too big (if quantum time is less for scheduling. For Example:1 ms for big scheduling.)
- Time consuming scheduling for small quantum.
Examples to show working of Round Robin Scheduling Algorithm
Example-1: Consider the following table of arrival time and burst time for four processes P1, P2, P3, and P4 and given Time Quantum = 2
|
P1 | 5 ms | 0 ms |
P2 | 4 ms | 1 ms |
P3 | 2 ms | 2 ms |
P4 | 1 ms | 4 ms |
The Round Robin CPU Scheduling Algorithm will work on the basis of steps as mentioned below:
At time = 0,
- The execution begins with process P1, which has burst time 5.
- Here, every process executes for 2 milliseconds (Time Quantum Period). P2 and P3 are still in the waiting queue.
|
0-2ms | P1 | 0ms | P2, P3 | P1 | 2ms | 5ms | 3ms |
At time = 2,
- The processes P2 and P3 arrives in the ready queue and P2 starts executing for TQ period
|
2-4ms | P1 | 0ms | P3, P1 | P2 | 0ms | 3ms | 3ms |
P2 | 1ms | 2ms | 4ms | 2ms |
At time = 4,
- The process P4 arrives in the ready queue,
- Then P3 executes for TQ period.
|
4-6ms | P1 | 0ms | P1, P4, P2 | P3 | 0ms | 3ms | 3ms |
P2 | 1ms | 0ms | 2ms | 2ms |
P3 | 2ms | 2ms | 2ms | 0ms |
At time = 6,
- Process P3 completes its execution
- Process P1 starts executing for TQ period as it is next in the b.
|
6-8ms | P1 | 0ms | P4, P2 | P1 | 2ms | 3ms | 1ms |
P2 | 1ms | 0ms | 2ms | 2ms |
At time = 8,
- Process P4 starts executing, it will not execute for Time Quantum period as it has burst time = 1
- Hence, it will execute for only 1ms.
|
8-9ms | P1 | 0ms | P2, P1 | P4 | 0ms | 3ms | 1ms |
P2 | 1ms | 0ms | 2ms | 2ms |
P4 | 4ms | 1ms | 1ms | 0ms |
At time = 9,
- Process P4 completes its execution
- Process P2 starts executing for TQ period as it is next in the ready queue
|
9-11ms | P1 | 0ms | P1 | P2 | 0ms | 3ms | 1ms |
P2 | 1ms | 2ms | 2ms | 0ms |
At time = 11,
- Process P2 completes its execution.
- Process P1 starts executing, it will execute for 1ms only
At time = 12,
- Process P1 completes its execution.
- The overall execution of the processes will be as shown below:
|
0-2ms | P1 | 0ms | P2, P3 | P1 | 2ms | 5ms | 3ms |
2-4ms | P1 | 0ms | P3, P1 | P2 | 0ms | 3ms | 3ms |
P2 | 1ms | 2ms | 4ms | 2ms |
4-6ms | P1 | 0ms | P1, P4, P2 | P3 | 0ms | 3ms | 3ms |
P2 | 1ms | 0ms | 2ms | 2ms |
P3 | 2ms | 2ms | 2ms | 0ms |
6-8ms | P1 | 0ms | P4, P2 | P1 | 2ms | 3ms | 1ms |
P2 | 1ms | 0ms | 2ms | 2ms |
8-9ms | P1 | 0ms | P2, P1 | P4 | 0ms | 3ms | 1ms |
P2 | 1ms | 0ms | 2ms | 2ms |
P4 | 4ms | 1ms | 1ms | 0ms |
9-11ms | P1 | 0ms | P1 | P2 | 0ms | 3ms | 1ms |
P2 | 1ms | 2ms | 2ms | 0ms |
11-12ms | P1 | 0ms | | P1 | 1ms | 1ms | 0ms |
Gantt chart will be as following below:

Gantt chart for Round Robin Scheduling Algorithm
How to compute below times in Round Robin using a program?
- Completion Time: Time at which process completes its execution.
- Turn Around Time: Time Difference between completion time and arrival time. Turn Around Time = Completion Time – Arrival Time
- Waiting Time(W.T): Time Difference between turn around time and burst time.
Waiting Time = Turn Around Time – Burst Time
Now, lets calculate average waiting time and turn around time:
|
P1 | 0 | 5 | 12 | 12-0 = 12 | 12-5 = 7 |
P2 | 1 | 4 | 11 | 11-1 = 10 | 10-4 = 6 |
P3 | 2 | 2 | 6 | 6-2 = 4 | 4-2 = 2 |
P4 | 4 | 1 | 9 | 9-4 = 5 | 5-1 = 4 |
Now,
- Average Turn around time = (12 + 10 + 4 + 5)/4 = 31/4 = 7.7
- Average waiting time = (7 + 6 + 2 + 4)/4 = 19/4 = 4.7
Example 2: Consider the following table of arrival time and burst time for three processes P1, P2 and P3 and given Time Quantum = 2
|
P1 | 10 ms | 0 ms |
P2 | 5 ms | 0 ms |
P3 | 8 ms | 0 ms |
Similarly, Gantt chart for this example:

Gantt chart for example 2
Now, lets calculate average waiting time and turn around time:
|
P1 | 0 | 10 | 23 | 23-0 = 23 | 23-10 = 13 |
P2 | 0 | 5 | 15 | 15-0 = 15 | 15-5 = 10 |
P3 | 0 | 8 | 21 | 21-0 = 21 | 21-8 = 13 |
Total Turn Around Time = 59 ms
So, Average Turn Around Time = 59/3 = 19.667 ms
And, Total Waiting Time = 36 ms
So, Average Waiting Time = 36/3 = 12.00 ms
Program for Round Robin Scheduling with arrival time as 0 for all processes
Steps to find waiting times of all processes
- Create an array rem_bt[] to keep track of remaining burst time of processes. This array is initially a copy of bt[] (burst times array)
- Create another array wt[] to store waiting times of processes. Initialize this array as 0.
- Initialize time : t = 0
- Keep traversing all the processes while they are not done. Do following for i’th process if it is not done yet.
- If rem_bt[i] > quantum
- t = t + quantum
- rem_bt[i] -= quantum;
- Else // Last cycle for this process
- t = t + rem_bt[i];
- wt[i] = t – bt[i]
- rem_bt[i] = 0; // This process is over
Once we have waiting times, we can compute turn around time tat[i] of a process as sum of waiting and burst times, i.e., wt[i] + bt[i]
Below is implementation of above steps.
C++
#include<iostream>
using namespace std;
void findWaitingTime( int processes[], int n,
int bt[], int wt[], int quantum)
{
int rem_bt[n];
for ( int i = 0 ; i < n ; i++)
rem_bt[i] = bt[i];
int t = 0;
while (1)
{
bool done = true ;
for ( int i = 0 ; i < n; i++)
{
if (rem_bt[i] > 0)
{
done = false ;
if (rem_bt[i] > quantum)
{
t += quantum;
rem_bt[i] -= quantum;
}
else
{
t = t + rem_bt[i];
wt[i] = t - bt[i];
rem_bt[i] = 0;
}
}
}
if (done == true )
break ;
}
}
void findTurnAroundTime( int processes[], int n,
int bt[], int wt[], int tat[])
{
for ( int i = 0; i < n ; i++)
tat[i] = bt[i] + wt[i];
}
void findavgTime( int processes[], int n, int bt[],
int quantum)
{
int wt[n], tat[n], total_wt = 0, total_tat = 0;
findWaitingTime(processes, n, bt, wt, quantum);
findTurnAroundTime(processes, n, bt, wt, tat);
cout << "PN\t " << " \tBT "
<< " WT " << " \tTAT\n" ;
for ( int i=0; i<n; i++)
{
total_wt = total_wt + wt[i];
total_tat = total_tat + tat[i];
cout << " " << i+1 << "\t\t" << bt[i] << "\t "
<< wt[i] << "\t\t " << tat[i] <<endl;
}
cout << "Average waiting time = "
<< ( float )total_wt / ( float )n;
cout << "\nAverage turn around time = "
<< ( float )total_tat / ( float )n;
}
int main()
{
int processes[] = { 1, 2, 3};
int n = sizeof processes / sizeof processes[0];
int burst_time[] = {10, 5, 8};
int quantum = 2;
findavgTime(processes, n, burst_time, quantum);
return 0;
}
|
Java
public class GFG
{
static void findWaitingTime( int processes[], int n,
int bt[], int wt[], int quantum)
{
int rem_bt[] = new int [n];
for ( int i = 0 ; i < n ; i++)
rem_bt[i] = bt[i];
int t = 0 ;
while ( true )
{
boolean done = true ;
for ( int i = 0 ; i < n; i++)
{
if (rem_bt[i] > 0 )
{
done = false ;
if (rem_bt[i] > quantum)
{
t += quantum;
rem_bt[i] -= quantum;
}
else
{
t = t + rem_bt[i];
wt[i] = t - bt[i];
rem_bt[i] = 0 ;
}
}
}
if (done == true )
break ;
}
}
static void findTurnAroundTime( int processes[], int n,
int bt[], int wt[], int tat[])
{
for ( int i = 0 ; i < n ; i++)
tat[i] = bt[i] + wt[i];
}
static void findavgTime( int processes[], int n, int bt[],
int quantum)
{
int wt[] = new int [n], tat[] = new int [n];
int total_wt = 0 , total_tat = 0 ;
findWaitingTime(processes, n, bt, wt, quantum);
findTurnAroundTime(processes, n, bt, wt, tat);
System.out.println( "PN " + " B " +
" WT " + " TAT" );
for ( int i= 0 ; i<n; i++)
{
total_wt = total_wt + wt[i];
total_tat = total_tat + tat[i];
System.out.println( " " + (i+ 1 ) + "\t\t" + bt[i] + "\t " +
wt[i] + "\t\t " + tat[i]);
}
System.out.println( "Average waiting time = " +
( float )total_wt / ( float )n);
System.out.println( "Average turn around time = " +
( float )total_tat / ( float )n);
}
public static void main(String[] args)
{
int processes[] = { 1 , 2 , 3 };
int n = processes.length;
int burst_time[] = { 10 , 5 , 8 };
int quantum = 2 ;
findavgTime(processes, n, burst_time, quantum);
}
}
|
Python3
def findWaitingTime(processes, n, bt,
wt, quantum):
rem_bt = [ 0 ] * n
for i in range (n):
rem_bt[i] = bt[i]
t = 0
while ( 1 ):
done = True
for i in range (n):
if (rem_bt[i] > 0 ) :
done = False
if (rem_bt[i] > quantum) :
t + = quantum
rem_bt[i] - = quantum
else :
t = t + rem_bt[i]
wt[i] = t - bt[i]
rem_bt[i] = 0
if (done = = True ):
break
def findTurnAroundTime(processes, n, bt, wt, tat):
for i in range (n):
tat[i] = bt[i] + wt[i]
def findavgTime(processes, n, bt, quantum):
wt = [ 0 ] * n
tat = [ 0 ] * n
findWaitingTime(processes, n, bt,
wt, quantum)
findTurnAroundTime(processes, n, bt,
wt, tat)
print ( "Processes Burst Time Waiting" ,
"Time Turn-Around Time" )
total_wt = 0
total_tat = 0
for i in range (n):
total_wt = total_wt + wt[i]
total_tat = total_tat + tat[i]
print ( " " , i + 1 , "\t\t" , bt[i],
"\t\t" , wt[i], "\t\t" , tat[i])
print ( "\nAverage waiting time = %.5f " % (total_wt / n) )
print ( "Average turn around time = %.5f " % (total_tat / n))
if __name__ = = "__main__" :
proc = [ 1 , 2 , 3 ]
n = 3
burst_time = [ 10 , 5 , 8 ]
quantum = 2 ;
findavgTime(proc, n, burst_time, quantum)
|
C#
using System;
public class GFG {
static void findWaitingTime( int []processes,
int n, int []bt, int []wt, int quantum)
{
int []rem_bt = new int [n];
for ( int i = 0 ; i < n ; i++)
rem_bt[i] = bt[i];
int t = 0;
while ( true )
{
bool done = true ;
for ( int i = 0 ; i < n; i++)
{
if (rem_bt[i] > 0)
{
done = false ;
if (rem_bt[i] > quantum)
{
t += quantum;
rem_bt[i] -= quantum;
}
else
{
t = t + rem_bt[i];
wt[i] = t - bt[i];
rem_bt[i] = 0;
}
}
}
if (done == true )
break ;
}
}
static void findTurnAroundTime( int []processes,
int n, int []bt, int []wt, int []tat)
{
for ( int i = 0; i < n ; i++)
tat[i] = bt[i] + wt[i];
}
static void findavgTime( int []processes, int n,
int []bt, int quantum)
{
int []wt = new int [n];
int []tat = new int [n];
int total_wt = 0, total_tat = 0;
findWaitingTime(processes, n, bt, wt, quantum);
findTurnAroundTime(processes, n, bt, wt, tat);
Console.WriteLine( "Processes " + " Burst time " +
" Waiting time " + " Turn around time" );
for ( int i = 0; i < n; i++)
{
total_wt = total_wt + wt[i];
total_tat = total_tat + tat[i];
Console.WriteLine( " " + (i+1) + "\t\t" + bt[i]
+ "\t " + wt[i] + "\t\t " + tat[i]);
}
Console.WriteLine( "Average waiting time = " +
( float )total_wt / ( float )n);
Console.Write( "Average turn around time = " +
( float )total_tat / ( float )n);
}
public static void Main()
{
int []processes = { 1, 2, 3};
int n = processes.Length;
int []burst_time = {10, 5, 8};
int quantum = 2;
findavgTime(processes, n, burst_time, quantum);
}
}
|
Javascript
<script>
const findWaitingTime = (processes, n, bt, wt, quantum) => {
let rem_bt = new Array(n).fill(0);
for (let i = 0; i < n; i++)
rem_bt[i] = bt[i];
let t = 0;
while (1) {
let done = true ;
for (let i = 0; i < n; i++) {
if (rem_bt[i] > 0) {
done = false ;
if (rem_bt[i] > quantum) {
t += quantum;
rem_bt[i] -= quantum;
}
else {
t = t + rem_bt[i];
wt[i] = t - bt[i];
rem_bt[i] = 0;
}
}
}
if (done == true )
break ;
}
}
const findTurnAroundTime = (processes, n, bt, wt, tat) => {
for (let i = 0; i < n; i++)
tat[i] = bt[i] + wt[i];
}
const findavgTime = (processes, n, bt, quantum) => {
let wt = new Array(n).fill(0), tat = new Array(n).fill(0);
let total_wt = 0, total_tat = 0;
findWaitingTime(processes, n, bt, wt, quantum);
findTurnAroundTime(processes, n, bt, wt, tat);
document.write(`Processes Burst time Waiting time Turn around time<br/>`);
for (let i = 0; i < n; i++) {
total_wt = total_wt + wt[i];
total_tat = total_tat + tat[i];
document.write(`${i + 1} ${bt[i]} ${wt[i]} ${tat[i]}<br/>`);
}
document.write(`Average waiting time = ${total_wt / n}`);
document.write(`<br/>Average turn around time = ${total_tat / n}`);
}
processes = [1, 2, 3];
let n = processes.length;
let burst_time = [10, 5, 8];
let quantum = 2;
findavgTime(processes, n, burst_time, quantum);
</script>
|
OutputPN BT WT TAT
1 10 13 23
2 5 10 15
3 8 13 21
Average waiting time = 12
Average turn around time = 19.6667
Program for Round Robin Scheduling with arrival time as zero , different and same arrival times
C++
#include <iostream>
#include <climits>
using namespace std;
struct Process {
int AT, BT, ST[20], WT, FT, TAT, pos;
};
int quant;
int main() {
int n, i, j;
cout << "Enter the no. of processes: " ;
cin >> n;
Process p[n];
cout << "Enter the quantum: " << endl;
cin >> quant;
cout << "Enter the process numbers: " << endl;
for (i = 0; i < n; i++)
cin >> p[i].pos;
cout << "Enter the Arrival time of processes: " << endl;
for (i = 0; i < n; i++)
cin >> p[i].AT;
cout << "Enter the Burst time of processes: " << endl;
for (i = 0; i < n; i++)
cin >> p[i].BT;
int c = n, s[n][20];
float time = 0, mini = INT_MAX, b[n], a[n];
int index = -1;
for (i = 0; i < n; i++) {
b[i] = p[i].BT;
a[i] = p[i].AT;
for (j = 0; j < 20; j++) {
s[i][j] = -1;
}
}
int tot_wt, tot_tat;
tot_wt = 0;
tot_tat = 0;
bool flag = false ;
while (c != 0) {
mini = INT_MAX;
flag = false ;
for (i = 0; i < n; i++) {
float p = time + 0.1;
if (a[i] <= p && mini > a[i] && b[i] > 0) {
index = i;
mini = a[i];
flag = true ;
}
}
if (!flag) {
time ++;
continue ;
}
j = 0;
while (s[index][j] != -1) {
j++;
}
if (s[index][j] == -1) {
s[index][j] = time ;
p[index].ST[j] = time ;
}
if (b[index] <= quant) {
time += b[index];
b[index] = 0;
} else {
time += quant;
b[index] -= quant;
}
if (b[index] > 0) {
a[index] = time + 0.1;
}
if (b[index] == 0) {
c--;
p[index].FT = time ;
p[index].WT = p[index].FT - p[index].AT - p[index].BT;
tot_wt += p[index].WT;
p[index].TAT = p[index].BT + p[index].WT;
tot_tat += p[index].TAT;
}
}
cout << "Process number " ;
cout << "Arrival time " ;
cout << "Burst time " ;
cout << "\tStart time" ;
j = 0;
while (j != 10) {
j += 1;
cout << " " ;
}
cout << "\t\tFinal time" ;
cout << "\tWait Time " ;
cout << "\tTurnAround Time" << endl;
for (i = 0; i < n; i++) {
cout << p[i].pos << "\t\t" ;
cout << p[i].AT << "\t\t" ;
cout << p[i].BT << "\t" ;
j = 0;
int v = 0;
while (s[i][j] != -1) {
cout << p[i].ST[j] << " " ;
j++;
v += 3;
}
while (v != 40) {
cout << " " ;
v += 1;
}
cout << p[i].FT << "\t\t" ;
cout << p[i].WT << "\t\t" ;
cout << p[i].TAT << endl;
}
double avg_wt, avg_tat;
avg_wt = tot_wt / static_cast < double >(n);
avg_tat = tot_tat / static_cast < double >(n);
cout << "The average wait time is: " << avg_wt << endl;
cout << "The average TurnAround time is: " << avg_tat << endl;
return 0;
}
|
C
#include<stdio.h>
#include<limits.h>
#include<stdbool.h>
struct P{
int AT,BT,ST[20],WT,FT,TAT,pos;
};
int quant;
int main(){
int n,i,j;
printf ( "Enter the no. of processes :" );
scanf ( "%d" ,&n);
struct P p[n];
printf ( "Enter the quantum \n" );
scanf ( "%d" ,&quant);
printf ( "Enter the process numbers \n" );
for (i=0;i<n;i++)
scanf ( "%d" ,&(p[i].pos));
printf ( "Enter the Arrival time of processes \n" );
for (i=0;i<n;i++)
scanf ( "%d" ,&(p[i].AT));
printf ( "Enter the Burst time of processes \n" );
for (i=0;i<n;i++)
scanf ( "%d" ,&(p[i].BT));
int c=n,s[n][20];
float time =0,mini=INT_MAX,b[n],a[n];
int index=-1;
for (i=0;i<n;i++){
b[i]=p[i].BT;
a[i]=p[i].AT;
for (j=0;j<20;j++){
s[i][j]=-1;
}
}
int tot_wt,tot_tat;
tot_wt=0;
tot_tat=0;
bool flag= false ;
while (c!=0){
mini=INT_MAX;
flag= false ;
for (i=0;i<n;i++){
float p= time +0.1;
if (a[i]<=p && mini>a[i] && b[i]>0){
index=i;
mini=a[i];
flag= true ;
}
}
if (!flag){
time ++;
continue ;
}
j=0;
while (s[index][j]!=-1){
j++;
}
if (s[index][j]==-1){
s[index][j]= time ;
p[index].ST[j]= time ;
}
if (b[index]<=quant){
time +=b[index];
b[index]=0;
}
else {
time +=quant;
b[index]-=quant;
}
if (b[index]>0){
a[index]= time +0.1;
}
if (b[index]==0){
c--;
p[index].FT= time ;
p[index].WT=p[index].FT-p[index].AT-p[index].BT;
tot_wt+=p[index].WT;
p[index].TAT=p[index].BT+p[index].WT;
tot_tat+=p[index].TAT;
}
}
printf ( "Process number " );
printf ( "Arrival time " );
printf ( "Burst time " );
printf ( "\tStart time" );
j=0;
while (j!=10){
j+=1;
printf ( " " );
}
printf ( "\t\tFinal time" );
printf ( "\tWait Time " );
printf ( "\tTurnAround Time \n" );
for (i=0;i<n;i++){
printf ( "%d \t\t" ,p[i].pos);
printf ( "%d \t\t" ,p[i].AT);
printf ( "%d \t" ,p[i].BT);
j=0;
int v=0;
while (s[i][j]!=-1){
printf ( "%d " ,p[i].ST[j]);
j++;
v+=3;
}
while (v!=40){
printf ( " " );
v+=1;
}
printf ( "%d \t\t" ,p[i].FT);
printf ( "%d \t\t" ,p[i].WT);
printf ( "%d \n" ,p[i].TAT);
}
double avg_wt,avg_tat;
avg_wt=tot_wt/( float )n;
avg_tat=tot_tat/( float )n;
printf ( "The average wait time is : %lf\n" ,avg_wt);
printf ( "The average TurnAround time is : %lf\n" ,avg_tat);
return 0;
}
|
Output:
Enter the number of processes : 4
Enter the time quanta : 2
Enter the process numbers : 1 2 3 4
Enter the arrival time of the processes : 0 1 2 3
Enter the burst time of the processes : 5 4 2 1
Program No. Arrival Time Burst Time Wait Time TurnAround Time
1 0 5 7 12
2 1 4 6 10
3 2 2 2 4
4 3 1 5 6
Average wait time : 5
Average Turn Around Time : 8
Program for Round Robin Scheduling with Different Arrival Times for all Processes
For detailed implementation of Preemptive Round Robin algorithm with different arrival times for all processes please refer: Program for Round Robin Scheduling with different arrival times.
Conclusion
In conclusion, Round Robin CPU scheduling is a fair and preemptive algorithm that allocates a fixed time quantum to each process, ensuring equal CPU access. It is simple to implement but can lead to higher context-switching overhead. While it promotes fairness and prevents starvation, it may result in longer waiting times and reduced throughput, depending on the time quantum. Effective program implementation allows for the calculation of key metrics like completion time, turnaround time, and waiting time, aiding in performance evaluation and optimization.