MaiaBertogna.java 4.42 KB
Newer Older
1 2 3
package mvd.jester.tests;

import java.math.RoundingMode;
4 5
import java.util.HashMap;
import java.util.Map;
6
import java.util.Set;
7
import com.google.common.math.LongMath;
8 9
import mvd.jester.info.SchedulingInfo;
import mvd.jester.info.TerminationInfo;
10
import mvd.jester.model.Segment;
11
import mvd.jester.model.SortedTaskSet;
12
import mvd.jester.model.SynchronousTask;
Michael Schmid committed
13
import mvd.jester.model.SystemManager;
14
import mvd.jester.priority.PriorityManager;
15
import mvd.jester.priority.RateMonotonic;
16 17 18 19

/**
 * MaiaBertogna
 */
20
public class MaiaBertogna extends AbstractTest<SynchronousTask> {
21

22 23 24
    private final Map<SynchronousTask, TerminationInfo> responseTimes;
    private final PriorityManager priorityManager;

Michael Schmid committed
25 26
    public MaiaBertogna(final SystemManager manager) {
        super(manager);
27 28 29 30 31 32 33
        this.responseTimes = new HashMap<>();
        this.priorityManager = new RateMonotonic();
    }

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

    @Override
37
    public SchedulingInfo runSchedulabilityCheck(final SortedTaskSet<SynchronousTask> tasks) {
38
        responseTimes.clear();
39 40 41
        for (final SynchronousTask t : tasks) {
            final long responseTime = calculateResponseTime(tasks, t);
            responseTimes.put(t, new TerminationInfo(t.getDeadline(), responseTime));
42 43
        }

44
        return new SchedulingInfo(responseTimes.values());
45 46 47 48 49 50 51
    }

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

52 53 54
    private long calculateResponseTime(final Set<SynchronousTask> tasks,
            final SynchronousTask task) {
        final long minimumWcet = getMinimumWcet(task);
55 56 57 58 59
        long responseTime = minimumWcet;
        long previousResponseTime = 0;

        do {
            previousResponseTime = responseTime;
60
            long taskInterference = 0;
61

62
            for (final SynchronousTask t : tasks) {
63
                if (t.getPeriod() < task.getPeriod()) {
64
                    final long maxNumberOfJobsOfT = t.getMaximumParallelism();
65
                    for (int p = 0; p < maxNumberOfJobsOfT; ++p) {
66
                        taskInterference += Math.min(getTaskInterference(t, responseTime, p + 1),
67 68 69 70 71 72 73
                                responseTime - minimumWcet + 1);
                    }
                }
            }

            long selfInterference = 0;

74
            final long maxNumberOfJobs = task.getMaximumParallelism();
75 76 77 78 79
            for (int p = 0; p < maxNumberOfJobs; ++p) {
                selfInterference +=
                        Math.min(getSelfInterference(task, p + 1), responseTime - minimumWcet + 1);
            }

80
            final long totalInterference = LongMath.divide(taskInterference + selfInterference,
Michael Schmid committed
81
                    manager.getNumberOfProcessors(), RoundingMode.FLOOR);
82 83 84 85 86 87 88 89

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


        return responseTime;
    }

90
    private long getSelfInterference(final SynchronousTask task, final long parallelism) {
91 92
        long interference = 0;

93
        for (final Segment s : task.getWorkloadDistribution()) {
94
            if (s.getNumberOfJobs() >= parallelism + 1) {
95
                interference += s.getJobWcet();
96 97 98 99 100 101
            }
        }

        return interference;
    }

102 103
    private long getTaskInterference(final SynchronousTask task, final long interval,
            final long parallelism) {
104
        if (responseTimes.containsKey(task)) {
105 106 107 108
            final long responseTime = responseTimes.get(task).getResponseTime();
            final long minWcet = getMinimumWcet(task);
            final long period = task.getPeriod();
            final long numberOfJobs =
109 110 111 112 113
                    (LongMath.divide(interval + responseTime - minWcet, period, RoundingMode.FLOOR)
                            + 1);

            long workload = 0;

114
            for (final Segment s : task.getWorkloadDistribution()) {
115 116 117
                if (s.getNumberOfJobs() >= parallelism) {
                    workload += s.getJobWcet();
                }
118 119
            }

120
            final long interference = numberOfJobs * workload;
121

122 123 124 125
            return interference;
        } else {
            throw new RuntimeException("Task was not found in task set!");
        }
126 127
    }

128
    private long getMinimumWcet(final SynchronousTask task) {
129
        long minWcet = 0;
130
        for (final Segment s : task.getWorkloadDistribution()) {
131 132 133 134 135 136 137
            minWcet += s.getJobWcet();
        }

        return minWcet;
    }

}