In: Computer Science
IN JAVA
Implement SJF scheduling algorithms based on following actions:
The simulation maintains the current time, t, which is initialized to 0 and is incremented after each simulation step. Each simulation step then consists of the following actions:
repeat until Rᵢ == 0 for all n processes /* repeat until all
processes have terminated */
while no process is active, increment t /* if no process is ready
to run, just advance t */
choose active processes pᵢ to run next
according to scheduling algorithm /* Ex: FIFO, SJF, SRT */
decrement Rᵢ /* pᵢ has accumulated 1 CPU time unit */
if Rᵢ == 0 /* process i has terminated */
set active flag of pᵢ = 0 /* process i is excluded from further
consideration */
TTᵢ = t - Aᵢ /* the turnaround time of process i is the time
since arrival, TTᵢ, until the current time t */
compute the average turnaround time,
ATT, by averaging all values TTᵢ
class Process
{
    int
pid;
    int
bt;
    int
art;
     
    public
Process(int pid,
int bt, int
art)
    {
        this.pid
= pid;
        this.bt
= bt;
        this.art
= art;
    }
}
public class GFG
{
    
    static
void findWaitingTime(Process proc[],
int n,
                                     int
wt[])
    {
        int
rt[] = new
int[n];
        for
(int i =
0; i < n; i++)
            rt[i]
= proc[i].bt;
      
        int
complete = 0, t =
0, minm = Integer.MAX_VALUE;
        int
shortest = 0,
finish_time;
        boolean
check = false;
        while
(complete != n)
            for
(int j =
0; j < n; j++)
            {
                if
((proc[j].art <= t) &&
                  (rt[j]
< minm) && rt[j] > 0)
{
                    minm
= rt[j];
                    shortest
= j;
                    check
= true;
                }
            }
      
            if
(check == false) {
                t++;
                continue;
            }
      
            
            rt[shortest]--;
            minm
= rt[shortest];
            if
(minm == 0)
                minm
= Integer.MAX_VALUE;
            if
(rt[shortest] == 0) {
                complete++;
                check
= false;
                finish_time
= t + 1;
                wt[shortest]
= finish_time -
                             proc[shortest].bt
-
                             proc[shortest].art;
      
                if
(wt[shortest] < 0)
                    wt[shortest]
= 0;
            }
            t++;
        }
    }
      
    static
void findTurnAroundTime(Process proc[],
int n,
                            int
wt[], int tat[])
    {
        for
(int i =
0; i < n; i++)
            tat[i]
= proc[i].bt + wt[i];
    }
      
    static
void findavgTime(Process proc[],
int n)
    {
        int
wt[] = new int[n],
tat[] = new
int[n];
        int
total_wt = 0, total_tat =
0;
        findWaitingTime(proc,
n, wt);
        findTurnAroundTime(proc,
n, wt, tat);
        System.out.println("Processes
" +
                           "
Burst time " +
                           "
Waiting time " +
                           "
Turn around time");
        for
(int i =
0; i < n; i++) {
            total_wt
= total_wt + wt[i];
            total_tat
= total_tat + tat[i];
            System.out.println("
" + proc[i].pid + "\t\t"
                             +
proc[i].bt + "\t\t " + wt[i]
                             +
"\t\t" + tat[i]);
        }
      
        System.out.println("Average
waiting time = " +
                          (float)total_wt
/ (float)n);
        System.out.println("Average
turn around time = " +
                           (float)total_tat
/ (float)n);
    }
  
    public
static void main(String[]
args)
    {
         Process
proc[] = { new
Process(1,
6, 1),
                            new
Process(2,
8, 1),
                            new
Process(3,
7, 2),
                            new
Process(4,
3, 3)};
         
         findavgTime(proc,
proc.length);
    }
}