diff --git a/Others/SJF.java b/Others/SJF.java new file mode 100644 index 000000000000..923ece654939 --- /dev/null +++ b/Others/SJF.java @@ -0,0 +1,179 @@ +/** +*

Shortest job first.

+*

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 +* Shortest Job first has the advantage of having minimum average waiting time among all scheduling algorithms. +* It is a Greedy Algorithm. +* It may cause starvation if shorter processes keep coming. +* This problem has been solved using the concept of aging.

+* @author shivg7706 +* @since 2018/10/27 +*/ + +import java.util.Scanner; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.*; + +class Process { + + public int pid; + public int arrivalTime; + public int burstTime; + public int priority; + public int turnAroundTime; + public int waitTime; + public int remainingTime; +} + +class Schedule { + + private int noOfProcess; + private int timer = 0; + private ArrayList processes; + private ArrayList remainingProcess; + private ArrayList gantChart; + private float burstAll; + private Map> arrivals; + + Schedule() { + Scanner in = new Scanner(System.in); + + processes = new ArrayList(); + remainingProcess = new ArrayList(); + + gantChart = new ArrayList<>(); + arrivals = new HashMap<>(); + + System.out.print("Enter the no. of processes: "); + noOfProcess = in.nextInt(); + System.out.println("Enter the arrival, burst and priority of processes"); + for (int i = 0; i < noOfProcess; i++) { + Process p = new Process(); + p.pid = i; + p.arrivalTime = in.nextInt(); + p.burstTime = in.nextInt(); + p.priority = in.nextInt(); + p.turnAroundTime = 0; + p.waitTime = 0; + p.remainingTime = p.burstTime; + + if (arrivals.get(p.arrivalTime) == null) { + arrivals.put(p.arrivalTime, new ArrayList()); + } + arrivals.get(p.arrivalTime).add(p); + processes.add(p); + burstAll += p.burstTime; + } + + } + + + void startScheduling() { + + + processes.sort(new Comparator() { + @Override + public int compare (Process a, Process b) { + return a.arrivalTime - b.arrivalTime; + } + }); + + while(!(arrivals.size() == 0 && remainingProcess.size() == 0)) { + removeFinishedProcess(); + if(arrivals.get(timer) != null) { + remainingProcess.addAll(arrivals.get(timer)); + arrivals.remove(timer); + } + + remainingProcess.sort(new Comparator() { + private int alpha = 6; + private int beta = 1; + + @Override + public int compare (Process a, Process b) { + int aRem = a.remainingTime; + int bRem = b.remainingTime; + int aprior = a.priority; + int bprior = b.priority; + return (alpha*aRem + beta*aprior) - (alpha*bRem + beta*bprior); + } + }); + + int k = timeElapsed(timer); + ageing(k); + timer++; + } + + System.out.println("Total time required: " + (timer-1)); + } + + void removeFinishedProcess() { + ArrayList completed = new ArrayList(); + for (int i = 0; i < remainingProcess.size(); i++) { + if(remainingProcess.get(i).remainingTime == 0) { + completed.add(i); + } + } + + for (int i = 0; i < completed.size(); i++) { + int pid = remainingProcess.get(completed.get(i)).pid; + processes.get(pid).waitTime = remainingProcess.get(completed.get(i)).waitTime; + remainingProcess.remove(remainingProcess.get(completed.get(i))); + } + + + } + + public int timeElapsed(int i) { + if(!remainingProcess.isEmpty()) { + gantChart.add(i, remainingProcess.get(0).pid); + remainingProcess.get(0).remainingTime--; + return 1; + } + return 0; + } + + public void ageing(int k) { + for (int i = k; i < remainingProcess.size(); i++) { + remainingProcess.get(i).waitTime++; + if (remainingProcess.get(i).waitTime % 7 == 0) { + remainingProcess.get(i).priority--; + } + } + } + + + public void solve() { + System.out.println("Gant chart "); + for (int i = 0; i < gantChart.size(); i++) { + System.out.print(gantChart.get(i) + " "); + } + System.out.println(); + + float waitTimeTot = 0; + float tatTime = 0; + + for (int i = 0; i < noOfProcess; i++) { + processes.get(i).turnAroundTime = processes.get(i).waitTime + processes.get(i).burstTime; + + waitTimeTot += processes.get(i).waitTime; + tatTime += processes.get(i).turnAroundTime; + + System.out.println("Process no.: " + i + " Wait time: " + processes.get(i).waitTime + " Turn Around Time: " + processes.get(i).turnAroundTime); + } + + System.out.println("Average Waiting Time: " + waitTimeTot/noOfProcess); + System.out.println("Average TAT Time: " + tatTime/noOfProcess); + System.out.println("Throughput: " + (float)noOfProcess/(timer - 1)); + } + +} + +public class SJF { + public static void main(String[] args) { + Schedule s = new Schedule(); + s.startScheduling(); + s.solve(); + } +} \ No newline at end of file