# Program for FCFS CPU Scheduling | Set 2 (Processes with different arrival times)

We have already discussed FCFS Scheduling of processes with same arrival time. In this post, scenarios, when processes have different arrival times, are discussed. Given n processes with their burst times and arrival times, the task is to find the average waiting time and an average turn around time using FCFS scheduling algorithm.
FIFO simply queues processes in the order they arrive in the ready queue. Here, the process that comes first will be executed first and next process will start only after the previous gets fully executed.

1. Completion Time: Time at which the process completes its execution.
2. Turn Around Time: Time Difference between completion time and arrival time. Turn Around Time = Completion Time – Arrival Time
3. Waiting Time(W.T): Time Difference between turn around time and burst time.
Waiting Time = Turn Around Time – Burst Time.

Process     Wait Time : Service Time - Arrival Time
P0 0 - 0 = 0
P1 5 - 1 = 4
P2 8 - 2 = 6
P3 16 - 3 = 13

Average Wait Time: (0 + 4 + 6 + 13) / 4 = 5.75

Service Time: Also known as Burst Time, this is the amount of time a process requires to complete its execution on the CPU. It represents the time the CPU spends executing instructions of that particular process.

Waiting Time: It refers to the total amount of time that a process spends waiting in the ready queue before it gets a chance to execute on the CPU.

Changes in code as compare to code of FCFS with same arrival time: To find waiting time: Time taken by all processes before the current process to be started (i.e. burst time of all previous processes) – arrival time of current process
wait_time[i] = (bt[0] + bt[1] +…… bt[i-1] ) – arrival_time[i]

Implementation:

1- Input the processes along with their burst time(bt)
and arrival time(at)
2- Find waiting time for all other processes i.e. for
a given process i:
wt[i] = (bt[0] + bt[1] +...... bt[i-1]) - at[i]
3- Now find turn around time
= waiting_time + burst_time for all processes
4- Average waiting time =
total_waiting_time / no_of_processes
5- Average turn around time =
total_turn_around_time / no_of_processes

Example1:

## C++

 //Process Synced, dynamic input, c++ easy to understand code #include #include using namespace std; //class process with all the time values and functions class Process{     int id, bt, at, ct, tat, wt;     public:     void input(Process*,int );     void calc(Process *,int);     void show(Process*,int);     void sort(Process *, int); }; //main function int main(){     int n;     cout<<"\nEnter the no of processes in your system:\n";     cin>>n;     Process *p = new Process[n];     Process f;     f.input(p,n);     f.sort(p, n);     f.calc(p,n);     f.show(p,n);     return 0; } //taking input arrival and burst times for all processes void Process::input(Process *p,int n){     for(int i = 0;i>p[i].at;         cout<<"\nEnter burst time for process "<>p[i].bt;         p[i].id = i+1;     } } //calculating waiting, turn-around and completion time void Process::calc(Process*p, int n){     int sum = 0;     sum = sum + p[0].at;     for(int i = 0;ip[j+1].at){                 int temp;                 //sorting burst times                 temp = p[j].bt;                 p[j].bt = p[j+1].bt;                 p[j+1].bt = temp;                 //sorting arrival times                 temp = p[j].at;                 p[j].at = p[j+1].at;                 p[j+1].at = temp;                 //sorting their respective IDs                 temp = p[j].id;                 p[j].id = p[j+1].id;                 p[j+1].id = temp;             }         }     } } //display function void Process::show(Process*p, int n){     cout<<"Process\tArrival\tBurst\tWaiting\tTurn Around\tCompletion\n";     for(int i =0;i

