Skip to content

Commit 7373d28

Browse files
Update Preemptive&NonPreemptiveScheduling.java
1 parent 3994db1 commit 7373d28

File tree

1 file changed

+140
-160
lines changed

1 file changed

+140
-160
lines changed
Lines changed: 140 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -1,217 +1,197 @@
1-
import java.util.*;
2-
3-
class SchedulingAlgorithms
4-
{
5-
6-
static class Process
7-
{
8-
int pid;
9-
int priority;
10-
int arrivalTime;
11-
int burstTime;
12-
int remainingTime;
13-
int completionTime;
14-
int waitingTime;
15-
int turnaroundTime;
16-
int responseTime;
17-
boolean completed;
18-
19-
Process(int pid, int priority, int arrivalTime, int burstTime)
20-
{
1+
import java.util.Scanner;
2+
import java.util.Arrays;
3+
import java.util.Comparator;
4+
5+
class SchedulingAlgorithms {
6+
static class Process {
7+
private int pid;
8+
private int priority;
9+
private int arrivalTime;
10+
private int burstTime;
11+
private int remainingTime;
12+
private int completionTime;
13+
private int waitingTime;
14+
private int turnaroundTime;
15+
private int responseTime;
16+
17+
Process(int pid, int priority, int arrivalTime, int burstTime) {
2118
this.pid = pid;
2219
this.priority = priority;
2320
this.arrivalTime = arrivalTime;
2421
this.burstTime = burstTime;
2522
this.remainingTime = burstTime;
26-
this.completed = false;
23+
this.responseTime = -1;
2724
}
25+
public int getPid() { return pid; }
26+
public int getPriority() { return priority; }
27+
public int getArrivalTime() { return arrivalTime; }
28+
public int getBurstTime() { return burstTime; }
29+
public int getRemainingTime() { return remainingTime; }
30+
public int getCompletionTime() { return completionTime; }
31+
public int getWaitingTime() { return waitingTime; }
32+
public int getTurnaroundTime() { return turnaroundTime; }
33+
public int getResponseTime() { return responseTime; }
34+
35+
public void setRemainingTime(int remainingTime) { this.remainingTime = remainingTime; }
36+
public void setCompletionTime(int completionTime) { this.completionTime = completionTime; }
37+
public void setWaitingTime(int waitingTime) { this.waitingTime = waitingTime; }
38+
public void setTurnaroundTime(int turnaroundTime) { this.turnaroundTime = turnaroundTime; }
39+
public void setResponseTime(int responseTime) { this.responseTime = responseTime; }
2840
}
2941

30-
public static void main(String[] args)
31-
{
32-
Scanner sc = new Scanner(System.in);
33-
34-
System.out.print("Enter number of processes: ");
35-
int n = sc.nextInt();
36-
37-
Process[] processes = new Process[n];
38-
for (int i = 0; i < n; i++)
39-
{
40-
System.out.println("Process " + (i + 1));
41-
System.out.print("Enter arrival time: ");
42-
int at = sc.nextInt();
43-
System.out.print("Enter burst time: ");
44-
int bt = sc.nextInt();
45-
System.out.print("Enter priority (integer): ");
46-
int priority = sc.nextInt();
47-
processes[i] = new Process(i + 1, priority, at, bt);
48-
}
42+
public static void main(String[] args) {
43+
try (Scanner sc = new Scanner(System.in)) {
44+
System.out.print("Enter number of processes: ");
45+
int n = sc.nextInt();
46+
47+
Process[] processes = new Process[n];
48+
for (int i = 0; i < n; i++) {
49+
System.out.println("Process " + (i + 1));
50+
System.out.print("Enter arrival time: ");
51+
int at = sc.nextInt();
52+
System.out.print("Enter burst time: ");
53+
int bt = sc.nextInt();
54+
System.out.print("Enter priority (integer): ");
55+
int priority = sc.nextInt();
56+
processes[i] = new Process(i + 1, priority, at, bt);
57+
}
4958

50-
System.out.println("Choose the scheduling algorithm:");
51-
System.out.println("1. Non-Preemptive");
52-
System.out.println("2. Preemptive");
53-
System.out.print("Enter your choice (1 or 2): ");
54-
int choice = sc.nextInt();
55-
56-
switch (choice)
57-
{
58-
case 1:
59-
nonPreemptive(processes);
60-
break;
61-
case 2:
62-
preemptive(processes);
63-
break;
64-
default:
65-
System.out.println("Invalid choice.");
66-
return;
59+
System.out.println("\nChoose the scheduling algorithm:");
60+
System.out.println("1. Non-Preemptive (Shortest Job First with Priority)");
61+
System.out.println("2. Preemptive (Shortest Remaining Time First)");
62+
System.out.print("Enter your choice (1 or 2): ");
63+
int choice = sc.nextInt();
64+
65+
switch (choice) {
66+
case 1:
67+
nonPreemptive(processes);
68+
break;
69+
case 2:
70+
preemptive(processes);
71+
break;
72+
default:
73+
System.out.println("Invalid choice. Exiting.");
74+
return;
75+
}
6776
}
6877
}
69-
70-
private static void nonPreemptive(Process[] processes)
71-
{
78+
79+
private static void nonPreemptive(Process[] processes) {
7280
int n = processes.length;
73-
int completed = 0;
81+
int completedProcesses = 0;
7482
int currentTime = 0;
7583
boolean[] isCompleted = new boolean[n];
7684

77-
while (completed != n)
78-
{
79-
int idx = -1;
80-
int minBurst = Integer.MAX_VALUE;
81-
for (int i = 0; i < n; i++)
82-
{
83-
if ((processes[i].arrivalTime <= currentTime) && !isCompleted[i])
84-
{
85-
if (processes[i].burstTime < minBurst)
86-
{
87-
minBurst = processes[i].burstTime;
88-
idx = i;
89-
}
90-
if (processes[i].burstTime == minBurst)
91-
{
92-
if (processes[i].priority < processes[idx].priority)
93-
{
94-
idx = i;
85+
while (completedProcesses < n) {
86+
int selectedProcessIndex = -1;
87+
int minBurstTime = Integer.MAX_VALUE;
88+
int highestPriority = Integer.MAX_VALUE;
89+
90+
for (int i = 0; i < n; i++) {
91+
if (processes[i].getArrivalTime() <= currentTime && !isCompleted[i]) {
92+
if (processes[i].getBurstTime() < minBurstTime) {
93+
minBurstTime = processes[i].getBurstTime();
94+
highestPriority = processes[i].getPriority();
95+
selectedProcessIndex = i;
96+
}
97+
else if (processes[i].getBurstTime() == minBurstTime) {
98+
if (processes[i].getPriority() < highestPriority) {
99+
highestPriority = processes[i].getPriority();
100+
selectedProcessIndex = i;
95101
}
96102
}
97103
}
98104
}
99105

100-
if (idx != -1)
101-
{
102-
processes[idx].waitingTime = currentTime - processes[idx].arrivalTime;
103-
currentTime += processes[idx].burstTime;
104-
processes[idx].completionTime = currentTime;
105-
processes[idx].turnaroundTime = processes[idx].completionTime - processes[idx].arrivalTime;
106-
processes[idx].responseTime = processes[idx].waitingTime;
107-
isCompleted[idx] = true;
108-
completed++;
109-
}
110-
else
111-
{
106+
if (selectedProcessIndex != -1) {
107+
Process currentProcess = processes[selectedProcessIndex];
108+
109+
if (currentProcess.getResponseTime() == -1) {
110+
currentProcess.setResponseTime(currentTime - currentProcess.getArrivalTime());
111+
}
112+
113+
currentProcess.setWaitingTime(currentTime - currentProcess.getArrivalTime());
114+
currentTime += currentProcess.getBurstTime();
115+
currentProcess.setCompletionTime(currentTime);
116+
currentProcess.setTurnaroundTime(currentProcess.getCompletionTime() - currentProcess.getArrivalTime());
117+
118+
isCompleted[selectedProcessIndex] = true;
119+
completedProcesses++;
120+
} else {
112121
currentTime++;
113122
}
114123
}
115124

116-
printResults(processes, "Non-Preemptive SJF (Shortest Job First) Scheduling");
125+
printResults(processes, "Non-Preemptive SJF (with Priority) Scheduling");
117126
}
118127

119-
private static void preemptive(Process[] processes)
120-
{
128+
private static void preemptive(Process[] processes) {
121129
int n = processes.length;
122-
int completed = 0;
130+
int completedProcesses = 0;
123131
int currentTime = 0;
124-
int minRemainingTime;
125-
int shortest = -1;
126-
boolean check = false;
127-
128-
int[] waitingTime = new int[n];
129-
int[] turnaroundTime = new int[n];
130-
int[] completionTime = new int[n];
131-
int[] responseTime = new int[n];
132-
133-
int[] remainingTime = new int[n];
134-
for (int i = 0; i < n; i++)
135-
{
136-
remainingTime[i] = processes[i].burstTime;
137-
}
138132

139-
while (completed != n)
140-
{
141-
minRemainingTime = Integer.MAX_VALUE;
142-
shortest = -1;
143-
check = false;
144-
145-
for (int i = 0; i < n; i++)
146-
{
147-
if ((processes[i].arrivalTime <= currentTime) &&
148-
(remainingTime[i] < minRemainingTime) && ( remainingTime[i] > 0))
149-
{
150-
minRemainingTime = remainingTime[i];
151-
shortest = i;
152-
check = true;
133+
while (completedProcesses < n) {
134+
int shortestJobIndex = -1;
135+
int minRemainingTime = Integer.MAX_VALUE;
136+
137+
for (int i = 0; i < n; i++) {
138+
if (processes[i].getArrivalTime() <= currentTime && processes[i].getRemainingTime() > 0) {
139+
if (processes[i].getRemainingTime() < minRemainingTime) {
140+
minRemainingTime = processes[i].getRemainingTime();
141+
shortestJobIndex = i;
142+
}
153143
}
154144
}
155145

156-
if (!check)
157-
{
146+
if (shortestJobIndex == -1) {
158147
currentTime++;
159148
continue;
160149
}
161150

162-
if (responseTime[shortest] == 0)
163-
{
164-
responseTime[shortest] = currentTime - processes[shortest].arrivalTime;
151+
Process currentProcess = processes[shortestJobIndex];
152+
153+
if (currentProcess.getResponseTime() == -1) {
154+
currentProcess.setResponseTime(currentTime - currentProcess.getArrivalTime());
165155
}
166156

167-
remainingTime[shortest]--;
157+
currentProcess.setRemainingTime(currentProcess.getRemainingTime() - 1);
168158
currentTime++;
169159

170-
if (remainingTime[shortest] == 0)
171-
{
172-
completed++;
173-
completionTime[shortest] = currentTime;
174-
turnaroundTime[shortest] = completionTime[shortest] - processes[shortest].arrivalTime;
175-
waitingTime[shortest] = turnaroundTime[shortest] - processes[shortest].burstTime;
176-
if (waitingTime[shortest] < 0)
177-
{
178-
waitingTime[shortest] = 0;
160+
if (currentProcess.getRemainingTime() == 0) {
161+
completedProcesses++;
162+
currentProcess.setCompletionTime(currentTime);
163+
currentProcess.setTurnaroundTime(currentProcess.getCompletionTime() - currentProcess.getArrivalTime());
164+
currentProcess.setWaitingTime(currentProcess.getTurnaroundTime() - currentProcess.getBurstTime());
165+
166+
if (currentProcess.getWaitingTime() < 0) {
167+
currentProcess.setWaitingTime(0);
179168
}
180169
}
181170
}
182171

183-
for (int i = 0; i < n; i++)
184-
{
185-
processes[i].completionTime = completionTime[i];
186-
processes[i].turnaroundTime = turnaroundTime[i];
187-
processes[i].waitingTime = waitingTime[i];
188-
processes[i].responseTime = responseTime[i];
189-
}
190-
191-
printResults(processes, "Preemptive SRTF (Shortest Remaining Time First) Scheduling");
172+
printResults(processes, "Preemptive SRTF Scheduling");
192173
}
193174

194-
private static void printResults(Process[] processes, String title)
195-
{
175+
private static void printResults(Process[] processes, String title) {
196176
System.out.println("\n" + title);
197177
System.out.printf("%-10s%-10s%-15s%-15s%-17s%-15s%-17s%-15s\n",
198-
"Process", "Priority", "Arrival Time", "Burst Time",
199-
"Completion Time", "Waiting Time", "Turnaround Time", "Response Time\n");
178+
"Process", "Priority", "Arrival Time", "Burst Time",
179+
"Completion Time", "Waiting Time", "Turnaround Time", "Response Time");
200180

201181
double totalWT = 0, totalTAT = 0;
202182

203-
Arrays.sort(processes, (a, b) -> a.pid - b.pid);
183+
Comparator<Process> byPid = (p1, p2) -> Integer.compare(p1.getPid(), p2.getPid());
184+
Arrays.sort(processes, byPid);
204185

205-
for (Process p : processes)
206-
{
207-
totalWT += p.waitingTime;
208-
totalTAT += p.turnaroundTime;
186+
for (Process p : processes) {
187+
totalWT += p.getWaitingTime();
188+
totalTAT += p.getTurnaroundTime();
209189
System.out.printf("%-10d%-10d%-15d%-15d%-17d%-15d%-17d%-15d\n",
210-
p.pid, p.priority, p.arrivalTime, p.burstTime,
211-
p.completionTime, p.waitingTime, p.turnaroundTime, p.responseTime);
190+
p.getPid(), p.getPriority(), p.getArrivalTime(), p.getBurstTime(),
191+
p.getCompletionTime(), p.getWaitingTime(), p.getTurnaroundTime(), p.getResponseTime());
212192
}
213193

214-
System.out.printf("Average Waiting Time: %.2f\n", totalWT / processes.length);
194+
System.out.printf("\nAverage Waiting Time: %.2f\n", totalWT / processes.length);
215195
System.out.printf("Average Turnaround Time: %.2f\n", totalTAT / processes.length);
216196
}
217-
}
197+
}

0 commit comments

Comments
 (0)