ChwaLee.java 4.6 KB
Newer Older
1 2 3 4 5
package mvd.jester.tests;

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

/**
 * ChwaLee
 */
23
public class ChwaLee extends AbstractTest<SynchronousTask> {
24

25 26 27
    private final Map<SynchronousTask, TerminationInfo> responseTimes;
    private final PriorityManager priorityManager;

Michael Schmid committed
28 29
    public ChwaLee(final SystemManager manager) {
        super(manager);
30 31 32 33 34 35 36
        this.responseTimes = new HashMap<>();
        this.priorityManager = new EarliestDeadlineFirst();
    }

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

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

47
        return new SchedulingInfo(responseTimes.values());
48 49
    }

50 51 52 53
    private long calculateResponseTime(final Set<SynchronousTask> tasks,
            final SynchronousTask task) {
        final long minimumWcet = getMinimumWcet(task);
        final long deadline = task.getDeadline();
54 55 56

        long taskInterference = 0;

57
        for (final SynchronousTask t : tasks) {
58
            if (!t.equals(task)) {
59
                final long maxNumberOfJobs = t.getMaximumParallelism();
60 61 62 63 64 65 66 67 68
                for (long p = 0; p < maxNumberOfJobs; ++p) {
                    taskInterference += Math.min(getTaskInterference(t, deadline, p + 1),
                            deadline - minimumWcet);
                }
            }
        }

        long selfInterference = 0;

69
        final long maxNumberOfJobs = task.getMaximumParallelism();
70 71 72 73 74 75

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

Michael Schmid committed
76 77
        final boolean feasible = taskInterference
                + selfInterference <= manager.getNumberOfProcessors() * (deadline - minimumWcet);
78 79 80 81

        return feasible ? deadline - 1 : deadline + 1;
    }

82 83
    private long getSelfInterference(final SynchronousTask task, final long deadline,
            final long p) {
84 85
        long selfInterference = 0;

86
        for (final Segment s : task.getWorkloadDistribution()) {
87 88 89 90 91 92 93
            if (s.getNumberOfJobs() >= p + 1) {
                selfInterference += s.getJobWcet();
            }
        }
        return selfInterference;
    }

94 95
    private long getTaskInterference(final SynchronousTask t, final long deadline, final long p) {
        final long numberOfBodyJobs = LongMath.divide(deadline, t.getPeriod(), RoundingMode.FLOOR);
96 97 98

        long workloadOfBodyJobs = 0;

99
        for (final Segment s : t.getWorkloadDistribution()) {
100 101 102 103 104
            if (s.getNumberOfJobs() >= p) {
                workloadOfBodyJobs += s.getJobWcet();
            }
        }

105
        final long boundedBodyWorkload = numberOfBodyJobs * workloadOfBodyJobs;
106
        long boundedCarryInWorkload = 0;
107
        final long remainingLength = deadline % t.getPeriod();
108
        long carryInLength = 0;
109
        final List<Segment> segmentList = new ArrayList<>(t.getWorkloadDistribution());
110
        Collections.reverse(segmentList);
111
        for (final Segment s : segmentList) {
112 113 114 115 116 117 118 119 120 121 122 123 124 125
            carryInLength += s.getJobWcet();
            if (s.getNumberOfJobs() >= p && remainingLength > carryInLength) {
                boundedCarryInWorkload += s.getJobWcet();
            } else if (s.getNumberOfJobs() >= p && remainingLength <= carryInLength) {
                boundedCarryInWorkload += s.getJobWcet() - (carryInLength - remainingLength);
            }
            if (carryInLength >= remainingLength) {
                break;
            }
        }

        return boundedBodyWorkload + boundedCarryInWorkload;
    }

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

        return minWcet;
    }

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


}