From 3a1d555773a4fbe374f1b31e1b9f453cd04ec812 Mon Sep 17 00:00:00 2001 From: Madhav Goyal Date: Fri, 18 Oct 2024 12:15:42 +0530 Subject: [PATCH 1/3] Add CPU Scheduling Algorithm: FCFS --- cpu_scheduling_algorithms/__init__.py | 0 cpu_scheduling_algorithms/fcfs.py | 67 +++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 cpu_scheduling_algorithms/__init__.py create mode 100644 cpu_scheduling_algorithms/fcfs.py diff --git a/cpu_scheduling_algorithms/__init__.py b/cpu_scheduling_algorithms/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/cpu_scheduling_algorithms/fcfs.py b/cpu_scheduling_algorithms/fcfs.py new file mode 100644 index 000000000000..e395ee2a1e1b --- /dev/null +++ b/cpu_scheduling_algorithms/fcfs.py @@ -0,0 +1,67 @@ +""" +Simple Implementation of the FCFS CPU scheduling algorithm +FCFS is a non-preemptive CPU scheduling algorithm that +schedules processes based on their arrival time. +https://www.geeksforgeeks.org/program-for-fcfs-cpu-scheduling-set-1/ +Author: [Madhav Goyal](https://github.com/mdhvg) +""" + + +def fcfs(processes: list[tuple[int, int, int]]) -> None: + """ + Function to implement the FCFS CPU scheduling algorithm + + processes: list of tuples where each tuple contains the + process_id, arrival_time and burst_time of each process + """ + n = len(processes) + processes.sort(key=lambda x: x[1]) + waiting_times = [0] * n + total_waiting_time = 0 + + for i in range(1, n): + waiting_times[i] = processes[i - 1][2] + waiting_times[i - 1] + total_waiting_time += waiting_times[i] + + print(f"Average Waiting Time: {total_waiting_time / n}") + + """ + Printing the Gantt Chart for the processes in the FCFS order + The - and * symbols are used to represent the burst time and + idle time respectively for each process. + """ + last_burst = 0 + for i in range(n): + print("-" * last_burst, end="") + print("*", end="") + last_burst = processes[i][2] + print("-" * last_burst, end="") + print("\n", end="") + + last_burst = 0 + for i in range(n): + print(" " * last_burst, end="") + print(f"{processes[i][0]}", end="") + last_burst = processes[i][2] + print("\n", end="") + + +def main(): + """ + Main function to demonstrate the FCFS CPU scheduling algorithm + pass an array of (process_id, arrival_time, burst_time) to fcfs + >>> processes = [(1, 0, 3), (2, 1, 5), (3, 2, 2), (4, 3, 7), (5, 2, 2)] + >>> fcfs(processes) + Average Waiting Time: 6.6 + *---*-----*--*--*------- + 1 2 3 5 4 + """ + processes = [(1, 0, 3), (2, 1, 5), (3, 2, 2), (4, 3, 7), (5, 2, 2)] + fcfs(processes) + + +if __name__ == "__main__": + main() + import doctest + + doctest.testmod() From 2c398308f7759e02c992788d57ecc6dfc66d2bb1 Mon Sep 17 00:00:00 2001 From: Madhav Goyal Date: Fri, 18 Oct 2024 12:21:51 +0530 Subject: [PATCH 2/3] Update DIRECTORY.md with new Algorithm --- DIRECTORY.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index f0a34a553946..a32609b7c7ee 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -178,6 +178,9 @@ * [Volume Conversions](conversions/volume_conversions.py) * [Weight Conversion](conversions/weight_conversion.py) +## CPU Scheduling Algorithms + * [FCFS](cpu_scheduling_algorithms/fcfs.py) + ## Data Structures * Arrays * [Equilibrium Index In Array](data_structures/arrays/equilibrium_index_in_array.py) From c464cbcb17131060a061ee8c5118212cbb250cd7 Mon Sep 17 00:00:00 2001 From: Madhav Goyal Date: Fri, 18 Oct 2024 12:28:56 +0530 Subject: [PATCH 3/3] Apply recommended fixes from PR review --- cpu_scheduling_algorithms/fcfs.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/cpu_scheduling_algorithms/fcfs.py b/cpu_scheduling_algorithms/fcfs.py index e395ee2a1e1b..772d6947f4f8 100644 --- a/cpu_scheduling_algorithms/fcfs.py +++ b/cpu_scheduling_algorithms/fcfs.py @@ -13,17 +13,23 @@ def fcfs(processes: list[tuple[int, int, int]]) -> None: processes: list of tuples where each tuple contains the process_id, arrival_time and burst_time of each process + + >>> processes = [(1, 0, 3), (2, 2, 7), (3, 1, 4), (4, 5, 2)] + >>> fcfs(processes) + Average Waiting Time: 6.0 + *---*----*-------*-- + 1 3 2 4 """ - n = len(processes) - processes.sort(key=lambda x: x[1]) - waiting_times = [0] * n + total_processes = len(processes) + processes.sort(key=lambda process: process[1]) + waiting_times = [0] * total_processes total_waiting_time = 0 - for i in range(1, n): + for i in range(1, total_processes): waiting_times[i] = processes[i - 1][2] + waiting_times[i - 1] total_waiting_time += waiting_times[i] - print(f"Average Waiting Time: {total_waiting_time / n}") + print(f"Average Waiting Time: {total_waiting_time / total_processes}") """ Printing the Gantt Chart for the processes in the FCFS order @@ -31,7 +37,7 @@ def fcfs(processes: list[tuple[int, int, int]]) -> None: idle time respectively for each process. """ last_burst = 0 - for i in range(n): + for i in range(total_processes): print("-" * last_burst, end="") print("*", end="") last_burst = processes[i][2] @@ -39,14 +45,14 @@ def fcfs(processes: list[tuple[int, int, int]]) -> None: print("\n", end="") last_burst = 0 - for i in range(n): + for i in range(total_processes): print(" " * last_burst, end="") print(f"{processes[i][0]}", end="") last_burst = processes[i][2] print("\n", end="") -def main(): +def main() -> None: """ Main function to demonstrate the FCFS CPU scheduling algorithm pass an array of (process_id, arrival_time, burst_time) to fcfs