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