JiangYi.java 3.15 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
package mvd.jester.tests;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import mvd.jester.info.SchedulingInfo;
import mvd.jester.info.SchedulingInfo.Feasiblity;
import mvd.jester.model.ContainerTask;
import mvd.jester.model.DagTask;
import mvd.jester.model.SortedTaskSet;
15
import mvd.jester.model.SystemManagerInterface;
16 17 18 19 20 21 22 23
import mvd.jester.model.Task;
import mvd.jester.priority.EarliestDeadlineFirst;
import mvd.jester.priority.PriorityManager;

public class JiangYi extends AbstractTest<DagTask> {

    private final EarliestDeadlineFirst priorityManager;

24
    public JiangYi(SystemManagerInterface manager) {
25 26 27 28 29 30 31 32 33 34 35 36
        super(manager);
        this.priorityManager = new EarliestDeadlineFirst();
    }



    @Override
    public SchedulingInfo runSchedulabilityCheck(SortedTaskSet<DagTask> tasks) {
        Set<DagTask> heavyTasks = new HashSet<>();
        Set<Task> lightTasks = new HashSet<>();

        for (DagTask t : tasks) {
37
            if (t.getDensity() < 1) {
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
                lightTasks.add(t);
            } else {
                heavyTasks.add(t);
            }
        }

        long remainingProcessors = manager.getNumberOfProcessors();

        for (DagTask t : heavyTasks) {
            double processingCapacity = ((double) t.getWorkload() - t.getCriticalPath())
                    / (t.getDeadline() - t.getCriticalPath());
            long minimumProcessingCapacity = (long) Math.floor(processingCapacity);
            if (remainingProcessors < minimumProcessingCapacity) {
                return new SchedulingInfo(Feasiblity.FAILED);
            }
            remainingProcessors -= minimumProcessingCapacity;

            double loadBound = processingCapacity - minimumProcessingCapacity;

            lightTasks.add(new ContainerTask(t.getPeriod(), t.getDeadline(), loadBound));
        }

        return scheduleLightTasks(lightTasks, remainingProcessors);
    }

    private SchedulingInfo scheduleLightTasks(Set<Task> tasks, long numberOfprocessors) {
        if (numberOfprocessors == 0 && tasks.size() > 0) {
            return new SchedulingInfo(Feasiblity.FAILED);
        }
        List<Task> taskList = new LinkedList<>(tasks);
        Collections.sort(taskList, (a, b) -> Double.compare(b.getDensity(), a.getDensity()));
        List<Double> bins = new ArrayList<>();

        for (int i = 0; i < numberOfprocessors; ++i) {
            bins.add((double) 0);
        }
74

75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
        Iterator<Task> taskIterator = taskList.iterator();
        while (taskIterator.hasNext()) {
            Collections.sort(bins);
            Task t = taskIterator.next();
            taskIterator.remove();
            if (bins.get(0) + t.getDensity() <= 1) {
                bins.set(0, bins.get(0) + t.getDensity());
            } else {
                return new SchedulingInfo(Feasiblity.FAILED);
            }

        }

        return new SchedulingInfo(Feasiblity.SUCCEEDED);
    }


    @Override
    public PriorityManager getPriorityManager() {
        return priorityManager;
    }

    @Override
    public String getName() {
        return "JiangYi";
    }

}