Back

Shortest Remaining Time First

# Shortest Remaining Time First Scheduling Algorithm (SRTF)

def display(name_of_process, burst_time, arrival_time, number_of_processes,waiting_time,turnaround_time):
    print(waiting_time,turnaround_time)
    total_waiting_time = sum(waiting_time)
    total_turnaround_time = sum(turnaround_time)
    print("Name Of Process\tBurst Time\tArrival Time\tWaiting Time\tTurnAround Time")
    for num in range(number_of_processes):
        print(f"{name_of_process[num]}\t\t{burst_time[num]}\t\t{arrival_time[num]}\t\t{waiting_time[num]}\t\t{turnaround_time[num]}")
    print(f"\nAverage Waiting Time is:: {total_waiting_time / number_of_processes}\nAverage TurnAround Time is:: {total_turnaround_time / number_of_processes}")
    

def shortest_remaining_time_first(name_of_process, number_of_processes, burst_time, arrival_time):
    remaining_time = burst_time.copy()
    waiting_time = [0] * number_of_processes
    turnaround_time = [0] * number_of_processes
    completed = 0 
    clock = 0 
    min_burst = float('inf')
    shortest = -1
    finished = False

    while completed != number_of_processes:
        for num in range(number_of_processes):
            if arrival_time[num] <= clock and remaining_time[num] < min_burst and remaining_time[num] > 0:
                min_burst = remaining_time[num]
                shortest = num
                finished = True

        if not finished:
            clock += 1
            continue

        remaining_time[shortest] -= 1
        min_burst = remaining_time[shortest]
        if min_burst == 0:
            min_burst = float('inf')

        if remaining_time[shortest] == 0:
            completed += 1
            finished = False
            finish_time = clock + 1
            waiting_time[shortest] = finish_time - burst_time[shortest] - arrival_time[shortest]
            turnaround_time[shortest] = finish_time - arrival_time[shortest]

            if waiting_time[shortest] < 0:
                waiting_time[shortest] = 0

        clock += 1

    display(name_of_process, burst_time, arrival_time, number_of_processes,waiting_time,turnaround_time)

def main():
    name_of_process = []
    burst_time = []
    arrival_time = []

    number_of_processes = int(input("Enter the number of processes: "))

    for i in range(number_of_processes):
        name_of_process.append(input(f"Enter name of process {i + 1}: "))
        burst_time.append(int(input(f"Enter burst time for process {name_of_process[i]}: ")))
        arrival_time.append(int(input(f"Enter arrival time for process {name_of_process[i]}: ")))


    shortest_remaining_time_first(name_of_process, number_of_processes, burst_time, arrival_time)



if __name__ == "__main__":
    main()