From 62bdec461f8ad4e7f6bf42d6553ac1c6e45a1c53 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Thu, 13 Oct 2022 12:49:54 +0100 Subject: [PATCH] Adds FCFS scheduling algorithm. --- os/code/os/pom.xml | 13 +++-- .../scheduling/FirstComeFirstServe.java | 41 +++++++++++++ .../scheduling/models/IncomingProcess.java | 22 +++++++ .../scheduling/models/ScheduledProcess.java | 16 ++++++ .../scheduling/FirstComeFirstServeTest.java | 57 +++++++++++++++++++ 5 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 os/code/os/src/main/java/com/scaler/scheduling/FirstComeFirstServe.java create mode 100644 os/code/os/src/main/java/com/scaler/scheduling/models/IncomingProcess.java create mode 100644 os/code/os/src/main/java/com/scaler/scheduling/models/ScheduledProcess.java create mode 100644 os/code/os/src/test/java/com/scaler/scheduling/FirstComeFirstServeTest.java diff --git a/os/code/os/pom.xml b/os/code/os/pom.xml index 6425d7c..ff48b0e 100644 --- a/os/code/os/pom.xml +++ b/os/code/os/pom.xml @@ -1,7 +1,6 @@ - + 4.0.0 com.scaler @@ -31,10 +30,16 @@ 1.18.24 provided + + org.javatuples + javatuples + 1.2 + - + + @@ -78,4 +83,4 @@ - + \ No newline at end of file diff --git a/os/code/os/src/main/java/com/scaler/scheduling/FirstComeFirstServe.java b/os/code/os/src/main/java/com/scaler/scheduling/FirstComeFirstServe.java new file mode 100644 index 0000000..248b0e7 --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/scheduling/FirstComeFirstServe.java @@ -0,0 +1,41 @@ +package com.scaler.scheduling; + +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +import com.scaler.scheduling.models.IncomingProcess; +import com.scaler.scheduling.models.ScheduledProcess; + +public class FirstComeFirstServe { + + public List schedule(List processes) { + Queue queue = prepareQueue(processes); + List scheduledProcesses = new LinkedList<>(); + + int time = 0; + int index = 0; + while (!queue.isEmpty()) { + IncomingProcess process = queue.poll(); + time += process.getBurstTime(); + index += 1; + + process.setCompletedAt(time); + scheduledProcesses.add(new ScheduledProcess(index, process)); + } + + return scheduledProcesses; + } + + private Queue prepareQueue(List processes) { + Queue queue = new LinkedList<>(); + + List sortedProcesses = new LinkedList<>(processes); + sortedProcesses.sort((p1, p2) -> p1.getArrivalTime() - p2.getArrivalTime()); + + for (IncomingProcess process : sortedProcesses) { + queue.add(process); + } + return queue; + } +} \ No newline at end of file diff --git a/os/code/os/src/main/java/com/scaler/scheduling/models/IncomingProcess.java b/os/code/os/src/main/java/com/scaler/scheduling/models/IncomingProcess.java new file mode 100644 index 0000000..b9a8ab7 --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/scheduling/models/IncomingProcess.java @@ -0,0 +1,22 @@ +package com.scaler.scheduling.models; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +public class IncomingProcess { + private int id; + private int arrivalTime; + private int burstTime; + + private int completedAt; + + public IncomingProcess(int id, int arrivalTime, int burstTime) { + this.id = id; + this.arrivalTime = arrivalTime; + this.burstTime = burstTime; + } +} diff --git a/os/code/os/src/main/java/com/scaler/scheduling/models/ScheduledProcess.java b/os/code/os/src/main/java/com/scaler/scheduling/models/ScheduledProcess.java new file mode 100644 index 0000000..38db95e --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/scheduling/models/ScheduledProcess.java @@ -0,0 +1,16 @@ +package com.scaler.scheduling.models; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class ScheduledProcess { + + private int index; + private IncomingProcess process; + + public int getId() { + return process.getId(); + } +} diff --git a/os/code/os/src/test/java/com/scaler/scheduling/FirstComeFirstServeTest.java b/os/code/os/src/test/java/com/scaler/scheduling/FirstComeFirstServeTest.java new file mode 100644 index 0000000..03fc311 --- /dev/null +++ b/os/code/os/src/test/java/com/scaler/scheduling/FirstComeFirstServeTest.java @@ -0,0 +1,57 @@ +package com.scaler.scheduling; + +import static org.junit.Assert.assertEquals; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import org.javatuples.Pair; +import org.junit.Test; + +import com.scaler.scheduling.models.IncomingProcess; +import com.scaler.scheduling.models.ScheduledProcess; + +public class FirstComeFirstServeTest { + + private static AtomicInteger generator = new AtomicInteger(); + + private List> processTimes = List.of( + Pair.with(2, 6), + Pair.with(1, 8), + Pair.with(0, 3), + Pair.with(4, 4)); + + private List expectedOrder = List.of(3, 2, 1, 4); + private List expectedCompletionTimes = List.of(3, 11, 17, 21); + + @Test + public void test() { + FirstComeFirstServe firstComeFirstServe = new FirstComeFirstServe(); + List scheduledProcesses = firstComeFirstServe.schedule(incomingProcesses(processTimes)); + + assertEquals("If n processes are given, then n processes should be scheduled", processTimes.size(), + scheduledProcesses.size()); + + List actualOrder = scheduledProcesses.stream().map(ScheduledProcess::getId) + .collect(Collectors.toList()); + assertEquals("The order of the processes should be the same as the order of the input", expectedOrder, + actualOrder); + + List actualCompletionTimes = scheduledProcesses.stream().map(ScheduledProcess::getProcess) + .map(IncomingProcess::getCompletedAt) + .collect(Collectors.toList()); + + assertEquals("The completion time of the processes should be the same as the expected completion times", + expectedCompletionTimes, + actualCompletionTimes); + + } + + private static List incomingProcesses(List> processTimes) { + + return processTimes.stream() + .map(p -> new IncomingProcess(generator.incrementAndGet(), p.getValue0(), p.getValue1())) + .collect(Collectors.toList()); + } +}