## Java

 // Java program for implementation of FCFS  // scheduling with different arrival time  public class GFG{       // Function to find the waiting time for all  // processes  static void findWaitingTime(int processes[], int n, int bt[], int wt[], int at[])  {      int service_time[] = new int[n];      service_time[0] = at[0];      wt[0] = 0;         // calculating waiting time      for (int i = 1; i < n ; i++)      {          //representing wasted time in queue         int wasted=0;         // Add burst time of previous processes          service_time[i] = service_time[i-1] + bt[i-1];             // Find waiting time for current process =          // sum - at[i]          wt[i] = service_time[i] - at[i];             // If waiting time for a process is in negative          // that means it is already in the ready queue          // before CPU becomes idle so its waiting time is 0          // wasted time is basically time for process to wait after a process is over         if (wt[i] < 0) {             wasted = Math.abs(wt[i]);             wt[i] = 0;          }         //Add wasted time         service_time[i] = service_time[i] + wasted;     }  }     // Function to calculate turn around time  static void findTurnAroundTime(int processes[], int n, int bt[],                                      int wt[], int tat[])  {      // Calculating turnaround time by adding bt[i] + wt[i]      for (int i = 0; i < n ; i++)          tat[i] = bt[i] + wt[i];  }     // Function to calculate average waiting and turn-around  // times.  static void findavgTime(int processes[], int n, int bt[], int at[])  {      int wt[] = new int[n], tat[] = new int[n];         // Function to find waiting time of all processes      findWaitingTime(processes, n, bt, wt, at);         // Function to find turn around time for all processes      findTurnAroundTime(processes, n, bt, wt, tat);         // Display processes along with all details      System.out.print("Processes " + " Burst Time " + " Arrival Time "         + " Waiting Time " + " Turn-Around Time "         + " Completion Time \n");      int total_wt = 0, total_tat = 0;      for (int i = 0 ; i < n ; i++)      {          total_wt = total_wt + wt[i];          total_tat = total_tat + tat[i];          int compl_time = tat[i] + at[i];          System.out.println(i+1 + "\t\t" + bt[i] + "\t\t"             + at[i] + "\t\t" + wt[i] + "\t\t "             + tat[i] + "\t\t " + compl_time);      }         System.out.print("Average waiting time = "         + (float)total_wt / (float)n);      System.out.print("\nAverage turn around time = "         + (float)total_tat / (float)n);  }     // Driver code         public static void main(String args[]) {          // Process id's      int processes[] = {1, 2, 3};      int n = processes.length;         // Burst time of all processes      int burst_time[] = {5, 9, 6};         // Arrival time of all processes      int arrival_time[] = {0, 3, 6};         findavgTime(processes, n, burst_time, arrival_time);        }  }     /*This code is contributed by PrinciRaj1992*/

## Python3

 # Python3 program for implementation of FCFS  # scheduling with different arrival time     # Function to find the waiting time # for all processes  def findWaitingTime(processes, n, bt, wt, at):      service_time = [0] * n      service_time[0] = 0     wt[0] = 0        # calculating waiting time      for i in range(1, n):                     # Add burst time of previous processes          service_time[i] = (service_time[i - 1] +                                      bt[i - 1])             # Find waiting time for current         # process = sum - at[i]          wt[i] = service_time[i] - at[i]             # If waiting time for a process is in          # negative that means it is already          # in the ready queue before CPU becomes          # idle so its waiting time is 0          if (wt[i] < 0):             wt[i] = 0        # Function to calculate turn around time  def findTurnAroundTime(processes, n, bt, wt, tat):             # Calculating turnaround time by     # adding bt[i] + wt[i]      for i in range(n):         tat[i] = bt[i] + wt[i]        # Function to calculate average waiting  # and turn-around times.  def findavgTime(processes, n, bt, at):      wt = [0] * n     tat = [0] * n         # Function to find waiting time     # of all processes      findWaitingTime(processes, n, bt, wt, at)         # Function to find turn around time for     # all processes      findTurnAroundTime(processes, n, bt, wt, tat)         # Display processes along with all details      print("Processes   Burst Time   Arrival Time     Waiting",            "Time   Turn-Around Time  Completion Time \n")     total_wt = 0     total_tat = 0     for i in range(n):            total_wt = total_wt + wt[i]          total_tat = total_tat + tat[i]          compl_time = tat[i] + at[i]          print(" ", i + 1, "\t\t", bt[i], "\t\t", at[i],                "\t\t", wt[i], "\t\t ", tat[i], "\t\t ", compl_time)         print("Average waiting time = %.5f "%(total_wt /n))     print("\nAverage turn around time = ", total_tat / n)     # Driver code  if __name__ =="__main__":            # Process id's      processes = [1, 2, 3]     n = 3        # Burst time of all processes      burst_time = [5, 9, 6]         # Arrival time of all processes      arrival_time = [0, 3, 6]         findavgTime(processes, n, burst_time,                             arrival_time)    # This code is contributed # Shubham Singh(SHUBHAMSINGH10)

