Library prosa.analysis.facts.jitter
Require Export prosa.analysis.facts.delay_propagation.
Require Export prosa.model.schedule.work_conserving.
Require Export prosa.model.readiness.basic.
Require Export prosa.model.schedule.priority_driven.
Require Export prosa.analysis.definitions.schedulability.
Require Export prosa.model.schedule.work_conserving.
Require Export prosa.model.readiness.basic.
Require Export prosa.model.schedule.priority_driven.
Require Export prosa.analysis.definitions.schedulability.
Propagation of Release Jitter in Arrival Curves
Consider any type of tasks described by arrival curves and the
corresponding jobs.
Let original_arrival denote each job's actual arrival time ...
... and suppose the jobs are affected by bounded release jitter.
In the following, consider an arbitrary valid arrival sequence.
Variable arr_seq : arrival_sequence Job.
Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.
Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.
Recall the induced "release curve" and associated definitions.
In the following, we let rel_seq denote the induced "release curve".
Suppose we are given a set of tasks ...
... with valid bounds on release jitter.
Restated General Properties
The induced "release sequence" is valid.
If the arrival curve is structurally valid, then so is the induced release
curve.
Corollary valid_release_curve :
valid_taskset_arrival_curve ts max_arrivals →
valid_taskset_arrival_curve ts release_curve.
valid_taskset_arrival_curve ts max_arrivals →
valid_taskset_arrival_curve ts release_curve.
Furthermore, if the arrival curve correctly bounds arrivals according to
arr_seq, then the "release curve" also correctly bounds releases
according to rel_seq.
Corollary release_curve_respected :
valid_taskset_arrival_curve ts max_arrivals →
@taskset_respects_max_arrivals _ _ _ arr_seq arrival_curve ts →
@taskset_respects_max_arrivals _ _ _ rel_seq release_curve ts.
valid_taskset_arrival_curve ts max_arrivals →
@taskset_respects_max_arrivals _ _ _ arr_seq arrival_curve ts →
@taskset_respects_max_arrivals _ _ _ rel_seq release_curve ts.
Jitter Propagation Properties
Next, consider an arbitrary schedule of the workload.
Again, trivially, all jobs in the schedule continue to belong to the
release sequence.
Lemma jitter_prop_same_jobs' :
jobs_come_from_arrival_sequence sched arr_seq →
jobs_come_from_arrival_sequence sched rel_seq.
jobs_come_from_arrival_sequence sched arr_seq →
jobs_come_from_arrival_sequence sched rel_seq.
Let us now consider the execution costs.
Since the set of jobs didn't change, and since release jitter propagation
does not change execution costs, job costs remain trivially valid.
Lemma jitter_prop_valid_costs :
arrivals_have_valid_job_costs arr_seq →
arrivals_have_valid_job_costs rel_seq.
arrivals_have_valid_job_costs arr_seq →
arrivals_have_valid_job_costs rel_seq.
If the given schedule respects release jitter, then it continues to do so
after we've reinterpreted the release times to be the arrival times.
Lemma jitter_ready_to_execute :
@jobs_must_be_ready_to_execute _ _ sched _ original_arrival jitter_ready_instance →
@jobs_must_be_ready_to_execute _ _ sched _ release_as_arrival basic_ready_instance.
@jobs_must_be_ready_to_execute _ _ sched _ original_arrival jitter_ready_instance →
@jobs_must_be_ready_to_execute _ _ sched _ release_as_arrival basic_ready_instance.
If the schedule is work-conserving, then it continues to be so after we've
"hidden" release jitter by reinterpreting release times as arrival
times.
Theorem jitter_work_conservation :
@work_conserving _ original_arrival _ _ jitter_ready_instance arr_seq sched →
@work_conserving _ release_as_arrival _ _ basic_ready_instance rel_seq sched.
@work_conserving _ original_arrival _ _ jitter_ready_instance arr_seq sched →
@work_conserving _ release_as_arrival _ _ basic_ready_instance rel_seq sched.
If the given schedule is valid w.r.t. to original arrivals, then it
continues to be valid after reinterpreting release times as arrival
times.
Lemma jitter_valid_schedule :
@valid_schedule _ _ sched _ original_arrival jitter_ready_instance arr_seq →
@valid_schedule _ _ sched _ release_as_arrival basic_ready_instance rel_seq.
@valid_schedule _ _ sched _ original_arrival jitter_ready_instance arr_seq →
@valid_schedule _ _ sched _ release_as_arrival basic_ready_instance rel_seq.
In the following, suppose the given schedule is valid w.r.t. the original
arrival times and jitter-affected readiness.
Hypothesis H_valid_schedule :
@valid_schedule _ _ sched _ original_arrival jitter_ready_instance arr_seq.
@valid_schedule _ _ sched _ original_arrival jitter_ready_instance arr_seq.
As one would think, the set of scheduled jobs remains unchanged. For
technical reasons (dependence of the definition of scheduled_jobs_at on
the arrival sequence), this is a lot less obvious at the Coq level than
one intuitively might expect.
Lemma jitter_scheduled_jobs_at_equiv :
∀ t j,
(j \in scheduled_jobs_at rel_seq sched t) =
(j \in scheduled_jobs_at arr_seq sched t).
∀ t j,
(j \in scheduled_jobs_at rel_seq sched t) =
(j \in scheduled_jobs_at arr_seq sched t).
Unsurprisingly, on a uniprocessor, the scheduled job remains unchanged,
too. Again, this is less straightforward than one might think due to
technical reasons (type-class resolution).
Lemma jitter_scheduled_job_at_eq :
∀ t,
uniprocessor_model PState →
scheduled_job_at arr_seq sched t = scheduled_job_at rel_seq sched t.
∀ t,
uniprocessor_model PState →
scheduled_job_at arr_seq sched t = scheduled_job_at rel_seq sched t.
Importantly, the schedule remains FP-policy compliant if it was so to
begin with, despite the postponed arrival times.
Theorem jitter_FP_compliance `{FP : FP_policy Task} `{JobPreemptable Job}:
uniprocessor_model PState →
@respects_FP_policy_at_preemption_point
_ _ _ original_arrival _ _ _ jitter_ready_instance arr_seq sched FP →
@respects_FP_policy_at_preemption_point
_ _ _ release_as_arrival _ _ _ basic_ready_instance rel_seq sched FP.
uniprocessor_model PState →
@respects_FP_policy_at_preemption_point
_ _ _ original_arrival _ _ _ jitter_ready_instance arr_seq sched FP →
@respects_FP_policy_at_preemption_point
_ _ _ release_as_arrival _ _ _ basic_ready_instance rel_seq sched FP.
Transferred Response-Time Bound
- Audsley, N., Burns, A., Richardson, M., Tindell, K., and Wellings, A. (1993). Applying new scheduling theory to static priority preemptive scheduling. Software Engineering Journal, 8(5):284–292.
Theorem jitter_response_time_bound :
∀ tsk R,
tsk \in ts →
@task_response_time_bound _ _ release_as_arrival _ _ _ rel_seq sched tsk R →
@task_response_time_bound _ _ original_arrival _ _ _ arr_seq sched tsk (task_jitter tsk + R).
End JitterPropagationFacts.
∀ tsk R,
tsk \in ts →
@task_response_time_bound _ _ release_as_arrival _ _ _ rel_seq sched tsk R →
@task_response_time_bound _ _ original_arrival _ _ _ arr_seq sched tsk (task_jitter tsk + R).
End JitterPropagationFacts.