Built with
Alectryon , running Coq+SerAPI v8.20.0+0.20.0. Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents. Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus. On Mac, use
⌘ instead of
Ctrl .
Require Export prosa.analysis.abstract .iw_auxiliary.[Loading ML file ssrmatching_plugin.cmxs (using legacy method) ... done ] [Loading ML file ssreflect_plugin.cmxs (using legacy method) ... done ] [Loading ML file ring_plugin.cmxs (using legacy method) ... done ] Serlib plugin: coq-elpi.elpi is not available: serlib support is missing.
Incremental checking for commands in this plugin will be impacted. [Loading ML file coq-elpi.elpi ... done ] [Loading ML file zify_plugin.cmxs (using legacy method) ... done ] [Loading ML file micromega_core_plugin.cmxs (using legacy method) ... done ] [Loading ML file micromega_plugin.cmxs (using legacy method) ... done ] [Loading ML file btauto_plugin.cmxs (using legacy method) ... done ] Notation "_ + _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ - _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ < _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ > _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ * _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Require Export prosa.analysis.facts.model.workload.
Require Export prosa.analysis.abstract .definitions.
(** * Lemmas About Abstract Busy Intervals *)
(** In this file we prove a few basic lemmas about the notion of
an abstract busy interval. *)
Section LemmasAboutAbstractBusyInterval .
(** Consider any type of tasks ... *)
Context {Task : TaskType}.
Context `{TaskCost Task}.
(** ... and any type of jobs associated with these tasks. *)
Context {Job : JobType}.
Context `{JobTask Job Task}.
Context `{JobArrival Job}.
Context `{JobCost Job}.
(** Consider any kind of processor state model. *)
Context {PState : ProcessorState Job}.
(** Assume we are provided with abstract functions for interference
and interfering workload. *)
Context `{Interference Job}.
Context `{InterferingWorkload Job}.
(** Consider any arrival sequence. *)
Variable arr_seq : arrival_sequence Job.
(** Consider an arbitrary task [tsk]. *)
Variable tsk : Task.
(** Next, consider any work-conserving schedule of this arrival sequence
... *)
Variable sched : schedule PState.
Hypothesis H_work_conserving : work_conserving arr_seq sched.
(** ... where jobs do not execute before their arrival. *)
Hypothesis H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute sched.
(** Consider an arbitrary job [j] with positive cost. Notice that a
positive-cost assumption is required to ensure that one cannot
construct a busy interval without any workload inside of it. *)
Variable j : Job.
Hypothesis H_from_arrival_sequence : arrives_in arr_seq j.
Hypothesis H_job_cost_positive : job_cost_positive j.
(** We first prove that any interval <<[t1, t2)>> is either a busy
interval of job [j] or not. *)
Lemma busy_interval_prefix_case :
forall t1 t2 ,
busy_interval_prefix sched j t1 t2 \/ ~ busy_interval_prefix sched j t1 t2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j
forall t1 t2 : instant,
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j
forall t1 t2 : instant,
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
move => t1 t2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
have [JA|NAT] := boolP (t1 <= job_arrival j < t2); last first .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant NAT : ~~ (t1 <= job_arrival j < t2)
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant NAT : ~~ (t1 <= job_arrival j < t2)
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
by right ; move => PREF; move : NAT => /negP NQT; apply : NQT; apply PREF. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
have [QT1|NQT] := boolP (quiet_time sched j t1); last first .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 NQT : ~~ quiet_time sched j t1
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 NQT : ~~ quiet_time sched j t1
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
by right ; move => PREF; move : NQT => /negP NQT; apply : NQT; apply PREF. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 QT1 : quiet_time sched j t1
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
have [AQT|NQT] := boolP (all (fun t => ~~ quiet_time sched j t) (index_iota t1.+1 t2)); last first .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 QT1 : quiet_time sched j t1 NQT : ~~
all (fun t : instant => ~~ quiet_time sched j t)
(index_iota t1.+1 t2)
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 QT1 : quiet_time sched j t1 NQT : ~~
all (fun t : instant => ~~ quiet_time sched j t)
(index_iota t1.+1 t2)
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
right ; move => PREF; move : NQT => /negP NQT; apply : NQT.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 QT1 : quiet_time sched j t1 PREF : busy_interval_prefix sched j t1 t2
all (fun t : instant => ~~ quiet_time sched j t)
(index_iota t1.+1 t2)
apply /allP => t IO; apply /negP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 QT1 : quiet_time sched j t1 PREF : busy_interval_prefix sched j t1 t2 t : Datatypes_nat__canonical__eqtype_Equality IO : t \in index_iota t1.+1 t2
~ quiet_time sched j t
by apply PREF; move : IO; rewrite mem_index_iota.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : all (fun t : instant => ~~ quiet_time sched j t)
(index_iota t1.+1 t2)
busy_interval_prefix sched j t1 t2 \/
~ busy_interval_prefix sched j t1 t2
left ; split ; [by done | split ] => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : all (fun t : instant => ~~ quiet_time sched j t)
(index_iota t1.+1 t2)
forall t : nat, t1 < t < t2 -> ~ quiet_time sched j t
move => t NEQ; apply /negP; move : AQT => /allP AQT; apply : AQT.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant JA : t1 <= job_arrival j < t2 QT1 : quiet_time sched j t1 t : nat NEQ : t1 < t < t2
t \in index_iota t1.+1 t2
by rewrite mem_index_iota.
Qed .
(** Consider two intervals <<[t1, t2)>> ⊆ <<[t1, t2')>>, where
<<[t1, t2)>> is a busy-interval prefix and <<[t1, t2')>> is not
a busy-interval prefix. Then there exists [t2''] such that
<<[t1, t2'')>> is a busy interval. *)
Lemma terminating_busy_prefix_is_busy_interval :
forall t1 t2 t2' ,
t2 <= t2' ->
busy_interval_prefix sched j t1 t2 ->
~ busy_interval_prefix sched j t1 t2' ->
exists t2'' , busy_interval sched j t1 t2''.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j
forall (t1 : instant) (t2 t2' : nat),
t2 <= t2' ->
busy_interval_prefix sched j t1 t2 ->
~ busy_interval_prefix sched j t1 t2' ->
exists t2'' : instant, busy_interval sched j t1 t2''
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j
forall (t1 : instant) (t2 t2' : nat),
t2 <= t2' ->
busy_interval_prefix sched j t1 t2 ->
~ busy_interval_prefix sched j t1 t2' ->
exists t2'' : instant, busy_interval sched j t1 t2''
move => t1 t2 t2' LE BUSY NBUSY.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, t2' : nat LE : t2 <= t2' BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 t2'
exists t2'' : instant, busy_interval sched j t1 t2''
interval_to_duration t2 t2' δ. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 (t2 + δ)
exists t2'' : instant, busy_interval sched j t1 t2''
induction δ as [ | δ IHδ].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2 : nat BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 (t2 + 0 )
exists t2'' : instant, busy_interval sched j t1 t2''
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2 : nat BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 (t2 + 0 )
exists t2'' : instant, busy_interval sched j t1 t2''
by exfalso ; apply : NBUSY; rewrite addn0. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 (t2 + δ.+1 ) IHδ : ~ busy_interval_prefix sched j t1 (t2 + δ) ->
exists t2'' : instant,
busy_interval sched j t1 t2''
exists t2'' : instant, busy_interval sched j t1 t2''
have [BUSY'|NBUSY'] := busy_interval_prefix_case t1 (t2 + δ); last by apply IHδ in NBUSY'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 (t2 + δ.+1 ) IHδ : ~ busy_interval_prefix sched j t1 (t2 + δ) ->
exists t2'' : instant,
busy_interval sched j t1 t2'' BUSY' : busy_interval_prefix sched j t1 (t2 + δ)
exists t2'' : instant, busy_interval sched j t1 t2''
clear IHδ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 (t2 + δ.+1 ) BUSY' : busy_interval_prefix sched j t1 (t2 + δ)
exists t2'' : instant, busy_interval sched j t1 t2''
exists (t2 + δ); split => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 (t2 + δ.+1 ) BUSY' : busy_interval_prefix sched j t1 (t2 + δ)
quiet_time sched j (t2 + δ)
apply negbNE; apply /negP => FF.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 NBUSY : ~ busy_interval_prefix sched j t1 (t2 + δ.+1 ) BUSY' : busy_interval_prefix sched j t1 (t2 + δ) FF : ~~ quiet_time sched j (t2 + δ)
False
apply :NBUSY; split ; first by move : BUSY => []; lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 BUSY' : busy_interval_prefix sched j t1 (t2 + δ) FF : ~~ quiet_time sched j (t2 + δ)
quiet_time sched j t1 /\
(forall t : nat,
t1 < t < t2 + δ.+1 -> ~ quiet_time sched j t)
split ; first by move : BUSY => []; lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 BUSY' : busy_interval_prefix sched j t1 (t2 + δ) FF : ~~ quiet_time sched j (t2 + δ)
forall t : nat,
t1 < t < t2 + δ.+1 -> ~ quiet_time sched j t
move => t; rewrite addnS ltnS [_ <= t2 + δ]leq_eqVlt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 BUSY' : busy_interval_prefix sched j t1 (t2 + δ) FF : ~~ quiet_time sched j (t2 + δ) t : nat
(t1 < t) && ((t == t2 + δ) || (t < t2 + δ)) ->
~ quiet_time sched j t
move => /andP [LT1 /orP [/eqP WDFW | VB]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 BUSY' : busy_interval_prefix sched j t1 (t2 + δ) FF : ~~ quiet_time sched j (t2 + δ) t : nat LT1 : t1 < t WDFW : t = t2 + δ
~ quiet_time sched j t
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 BUSY' : busy_interval_prefix sched j t1 (t2 + δ) FF : ~~ quiet_time sched j (t2 + δ) t : nat LT1 : t1 < t WDFW : t = t2 + δ
~ quiet_time sched j t
by subst ; apply /negP.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1 : instant t2, δ : nat BUSY : busy_interval_prefix sched j t1 t2 BUSY' : busy_interval_prefix sched j t1 (t2 + δ) FF : ~~ quiet_time sched j (t2 + δ) t : nat LT1 : t1 < t VB : t < t2 + δ
~ quiet_time sched j t
by apply BUSY'; lia .
Qed .
(** Next, consider a busy interval <<[t1, t2)>> of job [j]. *)
Variable t1 t2 : instant.
Hypothesis H_busy_interval : busy_interval sched j t1 t2.
(** First, we prove that job [j] completes by the end of the busy
interval. Note that the busy interval contains the execution of
job [j]; in addition, time instant [t2] is a quiet time. Thus by
the definition of a quiet time the job must be completed
before time [t2]. *)
Lemma job_completes_within_busy_interval :
completed_by sched j t2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2
completed_by sched j t2
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2
completed_by sched j t2
move : (H_busy_interval) => [[/andP [_ LT] _] /andP [_ QT2]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LT : job_arrival j < t2 QT2 : ~~ pending_earlier_and_at sched j t2
completed_by sched j t2
unfold quiet_time, pending_earlier_and_at, pending, has_arrived in QT2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LT : job_arrival j < t2 QT2 : ~~
(arrived_before j t2 &&
~~ completed_by sched j t2)
completed_by sched j t2
move : QT2; rewrite negb_and => /orP [QT2|QT2].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LT : job_arrival j < t2 QT2 : ~~ arrived_before j t2
completed_by sched j t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LT : job_arrival j < t2 QT2 : ~~ arrived_before j t2
completed_by sched j t2
by move : QT2 => /negP QT2; exfalso ; apply QT2, ltnW. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LT : job_arrival j < t2 QT2 : ~~ ~~ completed_by sched j t2
completed_by sched j t2
by rewrite Bool.negb_involutive in QT2.
Qed .
(** We show that, similarly to the classical notion of busy
interval, the job does not receive service before the busy
interval starts. *)
Lemma no_service_before_busy_interval :
forall t , service sched j t = service_during sched j t1 t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2
forall t : instant,
service sched j t = service_during sched j t1 t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2
forall t : instant,
service sched j t = service_during sched j t1 t
move => t; move : (H_busy_interval) => [[/andP [LE1 LE2] [QT1 AQT]] QT2].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2
service sched j t = service_during sched j t1 t
destruct (leqP t1 t) as [NEQ1|NEQ1]; first destruct (leqP t2 t) as [NEQ2|NEQ2].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t2 <= t
service sched j t = service_during sched j t1 t
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t2 <= t
service sched j t = service_during sched j t1 t
apply /eqP; rewrite eqn_leq; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t2 <= t
service sched j t <= service_during sched j t1 t
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t2 <= t
service sched j t <= service_during sched j t1 t
rewrite /service -(service_during_cat _ _ _ t1);
[ | by apply /andP; split ; lia ].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t2 <= t
service_during sched j 0 t1 +
service_during sched j t1 t <=
service_during sched j t1 t
by rewrite cumulative_service_before_job_arrival_zero; eauto 2 .
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t2 <= t
service_during sched j t1 t <= service sched j t
rewrite /service -[in X in _ <= X](service_during_cat _ _ _ t1);
[ | by apply /andP; split ; lia ].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t2 <= t
service_during sched j t1 t <=
service_during sched j 0 t1 +
service_during sched j t1 t
by (erewrite cumulative_service_before_job_arrival_zero with (t1 := 0 )
|| erewrite cumulative_service_before_job_arrival_zero with (t3 := 0 )).
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t < t2
service sched j t = service_during sched j t1 t
rewrite /service -(service_during_cat _ _ _ t1);
[ | by apply /andP; split ; lia ].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t1 <= t NEQ2 : t < t2
service_during sched j 0 t1 +
service_during sched j t1 t =
service_during sched j t1 t
by rewrite cumulative_service_before_job_arrival_zero; eauto 2 .
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t < t1
service sched j t = service_during sched j t1 t
rewrite service_during_geq; last by lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 t : instant LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2 NEQ1 : t < t1
service sched j t = 0
by rewrite /service cumulative_service_before_job_arrival_zero//; lia .
Qed .
(** Since the job cannot arrive before the busy interval starts and
completes by the end of the busy interval, it receives at least
[job_cost j] units of service within the interval. *)
Lemma service_within_busy_interval_ge_job_cost :
job_cost j <= service_during sched j t1 t2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2
job_cost j <= service_during sched j t1 t2
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2
job_cost j <= service_during sched j t1 t2
move : (H_busy_interval) => [[/andP [LE1 LE2] [QT1 AQT]] QT2].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2
job_cost j <= service_during sched j t1 t2
rewrite -[service_during _ _ _ _]add0n.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2
job_cost j <= 0 + service_during sched j t1 t2
rewrite -(cumulative_service_before_job_arrival_zero sched j _ 0 _ LE1)//.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2
job_cost j <=
service_during sched j 0 t1 +
service_during sched j t1 t2
rewrite service_during_cat; last by apply /andP; split ; lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2
job_cost j <= service_during sched j 0 t2
rewrite -/(completed_by sched j t2).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 LE1 : t1 <= job_arrival j LE2 : job_arrival j < t2 QT1 : quiet_time sched j t1 AQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time sched j tQT2 : quiet_time sched j t2
completed_by sched j t2
exact : job_completes_within_busy_interval.
Qed .
(** Trivially, job [j] arrives before the end of the busy window (if arrival
times are consistent), which is a useful fact to observe for proof
automation. *)
Hypothesis H_consistent_arrival_times : consistent_arrival_times arr_seq.
Fact abstract_busy_interval_arrivals_before :
j \in arrivals_before arr_seq t2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq
j \in arrivals_before arr_seq t2
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq
j \in arrivals_before arr_seq t2
move : (H_busy_interval) => [[/andP [_ LT] _] _].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq LT : job_arrival j < t2
j \in arrivals_before arr_seq t2
by apply : arrived_between_implies_in_arrivals.
Qed .
(** For the same reason, we note the trivial fact that by definition [j]
arrives no earlier than at time [t1]. For automation, we note this both as
a fact on busy-interval prefixes ... *)
Fact abstract_busy_interval_prefix_job_arrival :
forall t t' , busy_interval_prefix sched j t t' -> t <= job_arrival j.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq
forall t t' : instant,
busy_interval_prefix sched j t t' ->
t <= job_arrival j
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq
forall t t' : instant,
busy_interval_prefix sched j t t' ->
t <= job_arrival j
by move => ? ? [/andP [GEQ _] _].
Qed .
(** ... and complete busy-intervals. *)
Fact abstract_busy_interval_job_arrival :
t1 <= job_arrival j.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq
t1 <= job_arrival j
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq
t1 <= job_arrival j
move : H_busy_interval => [PREFIX _].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq PREFIX : busy_interval_prefix sched j t1 t2
t1 <= job_arrival j
exact : abstract_busy_interval_prefix_job_arrival.
Qed .
(** Next, let us assume that the introduced processor model is
unit-supply. *)
Hypothesis H_unit_service_proc_model : unit_service_proc_model PState.
(** Under this assumption, the sum of the total service during the
time interval <<[t1, t1 + Δ)>> and the cumulative interference
during the same interval is bounded by the length of the time
interval. *)
Lemma service_and_interference_bound :
forall Δ ,
t1 + Δ <= t2 ->
service_during sched j t1 (t1 + Δ) + cumulative_interference j t1 (t1 + Δ) <= Δ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState
forall Δ : nat,
t1 + Δ <= t2 ->
service_during sched j t1 (t1 + Δ) +
cumulative_interference j t1 (t1 + Δ) <= Δ
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState
forall Δ : nat,
t1 + Δ <= t2 ->
service_during sched j t1 (t1 + Δ) +
cumulative_interference j t1 (t1 + Δ) <= Δ
move => Δ LE; rewrite -big_split //= -{2 }(sum_of_ones t1 Δ).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2
\sum_(t1 <= i < t1 + Δ)
(service_at sched j i +
cond_interference (fun => xpredT) j i) <=
\sum_(t1 <= x < t1 + Δ) 1
rewrite big_nat [in X in _ <= X]big_nat; apply leq_sum => t /andP[Lo Hi].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ
service_at sched j t +
cond_interference (fun => xpredT) j t <= 1
move : (H_work_conserving j t1 t2 t) => Workj.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : arrives_in arr_seq j ->
0 < job_cost j ->
busy_interval_prefix sched j t1 t2 ->
t1 <= t < t2 ->
~ interference j t <->
receives_service_at sched j t
service_at sched j t +
cond_interference (fun => xpredT) j t <= 1
feed_n 4 Workj => //. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : busy_interval_prefix sched j t1 t2 ->
t1 <= t < t2 ->
~ interference j t <->
receives_service_at sched j t
busy_interval_prefix sched j t1 t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : busy_interval_prefix sched j t1 t2 ->
t1 <= t < t2 ->
~ interference j t <->
receives_service_at sched j t
busy_interval_prefix sched j t1 t2
by move : H_busy_interval => [PREF QT]. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : t1 <= t < t2 ->
~ interference j t <->
receives_service_at sched j t
t1 <= t < t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : t1 <= t < t2 ->
~ interference j t <->
receives_service_at sched j t
t1 <= t < t2
by apply /andP; split ; lia . } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : ~ interference j t <->
receives_service_at sched j t
service_at sched j t +
cond_interference (fun => xpredT) j t <= 1
rewrite /cond_interference //=; move : Workj; case : interference => Workj.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : ~ true <-> receives_service_at sched j t
service_at sched j t + true <= 1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : ~ true <-> receives_service_at sched j t
service_at sched j t + true <= 1
by rewrite addn1 ltnS; move_neq_up NE; apply Workj.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H3 : Interference Job H4 : InterferingWorkload Job arr_seq : arrival_sequence Job tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_interval : busy_interval sched j t1 t2 H_consistent_arrival_times : consistent_arrival_times
arr_seq H_unit_service_proc_model : unit_service_proc_model
PState Δ : nat LE : t1 + Δ <= t2 t : nat Lo : t1 <= t Hi : t < t1 + Δ Workj : ~ false <-> receives_service_at sched j t
service_at sched j t + false <= 1
by rewrite addn0; apply : H_unit_service_proc_model.
Qed .
End LemmasAboutAbstractBusyInterval .
(** In the following section, we derive a sufficient condition for the
existence of abstract busy intervals for unit-service
processors. *)
Section AbstractBusyIntervalExists .
(** Consider any type of tasks ... *)
Context {Task : TaskType}.
Context `{TaskCost Task}.
(** ... and any type of jobs associated with these tasks. *)
Context {Job : JobType}.
Context `{JobTask Job Task}.
Context `{JobArrival Job}.
Context `{JobCost Job}.
(** Consider any kind of of unit-service processor model. *)
Context {PState : ProcessorState Job}.
Hypothesis H_unit_service_proc_model : unit_service_proc_model PState.
(** Assume we are provided with abstract functions for interference
and interfering workload ... *)
Context `{Interference Job}.
Context `{InterferingWorkload Job}.
(** ... that do not allow speculative execution. *)
Hypothesis H_no_speculative_exec : no_speculative_execution.
(** Consider any arrival sequence with consistent, non-duplicate arrivals. *)
Variable arr_seq : arrival_sequence Job.
Hypothesis H_arrival_times_are_consistent : consistent_arrival_times arr_seq.
Hypothesis H_arrival_sequence_is_a_set : arrival_sequence_uniq arr_seq.
(** Consider an arbitrary task [tsk]. *)
Variable tsk : Task.
(** Next, consider any work-conserving (in the abstract sense)
schedule of this arrival sequence ... *)
Variable sched : schedule PState.
Hypothesis H_work_conserving : work_conserving arr_seq sched.
(** ... where jobs do not execute before their arrival or after completion. *)
Hypothesis H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute sched.
Hypothesis H_completed_jobs_dont_execute : completed_jobs_dont_execute sched.
(** Consider an arbitrary job [j] from task [tsk] with positive cost. *)
Variable j : Job.
Hypothesis H_from_arrival_sequence : arrives_in arr_seq j.
Hypothesis H_job_task : job_of_task tsk j.
Hypothesis H_job_cost_positive : job_cost_positive j.
(** In this section, we prove a fact that allows one to extend an
inequality between cumulative interference and interfering
workload from a busy-interval prefix <<[t1, t)>> to the whole
timeline <<[0, t)>>. *)
Section CumulativeIntIntWorkExtension .
(** Consider any busy-interval prefix of job [j]. *)
Variable t1 t_busy : instant.
Hypothesis H_is_busy_prefix : busy_interval_prefix sched j t1 t_busy.+1 .
(** We assume that, for some positive [δ], the cumulative
interfering workload within interval <<[t1, t1 + δ)>> is
bounded by cumulative interference in the same interval. *)
Variable δ : duration.
Hypothesis H_iw_bounded :
cumulative_interfering_workload j t1 (t1 + δ) <= cumulative_interference j t1 (t1 + δ).
(** Then the cumulative interfering workload within interval <<[0,
t1 + δ)>> is bounded by the cumulative interference in the
same interval. *)
Local Lemma cumul_iw_bounded_by_cumul_i :
cumulative_interfering_workload j 0 (t1 + δ) <= cumulative_interference j 0 (t1 + δ).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ)
cumulative_interfering_workload j 0 (t1 + δ) <=
cumulative_interference j 0 (t1 + δ)
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ)
cumulative_interfering_workload j 0 (t1 + δ) <=
cumulative_interference j 0 (t1 + δ)
move : (H_iw_bounded) => LE.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded, LE : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ)
cumulative_interfering_workload j 0 (t1 + δ) <=
cumulative_interference j 0 (t1 + δ)
rewrite /definitions.cumulative_interference
/definitions.cumulative_interfering_workload
/cumul_cond_interference.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded, LE : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ)
\sum_(0 <= t < t1 + δ) interfering_workload j t <=
\sum_(0 <= t < t1 + δ)
cond_interference (fun => xpredT) j t
rewrite (@big_cat_nat _ _ _ t1) //=; last by lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded, LE : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ)
\sum_(0 <= i < t1) interfering_workload j i +
\sum_(t1 <= i < t1 + δ) interfering_workload j i <=
\sum_(0 <= t < t1 + δ)
cond_interference (fun => xpredT) j t
rewrite [in X in _ <= X](@big_cat_nat _ _ _ t1) //=; last by lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded, LE : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ)
\sum_(0 <= i < t1) interfering_workload j i +
\sum_(t1 <= i < t1 + δ) interfering_workload j i <=
\sum_(0 <= i < t1)
cond_interference (fun => xpredT) j i +
\sum_(t1 <= i < t1 + δ)
cond_interference (fun => xpredT) j i
move : H_is_busy_prefix => [_ [/andP [/eqP DD KK ] ADD]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded, LE : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ) DD : cumulative_interference j 0 t1 =
cumulative_interfering_workload j 0 t1 KK : ~~ pending_earlier_and_at sched j t1 ADD : forall t : nat,
t1 < t < t_busy.+1 -> ~ quiet_time sched j t
\sum_(0 <= i < t1) interfering_workload j i +
\sum_(t1 <= i < t1 + δ) interfering_workload j i <=
\sum_(0 <= i < t1)
cond_interference (fun => xpredT) j i +
\sum_(t1 <= i < t1 + δ)
cond_interference (fun => xpredT) j i
rewrite /cumulative_interfering_workload in LE; rewrite (leqRW LE); clear LE.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ) DD : cumulative_interference j 0 t1 =
cumulative_interfering_workload j 0 t1 KK : ~~ pending_earlier_and_at sched j t1 ADD : forall t : nat,
t1 < t < t_busy.+1 -> ~ quiet_time sched j t
\sum_(0 <= i < t1) interfering_workload j i +
cumulative_interference j t1 (t1 + δ) <=
\sum_(0 <= i < t1)
cond_interference (fun => xpredT) j i +
\sum_(t1 <= i < t1 + δ)
cond_interference (fun => xpredT) j i
rewrite leq_add2r.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ) DD : cumulative_interference j 0 t1 =
cumulative_interfering_workload j 0 t1 KK : ~~ pending_earlier_and_at sched j t1 ADD : forall t : nat,
t1 < t < t_busy.+1 -> ~ quiet_time sched j t
\sum_(0 <= i < t1) interfering_workload j i <=
\sum_(0 <= i < t1)
cond_interference (fun => xpredT) j i
rewrite /cumulative_interfering_workload in DD.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j t1, t_busy : instant H_is_busy_prefix : busy_interval_prefix sched j t1
t_busy.+1 δ : duration H_iw_bounded : cumulative_interfering_workload j t1
(t1 + δ) <=
cumulative_interference j t1 (t1 + δ) KK : ~~ pending_earlier_and_at sched j t1 ADD : forall t : nat,
t1 < t < t_busy.+1 -> ~ quiet_time sched j tDD : cumulative_interference j 0 t1 =
\sum_(0 <= t < t1) interfering_workload j t
\sum_(0 <= i < t1) interfering_workload j i <=
\sum_(0 <= i < t1)
cond_interference (fun => xpredT) j i
by rewrite -DD; clear DD.
Qed .
End CumulativeIntIntWorkExtension .
(** In the following section, we show that the busy interval is
bounded. More specifically, we show that the length of any
abstract busy interval is bounded, as long as there is enough
supply to accommodate the interfering workload. *)
Section BoundingBusyInterval .
(** For simplicity, let us define some local names. *)
Let quiet_time t := quiet_time sched j t.
Let busy_interval_prefix := busy_interval_prefix sched j.
Let busy_interval := busy_interval sched j.
(** Suppose that job [j] is pending at time [t_busy]. *)
Variable t_busy : instant.
Hypothesis H_j_is_pending : pending sched j t_busy.
(** First, we show that there must exist a busy interval prefix. *)
Section LowerBound .
(** Since job [j] is pending at time [t_busy], there is a
(potentially unbounded) busy interval that starts no later
than with the arrival of [j]. *)
Lemma exists_busy_interval_prefix :
exists t1 ,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
rename H_j_is_pending into PEND.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
destruct ([exists t :'I_t_busy.+1 , quiet_time t]) eqn :EX.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy EX : [exists t , quiet_time t] = true
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy EX : [exists t , quiet_time t] = true
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
set (last0 := \max_(t < t_busy.+1 | quiet_time t) t).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy EX : [exists t , quiet_time t] = true last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
move : EX => /existsP [t EX].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
have PRED: quiet_time last0 by apply (bigmax_pred t_busy.+1 (quiet_time) t).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t PRED : quiet_time last0
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
move : PRED => QUIET.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
exists last0 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0
busy_interval_prefix last0 t_busy.+1 /\
last0 <= job_arrival j <= t_busy
have JARRIN: last0 <= job_arrival j <= t_busy.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0
last0 <= job_arrival j <= t_busy
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0
last0 <= job_arrival j <= t_busy
move : PEND => /andP [ARR NCOM].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0 ARR : has_arrived j t_busy NCOM : ~~ completed_by sched j t_busy
last0 <= job_arrival j <= t_busy
apply /andP; split => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0 ARR : has_arrived j t_busy NCOM : ~~ completed_by sched j t_busy
last0 <= job_arrival j
move : QUIET => /andP [_ PE].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t ARR : has_arrived j t_busy NCOM : ~~ completed_by sched j t_busy PE : ~~ pending_earlier_and_at sched j last0
last0 <= job_arrival j
move : PE; rewrite negb_and -leqNgt => /orP [ | /negPn COMPL] => //; exfalso .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t ARR : has_arrived j t_busy NCOM : ~~ completed_by sched j t_busy COMPL : completed_by sched j last0
False
apply completion_monotonic with (t' := t_busy) in COMPL.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t ARR : has_arrived j t_busy NCOM : ~~ completed_by sched j t_busy COMPL : completed_by sched j t_busy
False
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t ARR : has_arrived j t_busy NCOM : ~~ completed_by sched j t_busy COMPL : completed_by sched j t_busy
False
by move : NCOM => /negP.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t ARR : has_arrived j t_busy NCOM : ~~ completed_by sched j t_busy COMPL : completed_by sched j last0
last0 <= t_busy
by rewrite -ltnS; eapply bigmax_ltn_ord.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0 JARRIN : last0 <= job_arrival j <= t_busy
busy_interval_prefix last0 t_busy.+1 /\
last0 <= job_arrival j <= t_busy
repeat split ; auto 2 ; try apply QUIET => //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0 JARRIN : last0 <= job_arrival j <= t_busy
forall t : nat,
last0 < t < t_busy.+1 ->
~ definitions.quiet_time sched j t
move => t0 /andP [GTlast LTbusy] QUIET0.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0 JARRIN : last0 <= job_arrival j <= t_busy t0 : nat GTlast : last0 < t0 LTbusy : t0 < t_busy.+1 QUIET0 : definitions.quiet_time sched j t0
False
move_neq_down GTlast. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy last0 := \max_(t < t_busy.+1 | quiet_time t) t : nat t : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 EX : quiet_time t QUIET : quiet_time last0 JARRIN : last0 <= job_arrival j <= t_busy t0 : nat LTbusy : t0 < t_busy.+1 QUIET0 : definitions.quiet_time sched j t0
t0 <= last0
by eapply (@leq_bigmax_cond
_ (fun (x : 'I_t_busy.+1 ) => quiet_time x)
(fun x => x) (Ordinal LTbusy)).
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy EX : [exists t , quiet_time t] = false
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy EX : [exists t , quiet_time t] = false
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
apply negbT in EX; rewrite negb_exists in EX; move : EX => /forallP ALL.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time x
exists t1 : instant,
busy_interval_prefix t1 t_busy.+1 /\
t1 <= job_arrival j <= t_busy
exists 0 ; split ; last by apply /andP; split ; last by move : PEND => /andP [ARR _].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time x
busy_interval_prefix 0 t_busy.+1
repeat split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time x
0 <= job_arrival j < t_busy.+1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time x
0 <= job_arrival j < t_busy.+1
apply /andP; split => //; rewrite ltnS.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time x
job_arrival j <= t_busy
by move : PEND => /andP PEND; apply PEND.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time x
definitions.quiet_time sched j 0
apply /andP; split ;
first by rewrite /cumulative_interference /cumul_cond_interference /cumulative_interfering_workload !big_geq.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time x
~~ pending_earlier_and_at sched j 0
by apply not_pending_earlier_and_at_0.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time x
forall t : nat,
0 < t < t_busy.+1 ->
~ definitions.quiet_time sched j t
move => t /andP [GE LT] QUIET.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time xt : nat GE : 0 < tLT : t < t_busy.+1 QUIET : definitions.quiet_time sched j t
False
move : (ALL (Ordinal LT)) => /negP ALL'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant PEND : pending sched j t_busy ALL : forall
x : fintype_ordinal__canonical__fintype_Finite
t_busy.+1 ,
~~ quiet_time xt : nat GE : 0 < tLT : t < t_busy.+1 QUIET : definitions.quiet_time sched j t ALL' : ~ quiet_time (Ordinal (n:=t_busy.+1 ) (m:=t) LT)
False
by apply ALL'.
}
Qed .
End LowerBound .
(** Next we prove that, if there is a point where the requested
workload is upper-bounded by the supply, then the busy
interval eventually ends. *)
Section UpperBound .
(** Consider any busy interval prefix of job [j]. *)
Variable t1 : instant.
Hypothesis H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 .
(** We assume that for some positive [δ], the cumulative
interfering workload within interval <<[t1, t1 + δ)>> is
bounded by [δ]. *)
Variable δ : duration.
Hypothesis H_δ_positive : δ > 0 .
Hypothesis H_workload_is_bounded :
workload_of_job arr_seq j t1 (t1 + δ)
+ cumulative_interfering_workload j t1 (t1 + δ) <= δ.
(** If there is a quiet time by time [t1 + δ], it trivially
follows that the busy interval is bounded. Thus, let's
consider first the harder case where there is no quiet time,
which turns out to be impossible. *)
Section CannotBeBusyForSoLong .
(** Assume that there is no quiet time in the interval <<(t1, t1 + δ]>>. *)
Hypothesis H_no_quiet_time : forall t , t1 < t <= t1 + δ -> ~ quiet_time t.
(** We prove that the sum of cumulative service and cumulative
interference in the interval <<[t, t + δ)>> is equal to
[δ]. *)
(** Since the interval is always non-quiet, the processor is
always busy processing job [j] and the job's interference
and, hence, the sum of service of [j] and its cumulative
interference within the interval <<[t1, t1 + δ)>> is
greater than or equal to [δ]. *)
Lemma busy_interval_has_uninterrupted_service :
δ <= service_during sched j t1 (t1 + δ) + cumulative_interference j t1 (t1 + δ).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
δ <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ)
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
δ <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ)
clear H_δ_positive H_workload_is_bounded H_j_is_pending.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
δ <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ)
rewrite /service_during /cumulative_interference /cumul_cond_interference /cond_interference /service_at.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
δ <=
\sum_(t1 <= t < t1 + δ) service_in j (sched t) +
\sum_(t1 <= t < t1 + δ) true && interference j t
rewrite -big_split //= -{1 }(sum_of_ones t1 δ).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
\sum_(t1 <= x < t1 + δ) 1 <=
\sum_(t1 <= i < t1 + δ)
(service_in j (sched i) + interference j i)
rewrite big_nat [in X in _ <= X]big_nat.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
\sum_(t1 <= i < t1 + δ | t1 <= i < t1 + δ) 1 <=
\sum_(t1 <= i < t1 + δ | t1 <= i < t1 + δ)
(service_in j (sched i) + interference j i)
apply leq_sum => x /andP[Lo Hi].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ
0 < service_in j (sched x) + interference j x
destruct (leqP (t1 + δ) (t_busy.+1 )) as [LE|LT].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1
0 < service_in j (sched x) + interference j x
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1
0 < service_in j (sched x) + interference j x
move : (H_work_conserving j t1 t_busy.+1 x) => Workj.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1 Workj : arrives_in arr_seq j ->
0 < job_cost j ->
definitions.busy_interval_prefix sched j t1
t_busy.+1 ->
t1 <= x < t_busy.+1 ->
~ interference j x <->
receives_service_at sched j x
0 < service_in j (sched x) + interference j x
feed_n 4 Workj; try done . Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1 Workj : t1 <= x < t_busy.+1 ->
~ interference j x <->
receives_service_at sched j x
t1 <= x < t_busy.+1
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1 Workj : t1 <= x < t_busy.+1 ->
~ interference j x <->
receives_service_at sched j x
t1 <= x < t_busy.+1
by apply /andP; split ; eapply leq_trans; eauto . } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1 Workj : ~ interference j x <->
receives_service_at sched j x
0 < service_in j (sched x) + interference j x
destruct interference.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1 Workj : ~ true <-> receives_service_at sched j x
0 < service_in j (sched x) + true
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1 Workj : ~ true <-> receives_service_at sched j x
0 < service_in j (sched x) + true
by lia .
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LE : t1 + δ <= t_busy.+1 Workj : ~ false <-> receives_service_at sched j x
0 < service_in j (sched x) + false
by rewrite //= addn0; apply Workj.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ
0 < service_in j (sched x) + interference j x
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ
0 < service_in j (sched x) + interference j x
move : (H_work_conserving j t1 (t1 + δ) x) => Workj.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : arrives_in arr_seq j ->
0 < job_cost j ->
definitions.busy_interval_prefix sched j t1
(t1 + δ) ->
t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x
0 < service_in j (sched x) + interference j x
feed_n 4 Workj; try done . Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : definitions.busy_interval_prefix sched j t1
(t1 + δ) ->
t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x
definitions.busy_interval_prefix sched j t1 (t1 + δ)
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : definitions.busy_interval_prefix sched j t1
(t1 + δ) ->
t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x
definitions.busy_interval_prefix sched j t1 (t1 + δ)
move : H_is_busy_prefix => [/andP [A1 A2] [QT NQT]]; split ; [ | split ].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : definitions.busy_interval_prefix sched j t1
(t1 + δ) ->
t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x A1 : t1 <= job_arrival j A2 : job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j t
t1 <= job_arrival j < t1 + δ
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : definitions.busy_interval_prefix sched j t1
(t1 + δ) ->
t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x A1 : t1 <= job_arrival j A2 : job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j t
t1 <= job_arrival j < t1 + δ
by apply /andP; split => //; rewrite (leqRW A2) -(leqRW LT).
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : definitions.busy_interval_prefix sched j t1
(t1 + δ) ->
t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x A1 : t1 <= job_arrival j A2 : job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j t
definitions.quiet_time sched j t1
by apply QT.
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : definitions.busy_interval_prefix sched j t1
(t1 + δ) ->
t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x A1 : t1 <= job_arrival j A2 : job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j t
forall t : nat,
t1 < t < t1 + δ -> ~ definitions.quiet_time sched j t
move => t /andP [A3 A4]; apply H_no_quiet_time.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : definitions.busy_interval_prefix sched j t1
(t1 + δ) ->
t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x A1 : t1 <= job_arrival j A2 : job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt : nat A3 : t1 < t A4 : t < t1 + δ
t1 < t <= t1 + δ
by apply /andP; split ; lia .
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : t1 <= x < t1 + δ ->
~ interference j x <->
receives_service_at sched j x
t1 <= x < t1 + δ
by apply /andP; split ; eapply leq_trans; eauto 2 .
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : ~ interference j x <->
receives_service_at sched j x
0 < service_in j (sched x) + interference j x
destruct interference.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : ~ true <-> receives_service_at sched j x
0 < service_in j (sched x) + true
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : ~ true <-> receives_service_at sched j x
0 < service_in j (sched x) + true
by lia .
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy, t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tx : nat Lo : t1 <= x Hi : x < t1 + δ LT : t_busy.+1 < t1 + δ Workj : ~ false <-> receives_service_at sched j x
0 < service_in j (sched x) + false
by rewrite //= addn0; apply Workj.
}
Qed .
(** However, since the total workload is bounded (see
[H_workload_is_bounded]), the sum of [j]'s cost and its
interfering workload within the interval <<[t1, t1 + δ)>>
is bounded by [j]'s service and its interference within
the same time interval. *)
Lemma busy_interval_too_much_workload :
job_cost j + cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) + cumulative_interference j t1 (t1 + δ).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ)
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ)
replace (job_cost j) with (workload_of_job arr_seq j t1 (t1 + δ));
first by rewrite (leqRW H_workload_is_bounded)
-(leqRW busy_interval_has_uninterrupted_service).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
workload_of_job arr_seq j t1 (t1 + δ) = job_cost j
move : (H_is_busy_prefix) => [/andP [NEQ1 _] _].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j
workload_of_job arr_seq j t1 (t1 + δ) = job_cost j
erewrite workload_of_job_eq_job_arrival => //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j
(if t1 <= job_arrival j < t1 + δ
then job_cost j
else 0 ) = job_cost j
rewrite NEQ1 Bool.andb_true_l.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j
(if job_arrival j < t1 + δ then job_cost j else 0 ) =
job_cost j
have -> : job_arrival j < t1 + δ; last by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j
job_arrival j < t1 + δ
move_neq_up GE. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j
False
apply (H_no_quiet_time (t1 + δ)).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j
t1 < t1 + δ <= t1 + δ
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j
t1 < t1 + δ <= t1 + δ
by apply /andP; split ; [rewrite -addn1 leq_add2l | done ]. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j
quiet_time (t1 + δ)
apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j
cumulative_interference j 0 (t1 + δ) ==
cumulative_interfering_workload j 0 (t1 + δ)
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j
cumulative_interference j 0 (t1 + δ) ==
cumulative_interfering_workload j 0 (t1 + δ)
move : (H_workload_is_bounded); rewrite workload_of_job_eq_job_arrival //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j
(if t1 <= job_arrival j < t1 + δ
then job_cost j
else 0 ) +
cumulative_interfering_workload j t1 (t1 + δ) <= δ ->
cumulative_interference j 0 (t1 + δ) ==
cumulative_interfering_workload j 0 (t1 + δ)
rewrite NEQ1 Bool.andb_true_l [_ < _ + _]leqNgt ltnS GE //= add0n => LE.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j LE : cumulative_interfering_workload j t1 (t1 + δ) <=
δ
cumulative_interference j 0 (t1 + δ) ==
cumulative_interfering_workload j 0 (t1 + δ)
rewrite eqn_leq; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j LE : cumulative_interfering_workload j t1 (t1 + δ) <=
δ
cumulative_interference j 0 (t1 + δ) <=
cumulative_interfering_workload j 0 (t1 + δ)
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j LE : cumulative_interfering_workload j t1 (t1 + δ) <=
δ
cumulative_interference j 0 (t1 + δ) <=
cumulative_interfering_workload j 0 (t1 + δ)
by apply H_no_speculative_exec.
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j LE : cumulative_interfering_workload j t1 (t1 + δ) <=
δ
cumulative_interfering_workload j 0 (t1 + δ) <=
cumulative_interference j 0 (t1 + δ)
apply (cumul_iw_bounded_by_cumul_i _ t_busy) => //=; rewrite (leqRW LE).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j LE : cumulative_interfering_workload j t1 (t1 + δ) <=
δ
δ <= cumulative_interference j t1 (t1 + δ)
eapply leq_trans; first apply busy_interval_has_uninterrupted_service.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j LE : cumulative_interfering_workload j t1 (t1 + δ) <=
δ
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ) <=
cumulative_interference j t1 (t1 + δ)
by have -> : service_during sched j t1 (t1 + δ) = 0
by rewrite cumulative_service_before_job_arrival_zero.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tNEQ1 : t1 <= job_arrival j GE : t1 + δ <= job_arrival j
~~ pending_earlier_and_at sched j (t1 + δ)
by rewrite /pending_earlier_and_at negb_and;
apply /orP; left ; rewrite -ltnNge ltnS.
Qed .
(** The latter two lemmas imply that [t1 + δ] is a quiet time ... *)
Lemma t1δ_is_quiet : quiet_time (t1 + δ).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
quiet_time (t1 + δ)
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
quiet_time (t1 + δ)
have LW := busy_interval_too_much_workload.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tLW : job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ)
quiet_time (t1 + δ)
have NEQ: forall a b c d , a >= c -> b >= d -> a + b <= c + d -> a = c /\ b = d by lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tLW : job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
quiet_time (t1 + δ)
apply NEQ in LW; first destruct LW as [EQ1 EQ2].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
quiet_time (t1 + δ)
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
quiet_time (t1 + δ)
apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
cumulative_interference j 0 (t1 + δ) ==
cumulative_interfering_workload j 0 (t1 + δ)
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
cumulative_interference j 0 (t1 + δ) ==
cumulative_interfering_workload j 0 (t1 + δ)
rewrite eqn_leq; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
cumulative_interference j 0 (t1 + δ) <=
cumulative_interfering_workload j 0 (t1 + δ)
* Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
cumulative_interference j 0 (t1 + δ) <=
cumulative_interfering_workload j 0 (t1 + δ)
by apply H_no_speculative_exec.
* Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
cumulative_interfering_workload j 0 (t1 + δ) <=
cumulative_interference j 0 (t1 + δ)
by apply (cumul_iw_bounded_by_cumul_i _ t_busy) => //=; rewrite EQ2.
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
~~ pending_earlier_and_at sched j (t1 + δ)
rewrite negb_and Bool.negb_involutive; apply /orP; right .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
completed_by sched j (t1 + δ)
rewrite /completed_by EQ1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tEQ1 : job_cost j = service_during sched j t1 (t1 + δ) EQ2 : cumulative_interfering_workload j t1 (t1 + δ) =
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
service_during sched j t1 (t1 + δ) <=
service sched j (t1 + δ)
by erewrite <-(service_cat); [apply leq_addl | ]; lia .
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tLW : job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
service_during sched j t1 (t1 + δ) <= job_cost j
eapply leq_trans; last by apply service_at_most_cost => //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tLW : job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
service_during sched j t1 (t1 + δ) <=
service sched j ?t
by erewrite <-(service_cat); [apply leq_addl | ]; lia .
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tLW : job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = d
cumulative_interference j t1 (t1 + δ) <=
cumulative_interfering_workload j t1 (t1 + δ)
move : H_is_busy_prefix => [_ [/andP [/eqP D _] _]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tLW : job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = dD : cumulative_interference j 0 t1 =
cumulative_interfering_workload j 0 t1
cumulative_interference j t1 (t1 + δ) <=
cumulative_interfering_workload j t1 (t1 + δ)
rewrite -(leq_add2l (definitions.cumulative_interference j 0 t1)) {2 }D.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tLW : job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = dD : cumulative_interference j 0 t1 =
cumulative_interfering_workload j 0 t1
cumulative_interference j 0 t1 +
cumulative_interference j t1 (t1 + δ) <=
cumulative_interfering_workload j 0 t1 +
cumulative_interfering_workload j t1 (t1 + δ)
rewrite -(big_cat_nat) //=; last by lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time tLW : job_cost j +
cumulative_interfering_workload j t1 (t1 + δ) <=
service_during sched j t1 (t1 + δ) +
cumulative_interference j t1 (t1 + δ) NEQ : forall a b c d : nat,
c <= a ->
d <= b -> a + b <= c + d -> a = c /\ b = dD : cumulative_interference j 0 t1 =
cumulative_interfering_workload j 0 t1
\sum_(0 <= i < t1 + δ)
cond_interference (fun => xpredT) j i <=
cumulative_interfering_workload j 0 t1 +
cumulative_interfering_workload j t1 (t1 + δ)
by rewrite -(big_cat_nat) //=; last by lia .
Qed .
(** ... which is a contradiction with the initial
assumption. *)
Lemma t1δ_is_quiet_contra : False .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
False
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
False
eapply H_no_quiet_time; last by apply t1δ_is_quiet.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
t1 < t1 + δ <= t1 + δ
apply /andP; split ; last by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ H_no_quiet_time : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
t1 < t1 + δ
by rewrite -addn1 leq_add2l.
Qed .
End CannotBeBusyForSoLong .
(** Since the interval cannot remain busy for so long, we prove
that the busy interval finishes at some point [t2 <= t1 +
δ]. *)
Lemma busy_interval_is_bounded :
exists t2 ,
t_busy < t2
/\ t2 <= t1 + δ
/\ busy_interval t1 t2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
move : H_is_busy_prefix => [NEQ [QT NQT]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j t
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
destruct ([exists t2 :'I_(t1 + δ).+1 , (t2 > t1) && quiet_time t2]) eqn :EX.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tEX : [exists t2 , (t1 < t2) && quiet_time t2] = true
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tEX : [exists t2 , (t1 < t2) && quiet_time t2] = true
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
have EX': exists (t2 : instant), ((t1 < t2 <= t1 + δ) && quiet_time t2).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tEX : [exists t2 , (t1 < t2) && quiet_time t2] = true
exists t2 : instant,
(t1 < t2 <= t1 + δ) && quiet_time t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tEX : [exists t2 , (t1 < t2) && quiet_time t2] = true
exists t2 : instant,
(t1 < t2 <= t1 + δ) && quiet_time t2
move : EX => /existsP [t2 /andP [LE QUIET]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : fintype_ordinal__canonical__fintype_Finite
(t1 + δ).+1 LE : t1 < t2 QUIET : quiet_time t2
exists t2 : instant,
(t1 < t2 <= t1 + δ) && quiet_time t2
exists t2 ; apply /andP; split => //;
by apply /andP; split ; last (rewrite -ltnS; apply ltn_ord). } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tEX : [exists t2 , (t1 < t2) && quiet_time t2] = true EX' : exists t2 : instant,
(t1 < t2 <= t1 + δ) && quiet_time t2
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
move : (ex_minnP EX') => [t2 /andP [/andP [GT LE] QUIET] MIN]; clear EX EX'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= n
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
exists t2 ; split ; [ | split ; [ |split ; [split ; [ | split ] | ] ]]; try done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= n
t_busy < t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= n
t_busy < t2
move_neq_up NEQ2. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nNEQ2 : t2 <= t_busy
False
move : (H_is_busy_prefix) => [_ [_ NQ]]; apply :(NQ t2) => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nNEQ2 : t2 <= t_busy NQ : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j t
t1 < t2 < t_busy.+1
by apply /andP; split => //.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= n
t1 <= job_arrival j < t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= n
t1 <= job_arrival j < t2
move : NEQ => /andP [IN1 IN2].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1
t1 <= job_arrival j < t2
apply /andP; split => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1
job_arrival j < t2
apply leq_ltn_trans with t_busy; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1
t_busy < t2
rewrite ltnNge; apply /negP; intros CONTR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1 CONTR : t2 <= t_busy
False
apply NQT with t2 => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nIN1 : t1 <= job_arrival j IN2 : job_arrival j < t_busy.+1 CONTR : t2 <= t_busy
t1 < t2 < t_busy.+1
by apply /andP; split ; last rewrite ltnS.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= n
forall t : nat,
t1 < t < t2 -> ~ definitions.quiet_time sched j t
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= n
forall t : nat,
t1 < t < t2 -> ~ definitions.quiet_time sched j t
move => t /andP [GT1 LT2] BUG.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nt : nat GT1 : t1 < t LT2 : t < t2 BUG : definitions.quiet_time sched j t
False
feed (MIN t); first (apply /andP; split ) => //. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nt : nat GT1 : t1 < t LT2 : t < t2 BUG : definitions.quiet_time sched j t
t1 < t <= t1 + δ
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 MIN : forall n : nat,
(t1 < n <= t1 + δ) && quiet_time n -> t2 <= nt : nat GT1 : t1 < t LT2 : t < t2 BUG : definitions.quiet_time sched j t
t1 < t <= t1 + δ
by apply /andP; split ; last apply leq_trans with (n := t2); eauto using ltnW. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 t : nat MIN : t2 <= t GT1 : t1 < t LT2 : t < t2 BUG : definitions.quiet_time sched j t
False
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt2 : nat GT : t1 < t2 LE : t2 <= t1 + δ QUIET : quiet_time t2 t : nat MIN : t2 <= t GT1 : t1 < t LT2 : t < t2 BUG : definitions.quiet_time sched j t
False
by lia . }
}
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tEX : [exists t2 , (t1 < t2) && quiet_time t2] = false
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tEX : [exists t2 , (t1 < t2) && quiet_time t2] = false
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
apply negbT in EX; rewrite negb_exists in EX; move : EX => /forallP ALL'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tALL' : forall
x : fintype_ordinal__canonical__fintype_Finite
(t1 + δ).+1 ,
~~ ((t1 < x) && quiet_time x)
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
have ALL: forall t , t1 < t <= t1 + δ -> ~ quiet_time t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tALL' : forall
x : fintype_ordinal__canonical__fintype_Finite
(t1 + δ).+1 ,
~~ ((t1 < x) && quiet_time x)
forall t : nat, t1 < t <= t1 + δ -> ~ quiet_time t
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tALL' : forall
x : fintype_ordinal__canonical__fintype_Finite
(t1 + δ).+1 ,
~~ ((t1 < x) && quiet_time x)
forall t : nat, t1 < t <= t1 + δ -> ~ quiet_time t
move => t /andP [GTt LEt] QUIET; rewrite -ltnS in LEt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tALL' : forall
x : fintype_ordinal__canonical__fintype_Finite
(t1 + δ).+1 ,
~~ ((t1 < x) && quiet_time x)t : nat GTt : t1 < t QUIET : quiet_time t LEt : t < (t1 + δ).+1
False
specialize (ALL' (Ordinal LEt)); rewrite negb_and /= GTt orFb in ALL'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tt : nat LEt : t < (t1 + δ).+1 GTt : t1 < t QUIET : quiet_time t ALL' : ~~ quiet_time t
False
by move : ALL' => /negP ALL'; apply ALL'; clear ALL'.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job PState : ProcessorState Job H_unit_service_proc_model : unit_service_proc_model
PState H3 : Interference Job H4 : InterferingWorkload Job H_no_speculative_exec : no_speculative_execution arr_seq : arrival_sequence Job H_arrival_times_are_consistent : consistent_arrival_times
arr_seq H_arrival_sequence_is_a_set : arrival_sequence_uniq
arr_seq tsk : Task sched : schedule PState H_work_conserving : work_conserving arr_seq sched H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched j : Job H_from_arrival_sequence : arrives_in arr_seq j H_job_task : job_of_task tsk j H_job_cost_positive : job_cost_positive j quiet_time := [eta definitions.quiet_time sched j] : instant -> bool busy_interval_prefix := definitions.busy_interval_prefix
sched j : instant -> instant -> Prop busy_interval := definitions.busy_interval sched j : instant -> instant -> Prop t_busy : instant H_j_is_pending : pending sched j t_busy t1 : instant H_is_busy_prefix : busy_interval_prefix t1 t_busy.+1 δ : duration H_δ_positive : 0 < δH_workload_is_bounded : workload_of_job arr_seq j t1
(t1 + δ) +
cumulative_interfering_workload
j t1 (t1 + δ) <= δ NEQ : t1 <= job_arrival j < t_busy.+1 QT : definitions.quiet_time sched j t1 NQT : forall t : nat,
t1 < t < t_busy.+1 ->
~ definitions.quiet_time sched j tALL' : forall
x : fintype_ordinal__canonical__fintype_Finite
(t1 + δ).+1 ,
~~ ((t1 < x) && quiet_time x)ALL : forall t : nat,
t1 < t <= t1 + δ -> ~ quiet_time t
exists t2 : nat,
t_busy < t2 /\ t2 <= t1 + δ /\ busy_interval t1 t2
by clear ALL'; exfalso ; eapply t1δ_is_quiet_contra.
}
Qed .
End UpperBound .
End BoundingBusyInterval .
End AbstractBusyIntervalExists .
(** We add some facts into the "Hint Database" basic_rt_facts, so Coq will be
able to apply them automatically where needed. *)
Global Hint Resolve
abstract_busy_interval_arrivals_before
job_completes_within_busy_interval
abstract_busy_interval_prefix_job_arrival
abstract_busy_interval_job_arrival
: basic_rt_facts.