## C#

 // C# program for implementation of FCFS  // scheduling with different arrival time  using System;        public class GFG{         // Function to find the waiting time for all  // processes  static void findWaitingTime(int []processes, int n, int []bt, int []wt, int []at)  {      int []service_time = new int[n];      service_time[0] = 0;      wt[0] = 0;          // calculating waiting time      for (int i = 1; i < n ; i++)      {          // Add burst time of previous processes          service_time[i] = service_time[i-1] + bt[i-1];              // Find waiting time for current process =          // sum - at[i]          wt[i] = service_time[i] - at[i];              // If waiting time for a process is in negative          // that means it is already in the ready queue          // before CPU becomes idle so its waiting time is 0          if (wt[i] < 0)              wt[i] = 0;      }  }      // Function to calculate turn around time  static void findTurnAroundTime(int []processes, int n, int[] bt,                                      int []wt, int[] tat)  {      // Calculating turnaround time by adding bt[i] + wt[i]      for (int i = 0; i < n ; i++)          tat[i] = bt[i] + wt[i];  }      // Function to calculate average waiting and turn-around  // times.  static void findavgTime(int []processes, int n, int []bt, int []at)  {      int []wt = new int[n]; int []tat = new int[n];          // Function to find waiting time of all processes      findWaitingTime(processes, n, bt, wt, at);          // Function to find turn around time for all processes      findTurnAroundTime(processes, n, bt, wt, tat);          // Display processes along with all details      Console.Write("Processes " + " Burst Time " + " Arrival Time "         + " Waiting Time " + " Turn-Around Time "         + " Completion Time \n");      int total_wt = 0, total_tat = 0;      for (int i = 0 ; i < n ; i++)      {          total_wt = total_wt + wt[i];          total_tat = total_tat + tat[i];          int compl_time = tat[i] + at[i];          Console.WriteLine(i+1 + "\t\t" + bt[i] + "\t\t"             + at[i] + "\t\t" + wt[i] + "\t\t "             + tat[i] + "\t\t " + compl_time);      }          Console.Write("Average waiting time = "         + (float)total_wt / (float)n);      Console.Write("\nAverage turn around time = "         + (float)total_tat / (float)n);  }      // Driver code          public static void Main(String []args) {          // Process id's      int []processes = {1, 2, 3};      int n = processes.Length;          // Burst time of all processes      int []burst_time = {5, 9, 6};          // Arrival time of all processes      int []arrival_time = {0, 3, 6};          findavgTime(processes, n, burst_time, arrival_time);         }  } // This code is contributed by Princi Singh

## Javascript



Output:

Processes  Burst Time  Arrival Time  Waiting Time  Turn-Around Time  Completion Time
1 5 0 0 5 5
2 9 3 2 11 14
3 6 6 8 14 20
Average waiting time = 3.33333
Average turn around time = 10.0

Example2:

