MaiaBertogna.java 3.8 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;

/**
 * MaiaBertogna
 */
public class MaiaBertogna extends AbstractTest {

19
    public MaiaBertogna(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 45 46 47
    }

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

    private long calculateResponseTime(Task task) {
        long minimumWcet = getMinimumWcet(task);
        long responseTime = minimumWcet;
        long previousResponseTime = 0;

        do {
            previousResponseTime = responseTime;
48
            long taskInterference = 0;
49

50
            for (Task t : tasks) {
51 52 53
                if (t.getPeriod() < task.getPeriod()) {
                    long maxNumberOfJobsOfT = t.getMaximumParallelism();
                    for (int p = 0; p < maxNumberOfJobsOfT; ++p) {
54
                        taskInterference += Math.min(getTaskInterference(t, responseTime, p + 1),
55 56 57 58 59 60 61 62 63 64 65 66 67
                                responseTime - minimumWcet + 1);
                    }
                }
            }

            long selfInterference = 0;

            long maxNumberOfJobs = task.getMaximumParallelism();
            for (int p = 0; p < maxNumberOfJobs; ++p) {
                selfInterference +=
                        Math.min(getSelfInterference(task, p + 1), responseTime - minimumWcet + 1);
            }

68 69
            long totalInterference = LongMath.divide(taskInterference + selfInterference,
                    systemSetup.getNumberOfProcessors(), RoundingMode.FLOOR);
70 71 72 73 74 75 76 77 78 79 80 81 82

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


        return responseTime;
    }

    private long getSelfInterference(Task task, long parallelism) {
        long interference = 0;

        for (Segment s : task.getSegments()) {
            if (s.getNumberOfJobs() >= parallelism + 1) {
83
                interference += s.getJobWcet();
84 85 86 87 88 89 90
            }
        }

        return interference;
    }

    private long getTaskInterference(Task task, long interval, long parallelism) {
91
        if (responseTimes.containsKey(task)) {
92
            long responseTime = responseTimes.get(task).getResponseTime();
93 94 95 96 97 98 99 100 101 102 103 104
            long minWcet = getMinimumWcet(task);
            long period = task.getPeriod();
            long numberOfJobs =
                    (LongMath.divide(interval + responseTime - minWcet, period, RoundingMode.FLOOR)
                            + 1);

            long workload = 0;

            for (Segment s : task.getSegments()) {
                if (s.getNumberOfJobs() >= parallelism) {
                    workload += s.getJobWcet();
                }
105 106
            }

107
            long interference = numberOfJobs * workload;
108

109 110 111 112
            return interference;
        } else {
            throw new RuntimeException("Task was not found in task set!");
        }
113 114 115 116 117 118 119 120 121 122 123 124
    }

    private long getMinimumWcet(Task task) {
        long minWcet = 0;
        for (Segment s : task.getSegments()) {
            minWcet += s.getJobWcet();
        }

        return minWcet;
    }

}