SJF Scheduling Program in C

Problem Description:

Write an SJF scheduling program in C to determine the average waiting time and average turnaround time given n processes and their burst times.

SJF Scheduling Algorithm in C:

The CPU scheduling algorithm Shortest Job First (SJF), allocates the CPU to the processes according to the process with smallest execution time.

SJF uses both preemptive and non-preemptive scheduling. The preemptive version of SJF is called SRTF (Shortest Remaining Time First). Here we will discuss about SJF i.e., the non-preemptive scheduling.

Advantages of SJF:
  • It has the minimum waiting time among all the scheduling algorithms.
  • A process having larger burst time may get into starvation but the problem can be solved using concept of Ageing.
  • It is a greedy algorithm and provides optimal scheduling.
Problem Solution

1. Enter number of processes.
2. Enter the burst time of all the processes.
3. Sort all the processes according to their burst time.
4. Find waiting time, WT of all the processes.
5. For the smallest process, WT = 0.
6. For all the next processes i, find waiting time by adding burst time of all the previously completed process.
7. Calculate Turnaround time = WT + BT for all the processes.
8. Calculate average waiting time = total waiting time / no. of processes.
9. Calculate average turnaround time= total turnaround time / no. of processes.

SJF Example:

Process Arrival Time Burst Time
P1 0 5
P2 0 4
P3 0 12
P4 0 7

Gantt Chart:
SJF Scheduling Example

advertisement
advertisement

Waiting Time: Time Difference between turnaround time and burst time.

Waiting Time = Turnaround Time – Burst Time

P1 waiting time: 4
P2 waiting time: 0
P3 waiting time: 16
P4 waiting time: 9

Average Waiting Time = (4 + 0 + 16 + 9)/4 = 29/4 = 7.25

Sanfoundry Certification Contest of the Month is Live. 100+ Subjects. Participate Now!

Turnaround Time: Difference between completion time and arrival time.

Turnaround Time = Completion Time – Arrival Time

P1 turnaround time: 9-0 = 9
P2 turnaround time: 4-0 = 4
P3 turnaround time: 28-0 = 28
P4 turnaround time: 16-0 = 16

Average Turnaround Time = (9 + 4 + 28 + 16)/4 = 14.25

Program/Source Code

Here is the source code of the C Program to Implement SJF Scheduling. The C program is successfully compiled and run on a Linux system. The program output is also shown below.

advertisement
  1. /*
  2.  * C Program to Implement SJF Scheduling
  3.  */
  4.  
  5. #include<stdio.h>
  6. int main()
  7. {
  8.     int bt[20],p[20],wt[20],tat[20],i,j,n,total=0,totalT=0,pos,temp;
  9.     float avg_wt,avg_tat;
  10.     printf("Enter number of process:");
  11.     scanf("%d",&n);
  12.  
  13.     printf("\nEnter Burst Time:\n");
  14.     for(i=0;i<n;i++)
  15.     {
  16.         printf("p%d:",i+1);
  17.         scanf("%d",&bt[i]);
  18.         p[i]=i+1;
  19.     }
  20.  
  21.     //sorting of burst times
  22.     for(i=0;i<n;i++)
  23.     {
  24.         pos=i;
  25.         for(j=i+1;j<n;j++)
  26.         {
  27.             if(bt[j]<bt[pos])
  28.                 pos=j;
  29.         }
  30.  
  31.         temp=bt[i];
  32.         bt[i]=bt[pos];
  33.         bt[pos]=temp;
  34.  
  35.         temp=p[i];
  36.         p[i]=p[pos];
  37.         p[pos]=temp;
  38.     }
  39.  
  40.     wt[0]=0;
  41.  
  42.     //finding the waiting time of all the processes
  43.     for(i=1;i<n;i++)
  44.     {
  45.         wt[i]=0;
  46.         for(j=0;j<i;j++)
  47.              //individual WT by adding BT of all previous completed processes
  48.             wt[i]+=bt[j];
  49.  
  50.         //total waiting time
  51.         total+=wt[i];   
  52.     }
  53.  
  54.     //average waiting time
  55.     avg_wt=(float)total/n;  
  56.  
  57.     printf("\nProcess\t Burst Time \tWaiting Time\tTurnaround Time");
  58.     for(i=0;i<n;i++)
  59.     {
  60.         //turnaround time of individual processes
  61.         tat[i]=bt[i]+wt[i]; 
  62.  
  63.         //total turnaround time
  64.         totalT+=tat[i];      
  65.         printf("\np%d\t\t %d\t\t %d\t\t\t%d",p[i],bt[i],wt[i],tat[i]);
  66.     }
  67.  
  68.     //average turnaround time
  69.     avg_tat=(float)totalT/n;     
  70.     printf("\n\nAverage Waiting Time=%f",avg_wt);
  71.     printf("\nAverage Turnaround Time=%f",avg_tat);
  72. }
Program Explanation

1. Initialize two array pid[] and bt[] of size 20.
2. Ask the user for number of processes n.
3. Ask the user for process id and burst time for all n processes and store them into pid[] and bt[] respectively.
4. Sort all the processes according to their burst time.
5. Assign waiting time = 0 to the smallest process.
6. Calculate waiting time of each process by using two loops and adding all the burst time of previously completed processes.
7. Print Process Id, Burst Time, waiting time and Turnaround time of each process in tabular manner.
8. Calculate and print turnaround time of each process = bt[i] + wt[i].
9. Add waiting time of all the processes and store it in the variable total.
10. Add turnaround time of all the processes and store it in the variable totalT.
11. Calculate average waiting time as avg_wt = total/n.
12. Calculate average turnaround time as avg_tat = totalT/n;
13. Print average waiting time and average turnaround time.
14. Exit.

Time Complexity: O(n2)
The above program for implementing SJF Scheduling has a time complexity of O(n2), as the for loop runs for n^2 times for calculating waiting time of each process.

Space Complexity: O(n)
In the SJF Scheduling program, space complexity is O(n) as arrays of size n have been initialized to store the values in it.

Run Time Testcases

In this case, we enter “3” as the number of processes, and the burst time are “p1: 5”, “p2: 4”, “p3: 12”, and “p4: 7” to find average waiting time and average turnaround time using SJF Scheduling algorithm.

advertisement
Enter number of process:4
 
Enter Burst Time:
p1:5
p2:4
p3:12
p4:7
 
Process      Burst Time     Waiting Time    Turnaround Time
p2               4               0                  4
p1               5               4                  9
p4               7               9                  16
p3               12              16                 28
 
Average Waiting Time=7.250000
Average Turnaround Time=14.250000

To practice programs on every topic in C, please visit “Programming Examples in C”, “Data Structures in C” and “Algorithms in C”.

If you find any mistake above, kindly email to [email protected]

advertisement
advertisement
Subscribe to our Newsletters (Subject-wise). Participate in the Sanfoundry Certification contest to get free Certificate of Merit. Join our social networks below and stay updated with latest contests, videos, internships and jobs!

Youtube | Telegram | LinkedIn | Instagram | Facebook | Twitter | Pinterest
Manish Bhojasia - Founder & CTO at Sanfoundry
Manish Bhojasia, a technology veteran with 20+ years @ Cisco & Wipro, is Founder and CTO at Sanfoundry. He lives in Bangalore, and focuses on development of Linux Kernel, SAN Technologies, Advanced C, Data Structures & Alogrithms. Stay connected with him at LinkedIn.

Subscribe to his free Masterclasses at Youtube & discussions at Telegram SanfoundryClasses.