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.definitions.service_inversion.busy_prefix.[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.busy_interval.pi.
(** * Service Inversion Lemmas *)
(** In this section, we prove a few lemmas about service inversion. *)
Section ServiceInversion .
(** Consider any type of jobs. *)
Context {Job : JobType}.
Context `{JobArrival Job}.
Context `{JobCost Job}.
(** Consider any kind of fully supply-consuming uniprocessor state model. *)
Context `{PState : ProcessorState Job}.
Hypothesis H_uniprocessor_proc_model : uniprocessor_model PState.
Hypothesis H_consumed_supply_proc_model : fully_consuming_proc_model PState.
(** Consider any arrival sequence with consistent, non-duplicate arrivals ... *)
Variable arr_seq : arrival_sequence Job.
Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.
(** ... and any uni-processor schedule of this arrival sequence... *)
Variable sched : schedule PState.
Hypothesis H_jobs_come_from_arrival_sequence :
jobs_come_from_arrival_sequence sched arr_seq.
(** ... 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.
(** In this section, we prove a few basic lemmas about priority inversion. *)
Section BasicLemmas .
(** Consider an JLDP policy that indicates a higher-or-equal
priority relation, and assume that the relation is
reflexive. *)
Context {JLDP : JLDP_policy Job}.
Hypothesis H_priority_is_reflexive : reflexive_priorities JLDP.
(** First, we show that a blackout at a time instant [t] implies
that there is no service inversion at time [t]. *)
Lemma blackout_implies_no_service_inversion :
forall (j : Job) (t : instant),
is_blackout sched t ->
~~ service_inversion arr_seq sched j t.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (t : instant),
is_blackout sched t ->
~~ service_inversion arr_seq sched j t
Proof .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (t : instant),
is_blackout sched t ->
~~ service_inversion arr_seq sched j t
move => j t SUP.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant SUP : is_blackout sched t
~~ service_inversion arr_seq sched j t
apply /negP => /andP [_ /hasP [s IN LP]].Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant SUP : is_blackout sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
False
move : (SUP) => /negP NSUP; apply : NSUP.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant SUP : is_blackout sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
has_supply sched t
by apply : receives_service_implies_has_supply.
Qed .
(** Similarly, there is no service inversion at an idle time instant. *)
Lemma idle_implies_no_service_inversion :
forall (j : Job) (t : instant),
is_idle arr_seq sched t ->
~~ service_inversion arr_seq sched j t.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (t : instant),
is_idle arr_seq sched t ->
~~ service_inversion arr_seq sched j t
Proof .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (t : instant),
is_idle arr_seq sched t ->
~~ service_inversion arr_seq sched j t
move => j t IDLE; rewrite /service_inversion.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant IDLE : is_idle arr_seq sched t
~~
((j \notin served_jobs_at arr_seq sched t) &&
has (fun jlp : Job => ~~ hep_job_at t jlp j)
(served_jobs_at arr_seq sched t))
rewrite negb_and negbK; apply /orP; right .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant IDLE : is_idle arr_seq sched t
~~
has (fun jlp : Job => ~~ hep_job_at t jlp j)
(served_jobs_at arr_seq sched t)
apply /hasPn => [s A].Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant IDLE : is_idle arr_seq sched t s : Job A : s \in served_jobs_at arr_seq sched t
~~ ~~ hep_job_at t s j
apply served_at_and_receives_service_consistent in A.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant IDLE : is_idle arr_seq sched t s : Job A : receives_service_at sched s t
~~ ~~ hep_job_at t s j
exfalso .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant IDLE : is_idle arr_seq sched t s : Job A : receives_service_at sched s t
False
by apply /negP; first apply : no_service_received_when_idle => //.
Qed .
(** Next, we prove that if a job [j] receives service at time [t],
job [j] does not incur service inversion at time [t]. *)
Lemma receives_service_implies_no_service_inversion :
forall (j : Job) (t : instant),
receives_service_at sched j t ->
~~ service_inversion arr_seq sched j t.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (t : instant),
receives_service_at sched j t ->
~~ service_inversion arr_seq sched j t
Proof .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (t : instant),
receives_service_at sched j t ->
~~ service_inversion arr_seq sched j t
move => j t RSERV; apply /negP => /andP [_ /hasP [s IN LP]].Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant RSERV : receives_service_at sched j t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
False
have EQ: j = s by apply : only_one_job_receives_service_at_uni => //.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job t : instant RSERV : receives_service_at sched j t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j EQ : j = s
False
subst ; move : LP => /negP NHEP; apply : NHEP.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant s : Job RSERV : receives_service_at sched s t IN : s \in served_jobs_at arr_seq sched t
hep_job_at t s s
by apply H_priority_is_reflexive.
Qed .
(** We show that cumulative service inversion received during an
interval <<[t1, t2)>> can be split into the sum of cumulative
service inversion <<[t1, t)>> and <<[t, t2)>> for any <<t2 \in
[t1, t3]>>. *)
Lemma service_inversion_cat :
forall (j : Job) (t1 t2 t : instant),
t1 <= t ->
t <= t2 ->
cumulative_service_inversion arr_seq sched j t1 t2
= cumulative_service_inversion arr_seq sched j t1 t
+ cumulative_service_inversion arr_seq sched j t t2.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (t1 t2 t : instant),
t1 <= t ->
t <= t2 ->
cumulative_service_inversion arr_seq sched j t1 t2 =
cumulative_service_inversion arr_seq sched j t1 t +
cumulative_service_inversion arr_seq sched j t t2
Proof .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (t1 t2 t : instant),
t1 <= t ->
t <= t2 ->
cumulative_service_inversion arr_seq sched j t1 t2 =
cumulative_service_inversion arr_seq sched j t1 t +
cumulative_service_inversion arr_seq sched j t t2
by move => j t1 t2 t LE1 LE2; rewrite -big_cat_nat //=. Qed .
(** Next, we show that cumulative service inversion on an interval
<<[al, ar)>> is bounded by the cumulative service inversion on
an interval <<[bl,br)>> if <<[al,ar)>> ⊆ <<[bl,br)>>. *)
Lemma service_inversion_widen :
forall (j : Job) (al ar bl br : instant),
bl <= al ->
ar <= br ->
cumulative_service_inversion arr_seq sched j al ar
<= cumulative_service_inversion arr_seq sched j bl br.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (al ar bl br : instant),
bl <= al ->
ar <= br ->
cumulative_service_inversion arr_seq sched j al ar <=
cumulative_service_inversion arr_seq sched j bl br
Proof .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP
forall (j : Job) (al ar bl br : instant),
bl <= al ->
ar <= br ->
cumulative_service_inversion arr_seq sched j al ar <=
cumulative_service_inversion arr_seq sched j bl br
move => j al ar bl br LE1 LE2.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job al, ar, bl, br : instant LE1 : bl <= al LE2 : ar <= br
cumulative_service_inversion arr_seq sched j al ar <=
cumulative_service_inversion arr_seq sched j bl br
rewrite /cumulative_service_inversion.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job al, ar, bl, br : instant LE1 : bl <= al LE2 : ar <= br
\sum_(al <= t < ar)
service_inversion arr_seq sched j t <=
\sum_(bl <= t < br)
service_inversion arr_seq sched j t
have [NEQ1|NEQ1] := leqP al ar; last by rewrite big_geq //.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job al, ar, bl, br : instant LE1 : bl <= al LE2 : ar <= br NEQ1 : al <= ar
\sum_(al <= t < ar)
service_inversion arr_seq sched j t <=
\sum_(bl <= t < br)
service_inversion arr_seq sched j t
rewrite (big_cat_nat _ _ _ LE1) //=; last by lia .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP j : Job al, ar, bl, br : instant LE1 : bl <= al LE2 : ar <= br NEQ1 : al <= ar
\sum_(al <= t < ar)
service_inversion arr_seq sched j t <=
\sum_(bl <= i < al)
service_inversion arr_seq sched j i +
\sum_(al <= i < br)
service_inversion arr_seq sched j i
by rewrite (big_cat_nat _ _ _ _ LE2) //= addnC -addnA leq_addr //=.
Qed .
End BasicLemmas .
(** In the following section, we prove one rewrite rule about
service inversion. *)
Section ServiceInversionRewrite .
(** Consider a reflexive JLDP policy. *)
Context {JLDP : JLDP_policy Job}.
Hypothesis H_priority_is_reflexive : reflexive_priorities JLDP.
(** Consider a time instant [t] ... *)
Variable t : instant.
(** ... and assume that there is supply at [t]. *)
Hypothesis H_supply : has_supply sched t.
(** Consider two (not necessarily distinct) jobs [j] and [j'] and
assume that job [j] is scheduled at time [t]. *)
Variables j j' : Job.
Hypothesis H_sched : scheduled_at sched j t.
(** Then the predicate "is there service inversion for job [j'] at
time [t]?" is equal to the predicate "is job [j] has lower
priority than job [j']?" *)
Lemma service_inversion_supply_sched :
service_inversion arr_seq sched j' t = ~~ hep_job_at t j j'.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t
service_inversion arr_seq sched j' t =
~~ hep_job_at t j j'
Proof .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t
service_inversion arr_seq sched j' t =
~~ hep_job_at t j j'
have RSERV : receives_service_at sched j t by apply ideal_progress_inside_supplies.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t
service_inversion arr_seq sched j' t =
~~ hep_job_at t j j'
apply /idP/idP.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t
service_inversion arr_seq sched j' t ->
~~ hep_job_at t j j'
{ Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t
service_inversion arr_seq sched j' t ->
~~ hep_job_at t j j'
move => /andP [IN /hasP [s SE LP]].Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t IN : j' \notin served_jobs_at arr_seq sched t s : Job SE : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j'
~~ hep_job_at t j j'
have EQj: s = j by apply : only_one_job_receives_service_at_uni.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t IN : j' \notin served_jobs_at arr_seq sched t s : Job SE : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j' EQj : s = j
~~ hep_job_at t j j'
by subst . } Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t
~~ hep_job_at t j j' ->
service_inversion arr_seq sched j' t
{ Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t
~~ hep_job_at t j j' ->
service_inversion arr_seq sched j' t
move => NHEP; apply /andP; split .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t NHEP : ~~ hep_job_at t j j'
j' \notin served_jobs_at arr_seq sched t
- Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t NHEP : ~~ hep_job_at t j j'
j' \notin served_jobs_at arr_seq sched t
move : NHEP; apply contra => SERV.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t SERV : j' \in served_jobs_at arr_seq sched t
hep_job_at t j j'
have EQj: j = j' by apply : only_one_job_receives_service_at_uni.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t SERV : j' \in served_jobs_at arr_seq sched t EQj : j = j'
hep_job_at t j j'
by subst ; apply H_priority_is_reflexive.
- Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t NHEP : ~~ hep_job_at t j j'
has (fun jlp : Job => ~~ hep_job_at t jlp j')
(served_jobs_at arr_seq sched t)
apply /hasP; exists j => //.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLDP : JLDP_policy Job H_priority_is_reflexive : reflexive_priorities JLDP t : instant H_supply : has_supply sched t j, j' : Job H_sched : scheduled_at sched j t RSERV : receives_service_at sched j t NHEP : ~~ hep_job_at t j j'
j \in served_jobs_at arr_seq sched t
by apply : receives_service_and_served_at_consistent. }
Qed .
End ServiceInversionRewrite .
(** In the last section, we prove that cumulative service inversion
is bounded by cumulative priority inversion. *)
Section PriorityInversion .
(** Consider a reflexive JLFP policy.
Note that, unlike the other sections, this section assumes a
JLFP policy. This is due to the fact that priority inversion
is defined in terms of JLFP policies. This is not a
fundamental assumption and may be relaxed in the future. *)
Context {JLFP : JLFP_policy Job}.
Hypothesis H_priority_is_reflexive : reflexive_job_priorities JLFP.
(** We prove that service inversion implies priority inversion ... *)
Lemma service_inv_implies_priority_inv :
forall (j : Job) (t : instant),
service_inversion arr_seq sched j t ->
priority_inversion arr_seq sched j t.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP
forall (j : Job) (t : instant),
service_inversion arr_seq sched j t ->
priority_inversion arr_seq sched j t
Proof .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP
forall (j : Job) (t : instant),
service_inversion arr_seq sched j t ->
priority_inversion arr_seq sched j t
move => j t.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant
service_inversion arr_seq sched j t ->
priority_inversion arr_seq sched j t
move => /andP [NSERV /hasP [s IN LP]]; apply /andP; split .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
j \notin scheduled_jobs_at arr_seq sched t
{ Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
j \notin scheduled_jobs_at arr_seq sched t
apply /negP => INj; rewrite scheduled_jobs_at_iff in INj => //.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j INj : scheduled_at sched j t
False
have EQ : s = j.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j INj : scheduled_at sched j t
s = j
{ Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j INj : scheduled_at sched j t
s = j
apply : H_uniprocessor_proc_model => //.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j INj : scheduled_at sched j t
scheduled_at sched s t
by eapply service_at_implies_scheduled_at, served_at_and_receives_service_consistent. } Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j INj : scheduled_at sched j t EQ : s = j
False
by subst ; move : LP => /negP LP; apply : LP; apply H_priority_is_reflexive. } Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
has (fun jlp : Job => ~~ hep_job jlp j)
(scheduled_jobs_at arr_seq sched t)
{ Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
has (fun jlp : Job => ~~ hep_job jlp j)
(scheduled_jobs_at arr_seq sched t)
apply /hasP; exists s => //.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
s \in scheduled_jobs_at arr_seq sched t
rewrite scheduled_jobs_at_iff => //.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t : instant NSERV : j \notin served_jobs_at arr_seq sched t s : Job IN : s \in served_jobs_at arr_seq sched t LP : ~~ hep_job_at t s j
scheduled_at sched s t
by apply service_at_implies_scheduled_at; apply : served_at_and_receives_service_consistent. }
Qed .
(** ... and, as a corollary, it is easy to see that cumulative
service inversion is bounded by cumulative priority
inversion. *)
Corollary cumul_service_inv_le_cumul_priority_inv :
forall (j : Job) (t1 t2 : instant),
cumulative_service_inversion arr_seq sched j t1 t2
<= cumulative_priority_inversion arr_seq sched j t1 t2.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP
forall (j : Job) (t1 t2 : instant),
cumulative_service_inversion arr_seq sched j t1 t2 <=
cumulative_priority_inversion arr_seq sched j t1 t2
Proof .Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP
forall (j : Job) (t1 t2 : instant),
cumulative_service_inversion arr_seq sched j t1 t2 <=
cumulative_priority_inversion arr_seq sched j t1 t2
move => j t1 t2; apply leq_sum => t _.Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t1, t2 : instant t : nat
service_inversion arr_seq sched j t <=
priority_inversion arr_seq sched j t
have L : forall (a b : bool), (a -> b) -> a <= b by clear ; move => [] [].Job : JobType H : JobArrival Job H0 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_consumed_supply_proc_model : fully_consuming_proc_model
PState arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState H_jobs_come_from_arrival_sequence : jobs_come_from_arrival_sequence
sched arr_seq H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute
sched H_completed_jobs_dont_execute : completed_jobs_dont_execute
sched JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP j : Job t1, t2 : instant t : nat L : forall a b : bool, (a -> b) -> a <= b
service_inversion arr_seq sched j t <=
priority_inversion arr_seq sched j t
by apply L, service_inv_implies_priority_inv.
Qed .
End PriorityInversion .
End ServiceInversion .
(** In the following, we prove that the cumulative service inversion
in a busy interval prefix is bounded. *)
Section ServiceInversionIsBounded .
(** Consider any type of tasks ... *)
Context {Task : TaskType}.
Context `{TaskCost Task}.
Context `{TaskMaxNonpreemptiveSegment 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 fully supply-consuming unit-supply
uniprocessor state model. *)
Context `{PState : ProcessorState Job}.
Hypothesis H_uniprocessor_proc_model : uniprocessor_model PState.
Hypothesis H_unit_supply_proc_model : unit_supply_proc_model PState.
Hypothesis H_consumed_supply_proc_model : fully_consuming_proc_model PState.
(** Consider an JLFP policy that indicates a higher-or-equal priority
relation, and assume that the relation is reflexive and
transitive. *)
Context {JLFP : JLFP_policy Job}.
Hypothesis H_priority_is_reflexive : reflexive_job_priorities JLFP.
Hypothesis H_priority_is_transitive : transitive_job_priorities JLFP.
(** Consider any arrival sequence with consistent, non-duplicate arrivals ... *)
Variable arr_seq : arrival_sequence Job.
Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.
(** ... and any uni-processor schedule of this arrival sequence. *)
Variable sched : schedule PState.
(** Next, allow for any work-bearing notion of job readiness ... *)
Context `{!JobReady Job PState}.
Hypothesis H_job_ready : work_bearing_readiness arr_seq sched.
(** ... and assume that the schedule is valid. *)
Hypothesis H_sched_valid : valid_schedule sched arr_seq.
(** In addition, we assume the existence of a function mapping jobs
to their preemption points ... *)
Context `{JobPreemptable Job}.
(** ... and assume that it defines a valid preemption model with
bounded non-preemptive segments. *)
Hypothesis H_valid_preemption_model : valid_preemption_model arr_seq sched.
Hypothesis H_valid_model_with_bounded_nonpreemptive_segments :
valid_model_with_bounded_nonpreemptive_segments arr_seq sched.
(** Next, we assume that the schedule respects the scheduling policy. *)
Hypothesis H_respects_policy : respects_JLFP_policy_at_preemption_point arr_seq sched JLFP.
(** In the following section, we prove that cumulative service
inversion in a busy-interval prefix is necessarily caused by one
lower-priority job. *)
Section CumulativeServiceInversionFromOneJob .
(** Consider any job [j] with a positive job cost. *)
Variable j : Job.
Hypothesis H_j_arrives : arrives_in arr_seq j.
Hypothesis H_job_cost_positive : job_cost_positive j.
(** Let <[t1, t2)>> be a busy-interval prefix. *)
Variable t1 t2 : instant.
Hypothesis H_busy_prefix : busy_interval_prefix arr_seq sched j t1 t2.
(** Consider a time instant [t : t <= t2] such that ... *)
Variable t : instant.
Hypothesis H_t_le_t2 : t <= t2.
(** ... the cumulative service inversion is positive in <<[t1, t)>>. *)
Hypothesis H_service_inversion_positive : 0 < cumulative_service_inversion arr_seq sched j t1 t.
(** First, note that there is a lower-priority job that receives
service at some time during the time interval <<[t1, t)>>. *)
Local Lemma lower_priority_job_receives_service :
exists (jlp : Job) (to : instant),
t1 <= to < t
/\ ~~ hep_job jlp j
/\ receives_service_at sched jlp to.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 t
exists (jlp : Job) (to : instant),
t1 <= to < t /\
~~ hep_job jlp j /\ receives_service_at sched jlp to
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 t
exists (jlp : Job) (to : instant),
t1 <= to < t /\
~~ hep_job jlp j /\ receives_service_at sched jlp to
move : H_service_inversion_positive; rewrite sum_nat_gt0 filter_predT => /hasP [t' IN POS].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tt' : Datatypes_nat__canonical__eqtype_Equality IN : t' \in index_iota t1 t POS : 0 < service_inversion arr_seq sched j t'
exists (jlp : Job) (to : instant),
t1 <= to < t /\
~~ hep_job jlp j /\ receives_service_at sched jlp to
rewrite mem_index_iota in IN; rewrite lt0b in POS.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tt' : Datatypes_nat__canonical__eqtype_Equality IN : t1 <= t' < t POS : service_inversion arr_seq sched j t'
exists (jlp : Job) (to : instant),
t1 <= to < t /\
~~ hep_job jlp j /\ receives_service_at sched jlp to
move : POS => /andP [NIN /hasP [jlp INlp LP]].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tt' : Datatypes_nat__canonical__eqtype_Equality IN : t1 <= t' < t NIN : j \notin served_jobs_at arr_seq sched t' jlp : Job INlp : jlp \in served_jobs_at arr_seq sched t' LP : ~~ hep_job_at t' jlp j
exists (jlp : Job) (to : instant),
t1 <= to < t /\
~~ hep_job jlp j /\ receives_service_at sched jlp to
exists jlp , t'.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tt' : Datatypes_nat__canonical__eqtype_Equality IN : t1 <= t' < t NIN : j \notin served_jobs_at arr_seq sched t' jlp : Job INlp : jlp \in served_jobs_at arr_seq sched t' LP : ~~ hep_job_at t' jlp j
t1 <= t' < t /\
~~ hep_job jlp j /\ receives_service_at sched jlp t'
by rewrite IN LP.
Qed .
(** Then we prove that the service inversion incurred by job [j]
can only be caused by _one_ lower priority job. *)
Lemma cumulative_service_inversion_from_one_job :
exists (jlp : Job),
job_arrival jlp < t1
/\ ~~ hep_job jlp j
/\ cumulative_service_inversion arr_seq sched j t1 t = service_during sched jlp t1 t.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 t
exists jlp : Job,
job_arrival jlp < t1 /\
~~ hep_job jlp j /\
cumulative_service_inversion arr_seq sched j t1 t =
service_during sched jlp t1 t
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 t
exists jlp : Job,
job_arrival jlp < t1 /\
~~ hep_job jlp j /\
cumulative_service_inversion arr_seq sched j t1 t =
service_during sched jlp t1 t
have [jlp [to [NEQ [LP SERV]]]] := lower_priority_job_receives_service.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to
exists jlp : Job,
job_arrival jlp < t1 /\
~~ hep_job jlp j /\
cumulative_service_inversion arr_seq sched j t1 t =
service_during sched jlp t1 t
exists jlp ; split ; last split => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to
job_arrival jlp < t1
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to
job_arrival jlp < t1
apply : low_priority_job_arrives_before_busy_interval_prefix => //=.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to
t1 <= ?Goal0 < t2
+ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to
t1 <= ?Goal0 < t2
by instantiate (1 := to); lia .
+ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to
scheduled_at sched jlp to
by apply service_at_implies_scheduled_at.
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to
cumulative_service_inversion arr_seq sched j t1 t =
service_during sched jlp t1 t
apply : eq_sum_seq => t'; rewrite mem_index_iota => NEQt' _.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t
service_inversion arr_seq sched j t' ==
service_at sched jlp t'
have [ZERO | POS] := unit_supply_proc_service_case H_unit_supply_proc_model sched jlp t'.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0
service_inversion arr_seq sched j t' ==
service_at sched jlp t'
+ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0
service_inversion arr_seq sched j t' ==
service_at sched jlp t'
rewrite ZERO eqb0; apply /negP => /andP [_ /hasP [joo SERVoo LPoo]].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
False
have EQ : jlp = joo.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
jlp = joo
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
jlp = joo
apply : only_one_pi_job => //=.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
t1 <= ?Goal1 < t2
* Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
t1 <= ?Goal1 < t2
by instantiate (1 := to); lia .
* Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
scheduled_at sched jlp to
by apply service_at_implies_scheduled_at.
* Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
t1 <= ?Goal1 < t2
by instantiate (1 := t'); lia .
* Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
scheduled_at sched joo t'
apply : service_at_implies_scheduled_at.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j
0 < service_at sched joo t'
by apply : served_at_and_receives_service_consistent.
} Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 joo : Job SERVoo : joo \in served_jobs_at arr_seq sched t' LPoo : ~~ hep_job_at t' joo j EQ : jlp = joo
False
subst joo.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 LPoo : ~~ hep_job_at t' jlp j SERVoo : jlp \in served_jobs_at arr_seq sched t'
False
apply served_at_and_receives_service_consistent in SERVoo.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t ZERO : service_at sched jlp t' = 0 LPoo : ~~ hep_job_at t' jlp j SERVoo : receives_service_at sched jlp t'
False
by move : SERVoo; rewrite /receives_service_at ZERO.
+ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t POS : service_at sched jlp t' = 1
service_inversion arr_seq sched j t' ==
service_at sched jlp t'
rewrite POS eqb1; apply /andP; split .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t POS : service_at sched jlp t' = 1
j \notin served_jobs_at arr_seq sched t'
* Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t POS : service_at sched jlp t' = 1
j \notin served_jobs_at arr_seq sched t'
apply /negP => IN; apply served_at_and_receives_service_consistent in IN.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t POS : service_at sched jlp t' = 1 IN : receives_service_at sched j t'
False
have EQ: j = jlp by apply : only_one_job_receives_service_at_uni => //; rewrite /receives_service_at.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t POS : service_at sched jlp t' = 1 IN : receives_service_at sched j t' EQ : j = jlp
False
by subst jlp; move : LP => /negP LP; apply : LP; apply H_priority_is_reflexive.
* Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t POS : service_at sched jlp t' = 1
has (fun jlp : Job => ~~ hep_job_at t' jlp j)
(served_jobs_at arr_seq sched t')
apply /hasP; exists jlp ; last by apply : LP.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t POS : service_at sched jlp t' = 1
jlp \in served_jobs_at arr_seq sched t'
apply receives_service_and_served_at_consistent => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_job_cost_positive : job_cost_positive j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 H_service_inversion_positive : 0 <
cumulative_service_inversion
arr_seq sched j t1 tjlp : Job to : instant NEQ : t1 <= to < t LP : ~~ hep_job jlp j SERV : receives_service_at sched jlp to t' : Datatypes_nat__canonical__eqtype_Equality NEQt' : t1 <= t' < t POS : service_at sched jlp t' = 1
receives_service_at sched jlp t'
by rewrite /receives_service_at POS.
Qed .
End CumulativeServiceInversionFromOneJob .
(** In this section, we prove that, given a job [j] with a busy
interval prefix <<[t1, t2)>> and a lower-priority job [jlp], the
service of [jlp] within the busy interval prefix is bounded by
the maximum non-preemptive segment of job [jlp]. *)
Section ServiceOfLowPriorityJobIsBounded .
(** Consider an arbitrary job [j] with positive cost ... *)
Variable j : Job.
Hypothesis H_j_arrives : arrives_in arr_seq j.
Hypothesis H_j_job_cost_positive : job_cost_positive j.
(** ... and a lower-priority job [jlp]. *)
Variable jlp : Job.
Hypothesis H_jlp_arrives : arrives_in arr_seq jlp.
Hypothesis H_jlp_lp : ~~ hep_job jlp j.
(** Let <<[t1, t2)>> be a busy interval prefix of job [j]. *)
Variable t1 t2 : instant.
Hypothesis H_busy_prefix : busy_interval_prefix arr_seq sched j t1 t2.
(** First, we consider a scenario when there is no preemption time
inside of the busy interval prefix _but_ there is a time
instant where [jlp] is scheduled. In this case, the cumulative
service inversion of job [j] in the time interval <<[t1, t2)>>
is bounded by the total service of job [jlp] received in the
interval <<[t1, t2)>>. *)
Local Lemma no_preemption_impl_service_inv_bounded :
(forall t , t1 <= t < t2 -> ~~ preemption_time arr_seq sched t) ->
(exists t , t1 <= t < t2 /\ scheduled_at sched jlp t) ->
cumulative_service_inversion arr_seq sched j t1 t2 <= service_during sched jlp t1 t2.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2
(forall t : nat,
t1 <= t < t2 -> ~~ preemption_time arr_seq sched t) ->
(exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp t) ->
cumulative_service_inversion arr_seq sched j t1 t2 <=
service_during sched jlp t1 t2
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2
(forall t : nat,
t1 <= t < t2 -> ~~ preemption_time arr_seq sched t) ->
(exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp t) ->
cumulative_service_inversion arr_seq sched j t1 t2 <=
service_during sched jlp t1 t2
move => NPT SCHED.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp t
cumulative_service_inversion arr_seq sched j t1 t2 <=
service_during sched jlp t1 t2
rewrite [leqLHS]big_seq [leqRHS]big_seq; apply leq_sum => t.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality
t \in index_iota t1 t2 ->
service_inversion arr_seq sched j t <=
service_at sched jlp t
rewrite mem_index_iota => /andP [LE LT].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2
service_inversion arr_seq sched j t <=
service_at sched jlp t
have F : forall (b : bool) (n : nat), (b -> 0 < n) -> b <= n by lia .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 F : forall (b : bool) (n : nat),
(b -> 0 < n) -> b <= n
service_inversion arr_seq sched j t <=
service_at sched jlp t
apply : F => /andP [ZE /hasP [h IN LPh]].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j
0 < service_at sched jlp t
have EQ: h = jlp; last by subst ; apply : served_at_and_receives_service_consistent.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j
h = jlp
apply : H_uniprocessor_proc_model.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j
scheduled_at ?Goal h ?Goal0
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j
scheduled_at ?Goal h ?Goal0
by apply served_at_and_receives_service_consistent in IN; apply : service_at_implies_scheduled_at. } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j
scheduled_at sched jlp t
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tSCHED : exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j
scheduled_at sched jlp t
move : SCHED => [t' [/andP [LE' LT'] SCHED]].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j t' : nat LE' : t1 <= t' LT' : t' < t2 SCHED : scheduled_at sched jlp t'
scheduled_at sched jlp t
unshelve apply : neg_pt_scheduled_continuous => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j t' : nat LE' : t1 <= t' LT' : t' < t2 SCHED : scheduled_at sched jlp t'
t1 <= t' < t2
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j t' : nat LE' : t1 <= t' LT' : t' < t2 SCHED : scheduled_at sched jlp t'
t1 <= t' < t2
by generalize dependent t'; clear ; lia .
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched tt : Datatypes_nat__canonical__eqtype_Equality LE : t1 <= t LT : t < t2 ZE : j \notin served_jobs_at arr_seq sched t h : Job IN : h \in served_jobs_at arr_seq sched t LPh : ~~ hep_job_at t h j t' : nat LE' : t1 <= t' LT' : t' < t2 SCHED : scheduled_at sched jlp t'
t1 <= t < t2
by generalize dependent t; clear ; lia .
}
Qed .
(** In this section, we assume that [jlp] is scheduled inside of
the busy interval prefix and prove that its service is bounded
by [jlp]'s maximum non-preemptive segment. *)
Section ServiceOfLPJobIsBounded .
(** Consider an arbitrary time instant [t] such that [t <= t2]. *)
Variables t : instant.
Hypothesis H_t_le_t2 : t <= t2.
(** Consider a second time instant [st] such that [t1 <= st < t]
and [jlp] is scheduled at time [st]. *)
Variable st : instant.
Hypothesis H_t1_le_st_lt_t : t1 <= st < t.
Hypothesis H_jlp_sched : scheduled_at sched jlp st.
(** Consider a preemption point [σ] of job [jlp] such that ... *)
Variable σ : duration.
Hypothesis H_σ_is_pt : job_preemptable jlp σ.
(** ... [σ] is greater than or equal to the service of [jlp] at
time [t1] but exceeds the service by at most
[job_max_nonpreemptive_segment jlp - ε]. *)
Hypothesis H_σ_constrained :
service sched jlp t1
<= σ
<= service sched jlp t1 + (job_max_nonpreemptive_segment jlp - ε).
(** Next, we perform case analysis on whether job [jlp] has
reached [σ] units of service by time [t]. *)
(** First, assume that the service of [jlp] at time [t] is
smaller than [σ]. In this case, it is easy to see from the
hypothesis [H_σ_constrained] that the service received by
[jlp] within time interval <<[t1, t)>> is bounded by
[job_max_nonpreemptive_segment jlp - ε]. *)
Local Lemma small_service_implies_bounded_service :
service sched jlp t < σ ->
service_during sched jlp t1 t <= job_max_nonpreemptive_segment jlp - ε.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 )
service sched jlp t < σ ->
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 )
service sched jlp t < σ ->
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
move => B; move_neq_up CO.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) B : service sched jlp t < σ CO : job_max_nonpreemptive_segment jlp - 1 <
service_during sched jlp t1 t
False
have E : σ <= service sched jlp t1 + service_during sched jlp t1 t by lia .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) B : service sched jlp t < σ CO : job_max_nonpreemptive_segment jlp - 1 <
service_during sched jlp t1 t E : σ <=
service sched jlp t1 +
service_during sched jlp t1 t
False
by move : B E; rewrite service_cat /service; lia .
Qed .
(** Next, assume that [σ <= service sched jlp t]. In this case,
we can show that [jlp] is preempted after it reaches [σ]
units of service and hence, again, the service during <<[t1,
t)>> is bounded by [job_max_nonpreemptive_segment jlp - ε]. *)
Local Lemma big_service_implies_bounded_service :
σ <= service sched jlp t ->
service_during sched jlp t1 t <= job_max_nonpreemptive_segment jlp - ε.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 )
σ <= service sched jlp t ->
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 )
σ <= service sched jlp t ->
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
rewrite -[service_during _ _ _ _ <= _](leq_add2l (service sched jlp t1)).Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 )
σ <= service sched jlp t ->
service sched jlp t1 + service_during sched jlp t1 t <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
rewrite leq_eqVlt => /orP [/eqP EQ|GT].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) EQ : σ = service sched jlp t
service sched jlp t1 + service_during sched jlp t1 t <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) EQ : σ = service sched jlp t
service sched jlp t1 + service_during sched jlp t1 t <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
by rewrite service_cat; [ rewrite -EQ; move : H_σ_constrained => /andP [A B] | lia ]. } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t
service sched jlp t1 + service_during sched jlp t1 t <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
exfalso .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t
False
have [pt [LTpt EQ]] : exists pt , pt < t /\ service sched jlp pt = σ.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t
exists pt : nat, pt < t /\ service sched jlp pt = σ
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t
exists pt : nat, pt < t /\ service sched jlp pt = σ
by apply exists_intermediate_service => //; apply unit_supply_is_unit_service. } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ
False
have NPT : ~~ preemption_time arr_seq sched t1.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ
~~ preemption_time arr_seq sched t1
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ
~~ preemption_time arr_seq sched t1
by eapply lower_priority_job_scheduled_implies_no_preemption_time
with (t1 := t1) (t2:= t2) (t := st) (jlp := jlp) (j := j)=> //; lia . } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1
False
have LEpt: t1 <= pt.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1
t1 <= pt
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1
t1 <= pt
move_neq_up LEpt. Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1
False
have EQ1: service sched jlp t1 = σ.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1
service sched jlp t1 = σ
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1
service sched jlp t1 = σ
apply /eqP; rewrite eqn_leq; apply /andP; split ;
first by move : H_σ_constrained => /andP [A B].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1
σ <= service sched jlp t1
by rewrite -EQ; apply : service_monotonic; lia . } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ
False
have PT : preemption_time arr_seq sched t1.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ
preemption_time arr_seq sched t1
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ
preemption_time arr_seq sched t1
rewrite /preemption_time.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ
match scheduled_job_at arr_seq sched t1 with
| Some j => job_preemptable j (service sched j t1)
| None => true
end
have ->: scheduled_job_at arr_seq sched t1 = Some jlp.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ
scheduled_job_at arr_seq sched t1 = Some jlp
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ
scheduled_job_at arr_seq sched t1 = Some jlp
apply /eqP; rewrite scheduled_job_at_scheduled_at => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ
scheduled_at sched jlp t1
eapply lower_priority_job_continuously_scheduled
with (t1 := t1) (t2:= t2) (t := st) (jlp := jlp) (j := j)=> //=; lia . } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ
job_preemptable jlp (service sched jlp t1)
by rewrite EQ1.
} Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : pt < t1 EQ1 : service sched jlp t1 = σ PT : preemption_time arr_seq sched t1
False
by rewrite PT in NPT. } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : t1 <= pt
False
have [t' [NEQ' [SERV' SCHED']]] := kth_scheduling_time sched _ _ _ _ EQ GT.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : t1 <= pt t' : nat NEQ' : pt <= t' < t SERV' : service sched jlp t' = σ SCHED' : scheduled_at sched jlp t'
False
have PT : preemption_time arr_seq sched t'.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : t1 <= pt t' : nat NEQ' : pt <= t' < t SERV' : service sched jlp t' = σ SCHED' : scheduled_at sched jlp t'
preemption_time arr_seq sched t'
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : t1 <= pt t' : nat NEQ' : pt <= t' < t SERV' : service sched jlp t' = σ SCHED' : scheduled_at sched jlp t'
preemption_time arr_seq sched t'
move : SCHED'; erewrite <-scheduled_job_at_scheduled_at => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : t1 <= pt t' : nat NEQ' : pt <= t' < t SERV' : service sched jlp t' = σ
scheduled_job_at arr_seq sched t' == Some jlp ->
preemption_time arr_seq sched t'
by rewrite /preemption_time; move => /eqP ->; rewrite SERV'. } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : t1 <= pt t' : nat NEQ' : pt <= t' < t SERV' : service sched jlp t' = σ SCHED' : scheduled_at sched jlp t' PT : preemption_time arr_seq sched t'
False
move : H_jlp_lp => /negP LP2; apply : LP2.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : t1 <= pt t' : nat NEQ' : pt <= t' < t SERV' : service sched jlp t' = σ SCHED' : scheduled_at sched jlp t' PT : preemption_time arr_seq sched t'
hep_job jlp j
apply : scheduled_at_preemption_time_implies_higher_or_equal_priority => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) GT : σ < service sched jlp t pt : nat LTpt : pt < t EQ : service sched jlp pt = σ NPT : ~~ preemption_time arr_seq sched t1 LEpt : t1 <= pt t' : nat NEQ' : pt <= t' < t SERV' : service sched jlp t' = σ SCHED' : scheduled_at sched jlp t' PT : preemption_time arr_seq sched t'
t1 <= t' < t2
by move : NEQ' LEpt H_t_le_t2; clear ; lia .
Qed .
(** Either way, the service of job [jlp] during the time
interval <<[t1, t)>> is bounded by
[job_max_nonpreemptive_segment jlp - ε]. *)
Local Lemma lp_job_bounded_service_aux :
service_during sched jlp t1 t <= job_max_nonpreemptive_segment jlp - ε.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 )
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 )
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
have [B|S] := leqP σ (service sched jlp t); last first .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) S : service sched jlp t < σ
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) S : service sched jlp t < σ
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
by apply small_service_implies_bounded_service.
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : instant H_t_le_t2 : t <= t2 st : instant H_t1_le_st_lt_t : t1 <= st < t H_jlp_sched : scheduled_at sched jlp st σ : duration H_σ_is_pt : job_preemptable jlp σ H_σ_constrained : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp -
1 ) B : σ <= service sched jlp t
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
by apply big_service_implies_bounded_service.
Qed .
End ServiceOfLPJobIsBounded .
(** Note that the preemption point [σ] assumed in the previous
section always exists. *)
Local Remark preemption_point_of_jlp_exists :
exists σ ,
service sched jlp t1 <= σ <= service sched jlp t1 + (job_max_nonpreemptive_segment jlp - ε)
/\ job_preemptable jlp σ.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2
exists σ : nat,
service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp σ
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2
exists σ : nat,
service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp σ
move : (proj2 (H_valid_model_with_bounded_nonpreemptive_segments) jlp H_jlp_arrives) =>[_ EXPP].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 EXPP : nonpreemptive_regions_have_bounded_length jlp
exists σ : nat,
service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp σ
have T: 0 <= service sched jlp t1 <= job_cost jlp.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 EXPP : nonpreemptive_regions_have_bounded_length jlp
0 <= service sched jlp t1 <= job_cost jlp
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 EXPP : nonpreemptive_regions_have_bounded_length jlp
0 <= service sched jlp t1 <= job_cost jlp
by apply /andP; split => [//|]; apply service_at_most_cost, unit_supply_is_unit_service => //. } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 EXPP : nonpreemptive_regions_have_bounded_length jlp T : 0 <= service sched jlp t1 <= job_cost jlp
exists σ : nat,
service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp σ
by move : (EXPP (service sched jlp t1) T) => [pt [NEQ2 PP]]; exists pt .
Qed .
(** We strengthen the lemma [lp_job_bounded_service_aux] by
removing the assumption that [jlp] is scheduled somewhere in
the busy interval prefix. *)
Lemma lp_job_bounded_service :
forall t ,
t <= t2 ->
service_during sched jlp t1 t <= job_max_nonpreemptive_segment jlp - ε.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2
forall t : nat,
t <= t2 ->
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2
forall t : nat,
t <= t2 ->
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
move => t LT.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
have [ZE|POS] := posnP (service_during sched jlp t1 t); first by rewrite ZE.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 t
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
have [st [NEQ SCHED]] := cumulative_service_implies_scheduled _ _ _ _ POS.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
have [σ [EX PTσ]] := preemption_point_of_jlp_exists.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st σ : nat EX : service sched jlp t1 <= σ <=
service sched jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PTσ : job_preemptable jlp σ
service_during sched jlp t1 t <=
job_max_nonpreemptive_segment jlp - 1
by apply : lp_job_bounded_service_aux.
Qed .
(** Finally, we remove [jlp] from the RHS of the inequality by
taking the maximum over all jobs that arrive before time [t1]. *)
Lemma lp_job_bounded_service_max :
forall t ,
t <= t2 ->
service_during sched jlp t1 t <= max_lp_nonpreemptive_segment arr_seq j t1.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2
forall t : nat,
t <= t2 ->
service_during sched jlp t1 t <=
max_lp_nonpreemptive_segment arr_seq j t1
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2
forall t : nat,
t <= t2 ->
service_during sched jlp t1 t <=
max_lp_nonpreemptive_segment arr_seq j t1
move => t LT.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2
service_during sched jlp t1 t <=
max_lp_nonpreemptive_segment arr_seq j t1
have [ZE|POS] := posnP (service_during sched jlp t1 t); first by rewrite ZE.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 t
service_during sched jlp t1 t <=
max_lp_nonpreemptive_segment arr_seq j t1
have [st [NEQ SCHED]] := cumulative_service_implies_scheduled _ _ _ _ POS.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
service_during sched jlp t1 t <=
max_lp_nonpreemptive_segment arr_seq j t1
rewrite (leqRW (lp_job_bounded_service _ _)) //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
job_max_nonpreemptive_segment jlp - 1 <=
max_lp_nonpreemptive_segment arr_seq j t1
rewrite /max_lp_nonpreemptive_segment -(leqRW (leq_bigmax_cond_seq _ _ _ jlp _ _)) //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
jlp \in arrivals_before arr_seq t1
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
jlp \in arrivals_before arr_seq t1
apply : arrived_between_implies_in_arrivals => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
arrived_between jlp 0 t1
apply /andP; split => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
job_arrival jlp < t1
by (apply : low_priority_job_arrives_before_busy_interval_prefix; try apply : H_busy_prefix) => //; lia .
} Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
~~ hep_job jlp j && (0 < job_cost jlp)
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP j : Job H_j_arrives : arrives_in arr_seq j H_j_job_cost_positive : job_cost_positive j jlp : Job H_jlp_arrives : arrives_in arr_seq jlp H_jlp_lp : ~~ hep_job jlp j t1, t2 : instant H_busy_prefix : busy_interval_prefix arr_seq sched j
t1 t2 t : nat LT : t <= t2 POS : 0 < service_during sched jlp t1 tst : nat NEQ : t1 <= st < t SCHED : scheduled_at sched jlp st
~~ hep_job jlp j && (0 < job_cost jlp)
by rewrite H_jlp_lp andTb; apply : scheduled_implies_positive_cost. }
Qed .
End ServiceOfLowPriorityJobIsBounded .
(** Let [tsk] be any task to be analyzed. *)
Variable tsk : Task.
(** Let [blocking_bound] be a bound on the maximum length of a
nonpreemptive segment of a lower-priority job. *)
Variable blocking_bound : duration -> duration.
(** We show that, if the maximum length of a nonpreemptive segment
is bounded by the blocking bound, ... *)
Hypothesis H_priority_inversion_is_bounded_by_blocking :
forall j t1 t2 ,
arrives_in arr_seq j ->
job_of_task tsk j ->
busy_interval_prefix arr_seq sched j t1 t2 ->
max_lp_nonpreemptive_segment arr_seq j t1 <= blocking_bound (job_arrival j - t1).
(** ... then the service inversion incurred by any job is bounded by
the blocking bound. *)
Lemma service_inversion_is_bounded :
service_inversion_is_bounded_by arr_seq sched tsk blocking_bound.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)
service_inversion_is_bounded_by arr_seq sched tsk
blocking_bound
Proof .Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)
service_inversion_is_bounded_by arr_seq sched tsk
blocking_bound
move => j ARR TSK POS t1 t2 BUSY.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2
cumulative_service_inversion arr_seq sched j t1 t2 <=
blocking_bound (job_arrival j - t1)
rewrite -(leqRW (H_priority_inversion_is_bounded_by_blocking _ _ _ _ _ _ )) //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
edestruct busy_interval_pi_cases as [CPI|PI]; (try apply BUSY) => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 CPI : cumulative_priority_inversion arr_seq sched j t1
t2 = 0
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 CPI : cumulative_priority_inversion arr_seq sched j t1
t2 = 0
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
by rewrite (leqRW (cumul_service_inv_le_cumul_priority_inv _ _ _ _ _ _ _ _ _ _)) //. } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
move : (PI) => /andP [_ /hasP [jlp INjlp LPjlp]].Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
have SCHEDjlp : scheduled_at sched jlp t1 by erewrite <-scheduled_jobs_at_iff => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
have [NPT| [pt [/andP [LE1 LE2] [PT MIN]]]] := preemption_time_interval_case arr_seq sched t1 t2.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched t
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched t
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
rewrite (leqRW (no_preemption_impl_service_inv_bounded j _ jlp _ _ _ _ _ )) //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched t
service_during sched jlp t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched t
service_during sched jlp t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
by apply : lp_job_bounded_service_max.
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 NPT : forall t : nat,
t1 <= t < t2 ->
~~ preemption_time arr_seq sched t
exists t : nat,
t1 <= t < t2 /\ scheduled_at sched jlp t
by exists t1 ; split => //; apply /andP; split ; [ | move : BUSY => [T _]]; lia . } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
have LEQ : cumulative_service_inversion arr_seq sched j t1 t2
<= cumulative_service_inversion arr_seq sched j t1 pt.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
cumulative_service_inversion arr_seq sched j t1 t2 <=
cumulative_service_inversion arr_seq sched j t1 pt
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
cumulative_service_inversion arr_seq sched j t1 t2 <=
cumulative_service_inversion arr_seq sched j t1 pt
have [LE|WF] := leqP t2 pt.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'LE : t2 <= pt
cumulative_service_inversion arr_seq sched j t1 t2 <=
cumulative_service_inversion arr_seq sched j t1 pt
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'LE : t2 <= pt
cumulative_service_inversion arr_seq sched j t1 t2 <=
cumulative_service_inversion arr_seq sched j t1 pt
by rewrite (leqRW (service_inversion_widen arr_seq sched j t1 _ _ pt _ _ )) => //. } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'WF : pt < t2
cumulative_service_inversion arr_seq sched j t1 t2 <=
cumulative_service_inversion arr_seq sched j t1 pt
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'WF : pt < t2
cumulative_service_inversion arr_seq sched j t1 t2 <=
cumulative_service_inversion arr_seq sched j t1 pt
rewrite (service_inversion_cat _ _ _ _ _ pt) //
-{2 }[_ _ _ j t1 pt]addn0 leq_add2l
(leqRW (cumul_service_inv_le_cumul_priority_inv _ _ _ _ _ _ _ _ _ _))// leqn0.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'WF : pt < t2
cumulative_priority_inversion arr_seq sched j pt t2 ==
0
rewrite /cumulative_priority_inversion big_nat_cond; apply /eqP; apply big1 => t /andP [NEQ3 _]; apply /eqP.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'WF : pt < t2 t : nat NEQ3 : pt <= t < t2
priority_inversion arr_seq sched j t == 0
by rewrite eqb0; apply : no_priority_inversion_after_preemption_point => //; lia . } } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'LEQ : cumulative_service_inversion arr_seq sched j t1
t2 <=
cumulative_service_inversion arr_seq sched j t1
pt
cumulative_service_inversion arr_seq sched j t1 t2 <=
max_lp_nonpreemptive_segment arr_seq j t1
rewrite (leqRW LEQ) (leqRW (no_preemption_impl_service_inv_bounded j _ jlp _ _ _ _ _ )) //; clear LEQ.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
service_during sched jlp t1 pt <=
max_lp_nonpreemptive_segment arr_seq j t1
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
service_during sched jlp t1 pt <=
max_lp_nonpreemptive_segment arr_seq j t1
by apply : lp_job_bounded_service_max => //; lia . } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
forall t : nat,
t1 <= t < pt -> ~~ preemption_time arr_seq sched t
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
forall t : nat,
t1 <= t < pt -> ~~ preemption_time arr_seq sched t
move => t /andP [NEQ1 NEQ2]; apply /negP => PTt.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t't : nat NEQ1 : t1 <= t NEQ2 : t < pt PTt : preemption_time arr_seq sched t
False
by specialize (MIN _ NEQ1 PTt); move : MIN NEQ2; clear ; lia . } Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
exists t : nat,
t1 <= t < pt /\ scheduled_at sched jlp t
{ Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
exists t : nat,
t1 <= t < pt /\ scheduled_at sched jlp t
exists t1 ; split => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
t1 <= t1 < pt
apply /andP; split => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 pt : nat LE1 : t1 <= pt LE2 : pt < t2 PT : preemption_time arr_seq sched pt MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> pt <= t'
t1 < pt
move_neq_up LE; have EQ: pt = t1; [by lia | subst ]. Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 LE : t1 <= t1 MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> t1 <= t'PT : preemption_time arr_seq sched t1 LE2 : t1 < t2 LE1 : t1 <= t1
False
eapply no_preemption_time_before_pi with (t := t1) in PI => //.Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 LE : t1 <= t1 MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> t1 <= t'PT : preemption_time arr_seq sched t1 LE2 : t1 < t2 LE1 : t1 <= t1 PI : ~~ preemption_time arr_seq sched t1
False
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 LE : t1 <= t1 MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> t1 <= t'PT : preemption_time arr_seq sched t1 LE2 : t1 < t2 LE1 : t1 <= t1 PI : ~~ preemption_time arr_seq sched t1
False
by rewrite PT in PI.
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 LE : t1 <= t1 MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> t1 <= t'PT : preemption_time arr_seq sched t1 LE2 : t1 < t2 LE1 : t1 <= t1
t1 <= t1 < t2
by move : LE2; clear ; lia .
- Task : TaskType H : TaskCost Task H0 : TaskMaxNonpreemptiveSegment Task Job : JobType H1 : JobTask Job Task H2 : JobArrival Job H3 : JobCost Job PState : ProcessorState Job H_uniprocessor_proc_model : uniprocessor_model PState H_unit_supply_proc_model : unit_supply_proc_model
PState H_consumed_supply_proc_model : fully_consuming_proc_model PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule PState JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_respects_policy : respects_JLFP_policy_at_preemption_point
arr_seq sched JLFP tsk : Task blocking_bound : duration -> duration H_priority_inversion_is_bounded_by_blocking : forall (j : Job)
(t1
t2 : instant),
arrives_in
arr_seq j ->
job_of_task tsk
j ->
busy_interval_prefix
arr_seq sched
j t1 t2 ->
max_lp_nonpreemptive_segment
arr_seq j t1 <=
blocking_bound
(job_arrival j -
t1)j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POS : 0 < job_cost jt1, t2 : instant BUSY : busy_interval_prefix arr_seq sched j t1 t2 PI : priority_inversion arr_seq sched j t1 jlp : Job INjlp : jlp \in scheduled_jobs_at arr_seq sched t1 LPjlp : ~~ hep_job jlp j SCHEDjlp : scheduled_at sched jlp t1 LE : t1 <= t1 MIN : forall t' : nat,
t1 <= t' ->
preemption_time arr_seq sched t' -> t1 <= t'PT : preemption_time arr_seq sched t1 LE2 : t1 < t2 LE1 : t1 <= t1
t1 <= t1 <= t1
by clear ; lia . }
}
}
Qed .
End ServiceInversionIsBounded .