ChwaLee.java 4.56 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 16
import mvd.jester.model.SynchronousTask;
import mvd.jester.priority.EarliestDeadlineFirst;
17 18 19 20 21
import mvd.jester.priority.PriorityManager;

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

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

27
    public ChwaLee(final long numberOfProcessors) {
28 29 30 31 32 33 34 35
        super(numberOfProcessors);
        this.responseTimes = new HashMap<>();
        this.priorityManager = new EarliestDeadlineFirst();
    }

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

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

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

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

        long taskInterference = 0;

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

        long selfInterference = 0;

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

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

75
        final boolean feasible = taskInterference + selfInterference <= numberOfProcessors
76 77 78 79 80
                * (deadline - minimumWcet);

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

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

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

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

        long workloadOfBodyJobs = 0;

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

104
        final long boundedBodyWorkload = numberOfBodyJobs * workloadOfBodyJobs;
105
        long boundedCarryInWorkload = 0;
106
        final long remainingLength = deadline % t.getPeriod();
107
        long carryInLength = 0;
108
        final List<Segment> segmentList = new ArrayList<>(t.getWorkloadDistribution());
109
        Collections.reverse(segmentList);
110
        for (final Segment s : segmentList) {
111 112 113 114 115 116 117 118 119 120 121 122 123 124
            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;
    }

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

        return minWcet;
    }

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


}