## C++

 #include using namespace std;    int main() {     int n, burst_time[20], waiting_time[20], turnaround_time[20];     float avg_waiting_time = 0, avg_turnaround_time = 0;        cout<<"Enter total number of processes(maximum 20): ";     cin>>n;        cout<<"\nEnter Process Burst Time\n";     for(int i=0;i>burst_time[i];     }        waiting_time[0] = 0; // Waiting time for first process is 0        // Calculating waiting time     for(int i=1;i

## Java

 import java.util.Scanner;    public class ProcessScheduling {        public static void main(String[] args) {         int n, burst_time[], waiting_time[], turnaround_time[];         float avg_waiting_time = 0, avg_turnaround_time = 0;            Scanner sc = new Scanner(System.in);         System.out.print("Enter total number of processes (maximum 20): ");         n = sc.nextInt();         burst_time = new int[n];         waiting_time = new int[n];         turnaround_time = new int[n];            System.out.println("\nEnter Process Burst Time");         for (int i = 0; i < n; i++) {             System.out.print("P[" + (i+1) + "]: ");             burst_time[i] = sc.nextInt();         }            waiting_time[0] = 0; // Waiting time for first process is 0            // Calculating waiting time         for (int i = 1; i < n; i++) {             waiting_time[i] = 0;             for (int j = 0; j < i; j++) {                 waiting_time[i] += burst_time[j];             }         }            // Calculating turnaround time by adding burst_time and waiting_time         for (int i = 0; i < n; i++) {             turnaround_time[i] = burst_time[i] + waiting_time[i];             avg_turnaround_time += turnaround_time[i];         }            avg_turnaround_time /= n;         System.out.println("\nAverage Turnaround Time: " + avg_turnaround_time + "ms");            // Calculating average waiting time         for (int i = 0; i < n; i++) {             avg_waiting_time += waiting_time[i];         }            avg_waiting_time /= n;         System.out.println("\nAverage Waiting Time: " + avg_waiting_time + "ms\n");            System.out.println("Process\tBurst Time\tWaiting Time\tTurnaround Time");         for (int i = 0; i < n; i++) {             System.out.println("P[" + (i+1) + "]\t" + burst_time[i] + "\t\t" + waiting_time[i] + "\t\t" + turnaround_time[i]);         }            sc.close();     }    }

## Python3

 # Python program to calculate # waiting time, turnaround time, # and average waiting time and # turnaround time of a process    # Function to calculate waiting time, # turnaround time and average waiting time # and turnaround time of a process def calculateTime(n, burst_time):     waiting_time = [0] * n     turnaround_time = [0] * n     avg_waiting_time = 0     avg_turnaround_time = 0        waiting_time[0] = 0 # Waiting time for first process is 0        # Calculating waiting time     for i in range(1, n):         waiting_time[i] = 0         for j in range(i):             waiting_time[i] += burst_time[j]        # Calculating turnaround time by adding burst_time and waiting_time     for i in range(n):         turnaround_time[i] = burst_time[i] + waiting_time[i]         avg_turnaround_time += turnaround_time[i]        avg_turnaround_time /= n     print(f"\nAverage Turnaround Time: {avg_turnaround_time}ms")        # Calculating average waiting time     for i in range(n):         avg_waiting_time += waiting_time[i]        avg_waiting_time /= n     print(f"\nAverage Waiting Time: {avg_waiting_time}ms\n")        print("Process\tBurst Time\tWaiting Time\tTurnaround Time")     for i in range(n):         print(f"P[{i+1}]\t{burst_time[i]}\t\t{waiting_time[i]}\t\t{turnaround_time[i]}")    # Driver code if __name__ == '__main__':     n = int(input("Enter total number of processes(maximum 20): "))        burst_time = []     print("\nEnter Process Burst Time")     for i in range(n):         burst_time.append(int(input(f"P[{i+1}]: ")))        calculateTime(n, burst_time)

## C#

 using System;    class Program {     static void Main(string[] args)     {         int n;         int[] burst_time = new int[20];         int[] waiting_time = new int[20];         int[] turnaround_time = new int[20];         float avg_waiting_time = 0;         float avg_turnaround_time = 0;            Console.Write(             "Enter total number of processes(maximum 20): ");         n = Convert.ToInt32(Console.ReadLine());            Console.WriteLine("\nEnter Process Burst Time");         for (int i = 0; i < n; i++) {             Console.Write("P[" + (i + 1) + "]: ");             burst_time[i]                 = Convert.ToInt32(Console.ReadLine());         }            waiting_time[0]             = 0; // Waiting time for first process is 0            // Calculating waiting time         for (int i = 1; i < n; i++) {             waiting_time[i] = 0;             for (int j = 0; j < i; j++) {                 waiting_time[i] += burst_time[j];             }         }            // Calculating turnaround time by adding burst_time         // and waiting_time         for (int i = 0; i < n; i++) {             turnaround_time[i]                 = burst_time[i] + waiting_time[i];             avg_turnaround_time += turnaround_time[i];         }            avg_turnaround_time /= n;         Console.WriteLine("\nAverage Turnaround Time: "                           + avg_turnaround_time + "ms\n");            // Calculating average waiting time         for (int i = 0; i < n; i++) {             avg_waiting_time += waiting_time[i];         }            avg_waiting_time /= n;         Console.WriteLine("\nAverage Waiting Time: "                           + avg_waiting_time + "ms\n\n");            Console.WriteLine(             "Process\tBurst Time\tWaiting Time\tTurnaround Time");         for (int i = 0; i < n; i++) {             Console.WriteLine("P[" + (i + 1) + "]\t"                               + burst_time[i] + "\t\t"                               + waiting_time[i] + "\t\t"                               + turnaround_time[i]);         }     } }

## Javascript

 let n, burst_time = [], waiting_time = [], turnaround_time = []; let avg_waiting_time = 0, avg_turnaround_time = 0;    n = prompt("Enter total number of processes(maximum 20): ");    console.log("\nEnter Process Burst Time\n"); for (let i = 0; i < n; i++) {     burst_time[i] = prompt(`P[\${i + 1}]: `); }    waiting_time[0] = 0; // Waiting time for first process is 0    // Calculating waiting time for (let i = 1; i < n; i++) {     waiting_time[i] = 0;     for (let j = 0; j < i; j++) {         waiting_time[i] += parseInt(burst_time[j]);     } }    // Calculating turnaround time by adding burst_time and waiting_time for (let i = 0; i < n; i++) {     turnaround_time[i] = parseInt(burst_time[i]) + parseInt(waiting_time[i]);     avg_turnaround_time += turnaround_time[i]; }    avg_turnaround_time /= n; console.log(`\nAverage Turnaround Time: \${avg_turnaround_time}ms\n`);    // Calculating average waiting time for (let i = 0; i < n; i++) {     avg_waiting_time += waiting_time[i]; }    avg_waiting_time /= n; console.log(`\nAverage Waiting Time: \${avg_waiting_time}ms\n\n`);    console.log("Process\tBurst Time\tWaiting Time\tTurnaround Time\n"); for (let i = 0; i < n; i++) {     console.log(`P[\${i + 1}]\t\${burst_time[i]}\t\t\${waiting_time[i]}\t\t\${turnaround_time[i]}`); }

Output:

In this program, the user is asked to input the number of processes and their respective burst times. Then, the program calculates the waiting time and turnaround time for each process and outputs the average waiting time and average turnaround time. Finally, the program displays a table showing the details of each process.

If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or if you want to share more information about the topic discussed above.

Unlock the Power of Placement Preparation!
Feeling lost in OS, DBMS, CN, SQL, and DSA chaos? Our Complete Interview Preparation Course is the ultimate guide to conquer placements. Trusted by over 100,000+ geeks, this course is your roadmap to interview triumph.
Ready to dive in? Explore our Free Demo Content and join our Complete Interview Preparation course.

Previous
Next