Skip to content

Commit 2deeb8b

Browse files
authored
Merge pull request TheAlgorithms#599 from shivg7706/scheduling
added scheduling algorithm
2 parents 6341199 + 1e27a5d commit 2deeb8b

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed

Others/SJF.java

+179
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
/**
2+
* <h2>Shortest job first.</h2>
3+
* <p>Shortest job first (SJF) or shortest job next, is a scheduling policy
4+
* that selects the waiting process with the smallest execution time to execute next
5+
* Shortest Job first has the advantage of having minimum average waiting time among all scheduling algorithms.
6+
* It is a Greedy Algorithm.
7+
* It may cause starvation if shorter processes keep coming.
8+
* This problem has been solved using the concept of aging.</p>
9+
* @author shivg7706
10+
* @since 2018/10/27
11+
*/
12+
13+
import java.util.Scanner;
14+
import java.util.ArrayList;
15+
import java.util.Comparator;
16+
import java.util.*;
17+
18+
class Process {
19+
20+
public int pid;
21+
public int arrivalTime;
22+
public int burstTime;
23+
public int priority;
24+
public int turnAroundTime;
25+
public int waitTime;
26+
public int remainingTime;
27+
}
28+
29+
class Schedule {
30+
31+
private int noOfProcess;
32+
private int timer = 0;
33+
private ArrayList<Process> processes;
34+
private ArrayList<Process> remainingProcess;
35+
private ArrayList<Integer> gantChart;
36+
private float burstAll;
37+
private Map<Integer, ArrayList<Process>> arrivals;
38+
39+
Schedule() {
40+
Scanner in = new Scanner(System.in);
41+
42+
processes = new ArrayList<Process>();
43+
remainingProcess = new ArrayList<Process>();
44+
45+
gantChart = new ArrayList<>();
46+
arrivals = new HashMap<>();
47+
48+
System.out.print("Enter the no. of processes: ");
49+
noOfProcess = in.nextInt();
50+
System.out.println("Enter the arrival, burst and priority of processes");
51+
for (int i = 0; i < noOfProcess; i++) {
52+
Process p = new Process();
53+
p.pid = i;
54+
p.arrivalTime = in.nextInt();
55+
p.burstTime = in.nextInt();
56+
p.priority = in.nextInt();
57+
p.turnAroundTime = 0;
58+
p.waitTime = 0;
59+
p.remainingTime = p.burstTime;
60+
61+
if (arrivals.get(p.arrivalTime) == null) {
62+
arrivals.put(p.arrivalTime, new ArrayList<Process>());
63+
}
64+
arrivals.get(p.arrivalTime).add(p);
65+
processes.add(p);
66+
burstAll += p.burstTime;
67+
}
68+
69+
}
70+
71+
72+
void startScheduling() {
73+
74+
75+
processes.sort(new Comparator<Process>() {
76+
@Override
77+
public int compare (Process a, Process b) {
78+
return a.arrivalTime - b.arrivalTime;
79+
}
80+
});
81+
82+
while(!(arrivals.size() == 0 && remainingProcess.size() == 0)) {
83+
removeFinishedProcess();
84+
if(arrivals.get(timer) != null) {
85+
remainingProcess.addAll(arrivals.get(timer));
86+
arrivals.remove(timer);
87+
}
88+
89+
remainingProcess.sort(new Comparator<Process>() {
90+
private int alpha = 6;
91+
private int beta = 1;
92+
93+
@Override
94+
public int compare (Process a, Process b) {
95+
int aRem = a.remainingTime;
96+
int bRem = b.remainingTime;
97+
int aprior = a.priority;
98+
int bprior = b.priority;
99+
return (alpha*aRem + beta*aprior) - (alpha*bRem + beta*bprior);
100+
}
101+
});
102+
103+
int k = timeElapsed(timer);
104+
ageing(k);
105+
timer++;
106+
}
107+
108+
System.out.println("Total time required: " + (timer-1));
109+
}
110+
111+
void removeFinishedProcess() {
112+
ArrayList<Integer> completed = new ArrayList<Integer>();
113+
for (int i = 0; i < remainingProcess.size(); i++) {
114+
if(remainingProcess.get(i).remainingTime == 0) {
115+
completed.add(i);
116+
}
117+
}
118+
119+
for (int i = 0; i < completed.size(); i++) {
120+
int pid = remainingProcess.get(completed.get(i)).pid;
121+
processes.get(pid).waitTime = remainingProcess.get(completed.get(i)).waitTime;
122+
remainingProcess.remove(remainingProcess.get(completed.get(i)));
123+
}
124+
125+
126+
}
127+
128+
public int timeElapsed(int i) {
129+
if(!remainingProcess.isEmpty()) {
130+
gantChart.add(i, remainingProcess.get(0).pid);
131+
remainingProcess.get(0).remainingTime--;
132+
return 1;
133+
}
134+
return 0;
135+
}
136+
137+
public void ageing(int k) {
138+
for (int i = k; i < remainingProcess.size(); i++) {
139+
remainingProcess.get(i).waitTime++;
140+
if (remainingProcess.get(i).waitTime % 7 == 0) {
141+
remainingProcess.get(i).priority--;
142+
}
143+
}
144+
}
145+
146+
147+
public void solve() {
148+
System.out.println("Gant chart ");
149+
for (int i = 0; i < gantChart.size(); i++) {
150+
System.out.print(gantChart.get(i) + " ");
151+
}
152+
System.out.println();
153+
154+
float waitTimeTot = 0;
155+
float tatTime = 0;
156+
157+
for (int i = 0; i < noOfProcess; i++) {
158+
processes.get(i).turnAroundTime = processes.get(i).waitTime + processes.get(i).burstTime;
159+
160+
waitTimeTot += processes.get(i).waitTime;
161+
tatTime += processes.get(i).turnAroundTime;
162+
163+
System.out.println("Process no.: " + i + " Wait time: " + processes.get(i).waitTime + " Turn Around Time: " + processes.get(i).turnAroundTime);
164+
}
165+
166+
System.out.println("Average Waiting Time: " + waitTimeTot/noOfProcess);
167+
System.out.println("Average TAT Time: " + tatTime/noOfProcess);
168+
System.out.println("Throughput: " + (float)noOfProcess/(timer - 1));
169+
}
170+
171+
}
172+
173+
public class SJF {
174+
public static void main(String[] args) {
175+
Schedule s = new Schedule();
176+
s.startScheduling();
177+
s.solve();
178+
}
179+
}

0 commit comments

Comments
 (0)