Experiment No: 3
Date:
Title: Scheduling Algorithms
Objective:
 To understand how various scheduling algorithms work.
 To write their codes and check their outputs.
Theory/Description:
   1. First In First Out Algorithm-
      First In First Out simply queues processes in the order that they arrive in the ready
      queue. 
      In this, the process that comes first will be executed first and the next process starts
      only after the previous gets fully executed. 
       Code-
       #include<stdio.h>
       void findWaitingTime(int processes[], int n, int bt[], int wt[])
       {
         // waiting time for first process is 0
         wt[0] = 0;
           // calculating waiting time
           for (int i = 1; i < n ; i++ )
              wt[i] = bt[i-1] + wt[i-1] ;
       }
       // Function to calculate turn around time
       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 time
       void findavgTime( int processes[], int n, int bt[])
       {
          int wt[n], tat[n], total_wt = 0, total_tat = 0;
           //Function to find waiting time of all processes
    findWaitingTime(processes, n, bt, wt);
    //Function to find turn around time for all processes
    findTurnAroundTime(processes, n, bt, wt, tat);
    //Display processes along with all details
    printf("Processes Burst time Waiting time Turn around time\n");
    // Calculate total waiting time and total turn
    // around time
    for (int i=0; i<n; i++)
    {
       total_wt = total_wt + wt[i];
       total_tat = total_tat + tat[i];
       printf(" %d ",(i+1));
       printf("     %d ", bt[i] );
       printf("     %d",wt[i] );
       printf("     %d\n",tat[i] );
    }
    int s=(float)total_wt / (float)n;
    int t=(float)total_tat / (float)n;
    printf("Average waiting time = %d",s);
    printf("\n");
    printf("Average turn around time = %d ",t);
}
// Driver code
int main()
{
   //process id's
   int processes[] = { 1, 2, 3};
   int n = sizeof processes / sizeof processes[0];
    //Burst time of all processes
    int burst_time[] = {10, 5, 8};
    findavgTime(processes, n, burst_time);
    return 0;
}
                                                                      PTO
Output-
2. Round Robin Scheduling Algorithm-
   A round-robin is a CPU scheduling algorithm that shares equal portions of resources
   in circular orders with each process and handles all processes without prioritization.
   In the round-robin, each process gets a fixed time interval of the slice to utilize the
   resources or execute its task called time quantum or time slice.
   Code-
   #include<stdio.h>
   void main()
   {
     // initlialize the variable name
     int i, NOP, sum=0,count=0, y, quant, wt=0, tat=0, at[10], bt[10], temp[10];
     float avg_wt, avg_tat;
     printf(" Total number of process in the system: ");
     scanf("%d", &NOP);
     y = NOP; // Assign the number of process to variable y
   // Use for loop to enter the details of the process like Arrival time and the Burst Time
   for(i=0; i<NOP; i++)
   {
   printf("\n Enter the Arrival and Burst time of the Process[%d]\n", i+1);
   printf(" Arrival time is: \t"); // Accept arrival time
   scanf("%d", &at[i]);
   printf(" \nBurst time is: \t"); // Accept the Burst time
   scanf("%d", &bt[i]);
   temp[i] = bt[i]; // store the burst time in temp array
   }
   // Accept the Time qunat
   printf("Enter the Time Quantum for the process: \t");
   scanf("%d", &quant);
   // Display the process No, burst time, Turn Around Time and the waiting time
   printf("\n Process No \t\t Burst Time \t\t TAT \t\t Waiting Time ");
   for(sum=0, i = 0; y!=0; )
   {
   if(temp[i] <= quant && temp[i] > 0) // define the conditions
   {
      sum = sum + temp[i];
    temp[i] = 0;
    count=1;
    }
    else if(temp[i] > 0)
    {
       temp[i] = temp[i] - quant;
       sum = sum + quant;
    }
    if(temp[i]==0 && count==1)
    {
       y--; //decrement the process no.
       printf("\nProcess No[%d] \t\t %d\t\t\t\t %d\t\t\t %d", i+1, bt[i], sum-at[i], sum-
at[i]-bt[i]);
       wt = wt+sum-at[i]-bt[i];
       tat = tat+sum-at[i];
       count =0;
    }
    if(i==NOP-1)
    {
       i=0;
    }
    else if(at[i+1]<=sum)
    {
       i++;
    }
    else
    {
       i=0;
    }
}
// represents the average waiting time and Turn Around time
avg_wt = wt * 1.0/NOP;
avg_tat = tat * 1.0/NOP;
printf("\n Average Turn Around Time: \t%f", avg_wt);
printf("\n Average Waiting Time: \t%f", avg_tat);
                                                                                       PTO
Output-
3. Shortest Job First Algoritm-
   The shortest job first (SJF) or shortest job next, is a scheduling policy that selects
   the waiting process with the smallest execution time to execute next. 
   Code-
   #include <stdio.h>
   int main()
   {
       int A[100][4]; // Matrix for storing Process Id, Burst
                  // Time, Average Waiting Time & Average
                  // Turn Around Time.
       int i, j, n, total = 0, index, temp;
       float avg_wt, avg_tat;
       printf("Enter number of process: ");
       scanf("%d", &n);
       printf("Enter Burst Time:\n");
       // User Input Burst Time and alloting Process Id.
       for (i = 0; i < n; i++) {
           printf("P%d: ", i + 1);
           scanf("%d", &A[i][1]);
           A[i][0] = i + 1;
       }
       // Sorting process according to their Burst Time.
for (i = 0; i < n; i++) {
    index = i;
    for (j = i + 1; j < n; j++)
      if (A[j][1] < A[index][1])
           index = j;
    temp = A[i][1];
    A[i][1] = A[index][1];
    A[index][1] = temp;
    temp = A[i][0];
    A[i][0] = A[index][0];
    A[index][0] = temp;
}
A[0][2] = 0;
// Calculation of Waiting Times
for (i = 1; i < n; i++) {
    A[i][2] = 0;
    for (j = 0; j < i; j++)
      A[i][2] += A[j][1];
    total += A[i][2];
}
avg_wt = (float)total / n;
total = 0;
printf("P      BT       WT    TAT\n");
// Calculation of Turn Around Time and printing the
// data.
for (i = 0; i < n; i++) {
    A[i][3] = A[i][1] + A[i][2];
    total += A[i][3];
    printf("P%d         %d    %d   %d\n", A[i][0],
           A[i][1], A[i][2], A[i][3]);
    }
    avg_tat = (float)total / n;
    printf("Average Waiting Time= %f", avg_wt);
    printf("\nAverage Turnaround Time= %f", avg_tat);
}
Output-