SchmidMottok.java 4.2 KB
Newer Older
1 2 3
package mvd.jester.tests;

import java.math.RoundingMode;
4
import java.util.HashSet;
5
import com.google.common.math.LongMath;
6 7
import mvd.jester.info.SchedulingInfo;
import mvd.jester.info.TerminationInfo;
8
import mvd.jester.model.Segment;
9
import mvd.jester.model.SortedTaskSet;
10
import mvd.jester.model.Task;
11
import mvd.jester.priority.PriorityManager;
12 13 14 15 16 17 18
import mvd.jester.model.SystemSetup;

/**
 * SchmidMottok
 */
public class SchmidMottok extends AbstractTest {

19
    public SchmidMottok(SystemSetup systemSetup) {
20
        super(systemSetup);
21 22 23
    }

    @Override
24
    public SchedulingInfo runSchedulabilityCheck(PriorityManager priorityManager) {
25 26
        tasks = new SortedTaskSet(priorityManager);
        tasks.addAll(systemSetup.getTasks());
27
        responseTimes.clear();
28
        for (Task t : tasks) {
29 30
            long responseTime = calculateResponseTime(t);
            responseTimes.put(t, new TerminationInfo(0, t.getDeadline(), responseTime));
31 32
        }

33
        return new SchedulingInfo(new HashSet<>(responseTimes.values()));
34 35 36 37 38 39 40 41 42 43 44
    }

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

    private long calculateResponseTime(Task task) {
        long minimumWcet = getMinimumWcet(task);
        long responseTime = minimumWcet;
        long previousResponseTime = 0;
Michael Schmid committed
45
        long numberOfProcessors = systemSetup.getNumberOfProcessors();
46 47 48

        do {
            previousResponseTime = responseTime;
49
            double taskInterference = 0;
50

51
            for (Task t : tasks) {
52
                if (t.getPeriod() < task.getPeriod()) {
53 54 55 56 57
                    long numberOfJobs =
                            t.getMaximumParallelism() > numberOfProcessors ? numberOfProcessors
                                    : t.getMaximumParallelism();
                    for (int p = 0; p < numberOfJobs; ++p) {
                        taskInterference += Math.min(getTaskInterference(t, responseTime, p + 1),
Michael Schmid committed
58 59
                                responseTime - minimumWcet + 1);
                    }
60 61 62
                }
            }

63
            taskInterference /= numberOfProcessors;
64 65 66 67 68 69 70 71 72 73 74 75 76
            double selfInterference = getSelfInterference(task);

            long totalInterference = (long) Math.floor(taskInterference + selfInterference);

            responseTime = minimumWcet + totalInterference;
        } while (previousResponseTime != responseTime);

        return responseTime;
    }


    private double getSelfInterference(Task task) {
        double interference = 0;
77
        long numberOfProcessors = systemSetup.getNumberOfProcessors();
78 79
        long numberOfJobs = task.getMaximumParallelism() > numberOfProcessors ? numberOfProcessors
                : task.getMaximumParallelism();
80 81

        for (Segment s : task.getSegments()) {
82
            interference += (double) (s.getNumberOfTasklets() - 1) * s.getTaskletWcet();
83 84
        }

85 86
        interference /= numberOfJobs;

87 88 89
        return interference;
    }

Michael Schmid committed
90 91 92

    private double getTaskInterference(Task task, long interval, long parallelism) {
        if (responseTimes.containsKey(task)) {
93
            long responseTime = responseTimes.get(task).getResponseTime();
Michael Schmid committed
94 95
            long minWcet = getMinimumWcet(task);
            long period = task.getPeriod();
96
            long numberOfProcessors = systemSetup.getNumberOfProcessors();
Michael Schmid committed
97 98 99 100 101 102 103
            long amountOfJobs =
                    (LongMath.divide(interval + responseTime - minWcet, period, RoundingMode.FLOOR)
                            + 1);

            double workload = 0;

            for (Segment s : task.getSegments()) {
104
                long numberOfJobs = s.getNumberOfJobs() > numberOfProcessors ? numberOfProcessors
Michael Schmid committed
105 106 107 108 109
                        : s.getNumberOfJobs();
                if (numberOfJobs >= parallelism) {
                    workload += s.getNumberOfTasklets() * s.getTaskletWcet() / numberOfJobs;
                }
            }
110

Michael Schmid committed
111 112 113 114 115 116
            double interference = amountOfJobs * workload;

            return interference;
        } else {
            throw new RuntimeException("Task was not found in task set!");
        }
117 118 119 120
    }

    private long getMinimumWcet(Task task) {
        long minWcet = 0;
121

122 123 124 125 126 127 128 129
        for (Segment s : task.getSegments()) {
            minWcet += s.getTaskletWcet();
        }

        return minWcet;
    }

}