From 9bc57289db82f6ed7b627ec333cc00a9d69b7bee Mon Sep 17 00:00:00 2001 From: NilsVreman <nils.vreman@gmail.com> Date: Tue, 11 Feb 2020 14:48:29 +0100 Subject: [PATCH] Added DMS and fixed RMS --- TODO.md | 3 +- gui/menu/DMSStrategyMenuItem.java | 10 +++++ gui/menu/ScheduLearnMenuBar.java | 1 + strategy/DMS.java | 62 +++++++++++++++++++++++++++++++ strategy/DMSComparator.java | 30 +++++++++++++++ strategy/RMS.java | 10 +++-- 6 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 gui/menu/DMSStrategyMenuItem.java create mode 100644 strategy/DMS.java create mode 100644 strategy/DMSComparator.java diff --git a/TODO.md b/TODO.md index b40d0e9..5e3a858 100644 --- a/TODO.md +++ b/TODO.md @@ -3,13 +3,14 @@ ## TODO 1. Write "Help" documentation 2. Change save to include model -3. Fix RMS. Does not work with taskset in exc 6.4 +3. Fix QueueStrategy to avoid coupled code (duplicate in all sub-strategies) ## FIXED 1. Fix issue with taskset not arranging correctly when tasks are added before scheduling algorithm is choosen. *FIXED* 2. Fix Strategy-based priority assignment *FIXED* 3. Make space between buttons on left and the taskset-list. *FIXED* 1. EDF IS STILL WRONG :( Take into consideration distance to deadline, not just deadline size. *FIXED* +3. Added DMS and fixed RMS *FIXED* ## SUGGESTIONS *- Add Task, Change Task, Remove Task på samma rad* diff --git a/gui/menu/DMSStrategyMenuItem.java b/gui/menu/DMSStrategyMenuItem.java new file mode 100644 index 0000000..fc19a9f --- /dev/null +++ b/gui/menu/DMSStrategyMenuItem.java @@ -0,0 +1,10 @@ +package gui.menu; + +import model.SchedulingModel; +import strategy.DMS; + +public class DMSStrategyMenuItem extends StrategyMenuItem { + public DMSStrategyMenuItem(SchedulingModel scheduleMdl) { + super(scheduleMdl, new DMS(), "DMS"); + } +} diff --git a/gui/menu/ScheduLearnMenuBar.java b/gui/menu/ScheduLearnMenuBar.java index dc1e5cd..1369ee5 100644 --- a/gui/menu/ScheduLearnMenuBar.java +++ b/gui/menu/ScheduLearnMenuBar.java @@ -29,6 +29,7 @@ public class ScheduLearnMenuBar extends JMenuBar { strategy.add(new FPStrategyMenuItem(scheduleMdl)); strategy.add(new EDFStrategyMenuItem(scheduleMdl)); strategy.add(new RMSStrategyMenuItem(scheduleMdl)); + strategy.add(new DMSStrategyMenuItem(scheduleMdl)); add(file); add(edit); diff --git a/strategy/DMS.java b/strategy/DMS.java new file mode 100644 index 0000000..7d973ee --- /dev/null +++ b/strategy/DMS.java @@ -0,0 +1,62 @@ +package strategy; + +import tasks.Taskset; +import tasks.Task; + +import java.util.Comparator; +import java.util.Queue; +import java.util.PriorityQueue; +import java.util.Map; +import java.util.HashMap; + +/* + * class DMS extends QueueStrategy + * + * A Deadline monotonic scheduling class + */ +public class DMS extends QueueStrategy { + + /* + * Return: Current version of the ready queue according to the DMS strategy + */ + protected Queue<Integer> updateQueue(Queue<Integer> q, Taskset ts, int time) { + // Lambda creation of complex comparator down below + // compares deadline first and then priority + Comparator<Integer> order = + (Integer i1, Integer i2) -> { + int res = ts.getTask(i1).get().deadline() - ts.getTask(i2).get().deadline(); + if ( res == 0 ) return i1 - i2; + else return res; + }; + + // Create new Q that uses order comparator and move all current tasks to that Q + Queue<Integer> internalQ = new PriorityQueue<>(order); + while (q.size() != 0) internalQ.add(q.poll()); + + //If we are at a job release, add that much CPU usage to the Q. + for (int taskNbr : ts.getPriorities()) { + Task t = ts.getTask(taskNbr).get(); //I know it exists so I can collect it from the optional directly + if (time % t.period() == 0) { + for (int i = 0; i < t.exectime(); i++) { + internalQ.add(taskNbr); + } + } + } + + return internalQ; + } + + /* + * Return which Strategy you are using + */ + public String toString() { + return "DMS"; + } + + /* + * Return a Comparator for this scheduling strategy + */ + public Comparator<Task> prioComparator() { + return new DMSComparator(); + } +} diff --git a/strategy/DMSComparator.java b/strategy/DMSComparator.java new file mode 100644 index 0000000..388e6fe --- /dev/null +++ b/strategy/DMSComparator.java @@ -0,0 +1,30 @@ +package strategy; + +import tasks.Task; + +/* + * class DMSComparator implements PriorityComparator: + * + * A comparator class for the Deadline Monotonic Scheduling + */ +public class DMSComparator implements PriorityComparator { + + /* + * Method compare: + * compares two tasks according to scheduling algorithm. + * + * @param: + * o1 (Object): first object + * o2 (Object): second object + * @return: + * int: comparator output + */ + public int compare(Object o1, Object o2) { + Task t1 = (Task) o1; + Task t2 = (Task) o2; + if (t1.deadline() == t2.deadline()) { + return t1.period() - t2.period(); + } + return t1.deadline() - t2.deadline(); + } +} diff --git a/strategy/RMS.java b/strategy/RMS.java index 04d5047..ad3af89 100644 --- a/strategy/RMS.java +++ b/strategy/RMS.java @@ -16,10 +16,14 @@ public class RMS extends QueueStrategy { */ protected Queue<Integer> updateQueue(Queue<Integer> q, Taskset ts, int time) { //Create new Q that uses order comparator and move all current tasks to that Q + //Compares period first and then priority Comparator<Integer> order = - (Integer i1, Integer i2)-> - ts.getTask(i1).get().period() - time % ts.getTask(i1).get().period() - - (ts.getTask(i2).get().period() - time % ts.getTask(i2).get().period()); + (Integer i1, Integer i2)->{ + int res = ts.getTask(i1).get().period() - ts.getTask(i2).get().period(); + if (res == 0) return i1 - i2; + else return res; + }; + //NOTE: ADD PRIORITY COMPARISON // Queue<Integer> internalQ = new PriorityQueue<>(order); while (q.size() != 0) internalQ.add(q.poll()); -- GitLab