Round Robin (RR) Scheduling Algorithm
Introduction​
The Round Robin (RR) scheduling algorithm is a preemptive process scheduling technique used in operating systems. In this algorithm, each process is assigned a fixed time slice, known as a quantum, to execute in a cyclic manner. This ensures that no process waits too long in the queue, promoting fairness among processes.
Example​
Consider three processes with the following burst times:
- Process 1: 
3 units - Process 2: 
5 units - Process 3: 
7 units 
Using the Round Robin algorithm with a quantum of 2 units, the processes will be executed in the order of their arrival.
Problem Definition​
Given a list of processes and their corresponding burst times, calculate the waiting times, turnaround times, average waiting time, and average turnaround time for the processes.
Key Concepts​
- Waiting Time: The amount of time a process spends waiting before it starts executing.
 - Turnaround Time: The total time taken for a process from arrival to completion, which includes both the waiting time and the burst time.
 
Round Robin Scheduling Approach​
In the RR algorithm:
- Each process is given a fixed time slice (quantum) for execution.
 - If a process does not finish within its quantum, it is moved to the end of the queue and waits for its next turn.
 
Code Implementation in Python​
Below is the Python implementation for the Round Robin scheduling algorithm:
from __future__ import annotations
from statistics import mean
def calculate_waiting_times(burst_times: list[int], quantum: int = 2) -> list[int]:
    """
    Calculate the waiting times for each process using Round Robin scheduling.
    
    Parameters:
    burst_times (list[int]): The burst time for each process.
    quantum (int): The time slice for each process (default is 2).
    
    Returns:
    list[int]: The waiting time for each process.
    """
    remaining_burst_times = list(burst_times)
    waiting_times = [0] * len(burst_times)
    current_time = 0
    while True:
        all_done = True
        for i, burst_time in enumerate(burst_times):
            if remaining_burst_times[i] > 0:
                all_done = False
                if remaining_burst_times[i] > quantum:
                    current_time += quantum
                    remaining_burst_times[i] -= quantum
                else:
                    current_time += remaining_burst_times[i]
                    waiting_times[i] = current_time - burst_time
                    remaining_burst_times[i] = 0
        
        if all_done:
            return waiting_times
def calculate_turnaround_times(burst_times: list[int], waiting_times: list[int]) -> list[int]:
    """
    Calculate the turnaround times for each process.
    
    Turnaround time is the sum of waiting time and burst time for each process.
    
    Returns:
    list[int]: The turnaround time for each process.
    """
    return [burst + wait for burst, wait in zip(burst_times, waiting_times)]
if __name__ == "__main__":
    burst_times = [3, 5, 7]
    # Calculate waiting times and turnaround times
    waiting_times = calculate_waiting_times(burst_times)
    turnaround_times = calculate_turnaround_times(burst_times, waiting_times)
    # Display the results
    print("Process ID \tBurst Time \tWaiting Time \tTurnaround Time")
    for i, burst_time in enumerate(burst_times):
        print(
            f"  {i + 1}\t\t  {burst_time}\t\t  {waiting_times[i]}\t\t  "
            f"{turnaround_times[i]}"
        )
    # Calculate and display average waiting and turnaround times
    print(f"\nAverage waiting time = {mean(waiting_times):.5f}")
    print(f"Average turnaround time = {mean(turnaround_times):.5f}")
Explanation of the Code​
- 
Waiting Time Calculation:
- Each process gets a chance to execute for a fixed quantum of time.
 - The waiting time for each process is calculated based on how much time has elapsed before it gets executed.
 
 - 
Turnaround Time Calculation:
- Turnaround time is the sum of waiting time and burst time for each process.
 
 - 
Average Times:
- The average waiting time and average turnaround time are calculated by dividing the total time by the number of processes.
 
 
Example Output​
For the input where burst times are [3, 5, 7], the output is as follows:
Process ID Burst Time Waiting Time Turnaround Time 1 3 0 3 2 5 3 8 3 7 8 15
Average waiting time = 3.67 Average turnaround time = 8.67
Time and Space Complexity​
- Time Complexity: The time complexity is O(n) where n is the number of processes. Each function iterates through the process list.
 - Space Complexity: The space complexity is O(n) due to the storage of waiting times and turnaround times.
 
Conclusion​
The Round Robin (RR) scheduling algorithm is effective for ensuring fairness in process execution. While it can introduce context switching overhead, it is widely used in time-sharing systems to allow multiple processes to share CPU time efficiently.