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.model.task.preemption.parameters.[Loading ML file ssrmatching_plugin.cmxs (using legacy method) ... done ] [Loading ML file ssreflect_plugin.cmxs (using legacy method) ... done ] [Loading ML file ring_plugin.cmxs (using legacy method) ... done ] Serlib plugin: coq-elpi.elpi is not available: serlib support is missing.
Incremental checking for commands in this plugin will be impacted. [Loading ML file coq-elpi.elpi ... done ] [Loading ML file zify_plugin.cmxs (using legacy method) ... done ] [Loading ML file micromega_core_plugin.cmxs (using legacy method) ... done ] [Loading ML file micromega_plugin.cmxs (using legacy method) ... done ] [Loading ML file btauto_plugin.cmxs (using legacy method) ... done ] Notation "_ + _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ - _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ < _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ > _" was already used in scope nat_scope.
[notation-overridden,parsing,default]Notation "_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]Notation "_ * _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Require Export prosa.analysis.facts.model.preemption.
Require Export prosa.analysis.facts.busy_interval.hep_at_pt.
(** * Priority Inversion in a Busy Interval *)
(** In this module, we reason about priority inversion that occurs during a busy
interval due to non-preemptive sections. *)
Section PriorityInversionIsBounded .
(** Consider any type of tasks ... *)
Context {Task : TaskType}.
Context `{TaskCost Task}.
(** ... and any type of jobs associated with these tasks. *)
Context {Job : JobType}.
Context `{JobTask Job Task}.
Context `{JobArrival Job}.
Context `{JobCost Job}.
(** Consider any valid arrival sequence ... *)
Variable arr_seq : arrival_sequence Job.
Hypothesis H_valid_arrivals : valid_arrival_sequence arr_seq.
(** ... and any uniprocessor schedule of this arrival sequence. *)
Context {PState : ProcessorState Job}.
Hypothesis H_uni : uniprocessor_model PState.
Variable sched : schedule PState.
(** Consider a 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 a valid preemption model with known maximum non-preemptive
segment lengths. *)
Context `{TaskMaxNonpreemptiveSegment Task} `{JobPreemptable Job}.
Hypothesis H_valid_preemption_model : valid_preemption_model arr_seq sched.
(** Further, allow for any work-bearing notion of job readiness. *)
Context `{!JobReady Job PState}.
Hypothesis H_job_ready : work_bearing_readiness arr_seq sched.
(** We assume that the schedule is valid ... *)
Hypothesis H_sched_valid : valid_schedule sched arr_seq.
(** ... and that the schedule respects the scheduling policy at every
preemption point. *)
Hypothesis H_respects_policy :
respects_JLFP_policy_at_preemption_point arr_seq sched JLFP.
(** Consider any job [j] of [tsk] with positive job cost. *)
Variable j : Job.
Hypothesis H_j_arrives : arrives_in arr_seq j.
Hypothesis H_job_cost_positive : job_cost_positive j.
(** Consider any busy interval prefix <<[t1, t2)>> of job [j]. *)
Variable t1 t2 : instant.
Hypothesis H_busy_interval_prefix :
busy_interval_prefix arr_seq sched j t1 t2.
(** ** Lower Priority In Busy Intervals *)
(** First, we state some basic properties about a lower priority job executing
in the busy interval of the job under consideration. From the definition
of the busy interval it follows that a lower priority job can only be
executing inside the busy interval as a result of priority inversion. *)
Section LowerPriorityJobScheduled .
(** Consider a lower-priority job. *)
Variable jlp : Job.
Hypothesis H_jlp_lp : ~~hep_job jlp j.
(** Consider an instant [t] within the busy window of the job such that
[jlp] is scheduled at [t]. *)
Variable t : instant.
Hypothesis H_t_in_busy : t1 <= t < t2.
Hypothesis H_jlp_scheduled_at_t : scheduled_at sched jlp t.
(** First, we prove that no time from [t1] up to the instant [t] can
be a preemption point. *)
Lemma lower_priority_job_scheduled_implies_no_preemption_time :
forall t' ,
t1 <= t' <= t ->
~~ preemption_time arr_seq sched t'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
forall t' : nat,
t1 <= t' <= t -> ~~ preemption_time arr_seq sched t'
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
forall t' : nat,
t1 <= t' <= t -> ~~ preemption_time arr_seq sched t'
move => t' /andP[LE1 GT1].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat LE1 : t1 <= t' GT1 : t' <= t
~~ preemption_time arr_seq sched t'
apply /negP => PT.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat LE1 : t1 <= t' GT1 : t' <= t PT : preemption_time arr_seq sched t'
False
move : H_jlp_lp => /negP LP; apply : LP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat LE1 : t1 <= t' GT1 : t' <= t PT : preemption_time arr_seq sched t'
hep_job jlp j
have [ptst [IN1 [PTT STT]]] : exists ptst : nat,
t' <= ptst <= t /\ preemption_time arr_seq sched ptst /\ scheduled_at sched jlp ptst.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat LE1 : t1 <= t' GT1 : t' <= t PT : preemption_time arr_seq sched t'
exists ptst : nat,
t' <= ptst <= t /\
preemption_time arr_seq sched ptst /\
scheduled_at sched jlp ptst
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat LE1 : t1 <= t' GT1 : t' <= t PT : preemption_time arr_seq sched t'
exists ptst : nat,
t' <= ptst <= t /\
preemption_time arr_seq sched ptst /\
scheduled_at sched jlp ptst
by apply : scheduling_of_any_segment_starts_with_preemption_time_continuously_sched => //=. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat LE1 : t1 <= t' GT1 : t' <= t PT : preemption_time arr_seq sched t' ptst : nat IN1 : t' <= ptst <= t PTT : preemption_time arr_seq sched ptst STT : scheduled_at sched jlp ptst
hep_job jlp j
apply : (scheduled_at_preemption_time_implies_higher_or_equal_priority arr_seq _ sched _ _ _ _ j _ _ t1 t2 _ ptst) => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat LE1 : t1 <= t' GT1 : t' <= t PT : preemption_time arr_seq sched t' ptst : nat IN1 : t' <= ptst <= t PTT : preemption_time arr_seq sched ptst STT : scheduled_at sched jlp ptst
t1 <= ptst < t2
by lia .
Qed .
(** Then it follows that the job must have been continuously scheduled from
[t1] up to [t]. *)
Lemma lower_priority_job_continuously_scheduled :
forall t' ,
t1 <= t' <= t ->
scheduled_at sched jlp t'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
forall t' : nat,
t1 <= t' <= t -> scheduled_at sched jlp t'
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
forall t' : nat,
t1 <= t' <= t -> scheduled_at sched jlp t'
move => t' IN.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat IN : t1 <= t' <= t
scheduled_at sched jlp t'
move : IN => /andP [IN1' IN2'].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat IN1' : t1 <= t' IN2' : t' <= t
scheduled_at sched jlp t'
apply : neg_pt_scheduled_continuously_after => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat IN1' : t1 <= t' IN2' : t' <= t
forall t0 : nat,
t' <= t0 <= t -> ~~ preemption_time arr_seq sched t0
move => ??.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat IN1' : t1 <= t' IN2' : t' <= t _t_ : nat _Hyp_ : t' <= _t_ <= t
~~ preemption_time arr_seq sched _t_
apply lower_priority_job_scheduled_implies_no_preemption_time.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t t' : nat IN1' : t1 <= t' IN2' : t' <= t _t_ : nat _Hyp_ : t' <= _t_ <= t
t1 <= _t_ <= t
by lia .
Qed .
(** Any lower-priority jobs that are scheduled inside the
busy-interval prefix <<[t1,t2)>> must arrive before that interval. *)
Lemma low_priority_job_arrives_before_busy_interval_prefix :
job_arrival jlp < t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
job_arrival jlp < t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
job_arrival jlp < t1
have SCHED1 : scheduled_at sched jlp t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
scheduled_at sched jlp t1
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
scheduled_at sched jlp t1
apply lower_priority_job_continuously_scheduled => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
t1 <= t1 <= t
lia . } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1
job_arrival jlp < t1
have ARR1: job_arrival jlp <= t1 by apply : (has_arrived_scheduled sched jlp _ t1 SCHED1).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 ARR1 : job_arrival jlp <= t1
job_arrival jlp < t1
rewrite /has_arrived leq_eqVlt in ARR1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 ARR1 : (job_arrival jlp == t1)
|| (job_arrival jlp < t1)
job_arrival jlp < t1
move : ARR1 => /orP[/eqP EQ| ?]; last by done .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 EQ : job_arrival jlp = t1
job_arrival jlp < t1
exfalso .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 EQ : job_arrival jlp = t1
False
have PP := scheduling_of_any_segment_starts_with_preemption_time _
arr_seq H_valid_arrivals
sched H_sched_valid
H_valid_preemption_model jlp t H_jlp_scheduled_at_t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 EQ : job_arrival jlp = t1 PP : uniprocessor_model PState ->
exists pt : nat,
job_arrival jlp <= pt <= t /\
preemption_time arr_seq sched pt /\
(forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t')
False
feed PP => //. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 EQ : job_arrival jlp = t1 PP : exists pt : nat,
job_arrival jlp <= pt <= t /\
preemption_time arr_seq sched pt /\
(forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t')
False
move : PP => [pt [/andP [NEQ1 NEQ2] [PT FA]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 EQ : job_arrival jlp = t1 pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t PT : preemption_time arr_seq sched pt FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
False
contradict PT.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 EQ : job_arrival jlp = t1 pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
~ preemption_time arr_seq sched pt
apply /negP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t SCHED1 : scheduled_at sched jlp t1 EQ : job_arrival jlp = t1 pt : nat NEQ1 : job_arrival jlp <= pt NEQ2 : pt <= t FA : forall t' : nat,
pt <= t' <= t -> scheduled_at sched jlp t'
~~ preemption_time arr_seq sched pt
by apply (lower_priority_job_scheduled_implies_no_preemption_time ) => //=; lia .
Qed .
(** Finally, we show that lower-priority jobs that are scheduled
inside the busy-interval prefix <<[t1,t2)>> must also be scheduled
before the interval. *)
Lemma low_priority_job_scheduled_before_busy_interval_prefix :
exists t' , t' < t1 /\ scheduled_at sched jlp t'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
exists t' : nat, t' < t1 /\ scheduled_at sched jlp t'
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t
exists t' : nat, t' < t1 /\ scheduled_at sched jlp t'
move : H_t_in_busy => /andP [GE LT].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2
exists t' : nat, t' < t1 /\ scheduled_at sched jlp t'
have ARR := low_priority_job_arrives_before_busy_interval_prefix .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
exists t' : nat, t' < t1 /\ scheduled_at sched jlp t'
exists t1 .-1 ; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
t1.-1 < t1
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
t1.-1 < t1
by rewrite prednK; last apply leq_ltn_trans with (job_arrival jlp). } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
scheduled_at sched jlp t1.-1
eapply neg_pt_scheduled_at => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
scheduled_at sched jlp t1.-1 .+1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
scheduled_at sched jlp t1.-1 .+1
rewrite prednK; last by apply leq_ltn_trans with (job_arrival jlp).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
scheduled_at sched jlp t1
apply lower_priority_job_continuously_scheduled => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
t1 <= t1 <= t
lia .
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
~~ preemption_time arr_seq sched t1.-1 .+1
rewrite prednK; last by apply leq_ltn_trans with (job_arrival jlp).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
~~ preemption_time arr_seq sched t1
apply lower_priority_job_scheduled_implies_no_preemption_time.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 jlp : Job H_jlp_lp : ~~ hep_job jlp j t : instant H_t_in_busy : t1 <= t < t2 H_jlp_scheduled_at_t : scheduled_at sched jlp t GE : t1 <= t LT : t < t2 ARR : job_arrival jlp < t1
t1 <= t1 <= t
by lia .
Qed .
End LowerPriorityJobScheduled .
(** In this section, we prove that priority inversion only
occurs at the start of the busy window and occurs due to only
one job. *)
Section SingleJob .
(** Suppose job [j] incurs priority inversion at a time [t_pi] in its busy window. *)
Variable t_pi : instant.
Hypothesis H_from_t1_before_t2 : t1 <= t_pi < t2.
Hypothesis H_PI_occurs : priority_inversion arr_seq sched j t_pi.
(** First, we show that there is no preemption time in the interval <<[t1,t_pi]>>. *)
Lemma no_preemption_time_before_pi :
forall t ,
t1 <= t <= t_pi ->
~~ preemption_time arr_seq sched t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi
forall t : nat,
t1 <= t <= t_pi -> ~~ preemption_time arr_seq sched t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi
forall t : nat,
t1 <= t <= t_pi -> ~~ preemption_time arr_seq sched t
move => ppt intl.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi ppt : nat intl : t1 <= ppt <= t_pi
~~ preemption_time arr_seq sched ppt
move : H_PI_occurs => /uni_priority_inversion_P PI.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi ppt : nat intl : t1 <= ppt <= t_pi PI : valid_arrival_sequence arr_seq ->
jobs_come_from_arrival_sequence sched arr_seq ->
jobs_must_arrive_to_execute sched ->
reflexive_job_priorities JLFP ->
uniprocessor_model PState ->
exists2 j' : Job,
scheduled_at sched j' t_pi & ~~ hep_job j' j
~~ preemption_time arr_seq sched ppt
feed_n 5 PI => //=. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi ppt : nat intl : t1 <= ppt <= t_pi PI : exists2 j' : Job,
scheduled_at sched j' t_pi & ~~ hep_job j' j
~~ preemption_time arr_seq sched ppt
move : PI => [jlp SCHED NHEP].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi ppt : nat intl : t1 <= ppt <= t_pi jlp : Job SCHED : scheduled_at sched jlp t_pi NHEP : ~~ hep_job jlp j
~~ preemption_time arr_seq sched ppt
by apply (lower_priority_job_scheduled_implies_no_preemption_time jlp NHEP t_pi).
Qed .
(** Next, we show that the same job will be scheduled from the start of the
busy interval to the priority inversion time [t_pi]. *)
Lemma pi_job_remains_scheduled :
forall jlp ,
scheduled_at sched jlp t_pi ->
forall t ,
t1 <= t <= t_pi -> scheduled_at sched jlp t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi
forall jlp : Job,
scheduled_at sched jlp t_pi ->
forall t : nat,
t1 <= t <= t_pi -> scheduled_at sched jlp t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi
forall jlp : Job,
scheduled_at sched jlp t_pi ->
forall t : nat,
t1 <= t <= t_pi -> scheduled_at sched jlp t
move : H_PI_occurs => /uni_priority_inversion_P PI.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi PI : valid_arrival_sequence arr_seq ->
jobs_come_from_arrival_sequence sched arr_seq ->
jobs_must_arrive_to_execute sched ->
reflexive_job_priorities JLFP ->
uniprocessor_model PState ->
exists2 j' : Job,
scheduled_at sched j' t_pi & ~~ hep_job j' j
forall jlp : Job,
scheduled_at sched jlp t_pi ->
forall t : nat,
t1 <= t <= t_pi -> scheduled_at sched jlp t
feed_n 5 PI => //=. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi PI : exists2 j' : Job,
scheduled_at sched j' t_pi & ~~ hep_job j' j
forall jlp : Job,
scheduled_at sched jlp t_pi ->
forall t : nat,
t1 <= t <= t_pi -> scheduled_at sched jlp t
move : PI => [jlp SCHED NHEP].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi jlp : Job SCHED : scheduled_at sched jlp t_pi NHEP : ~~ hep_job jlp j
forall jlp : Job,
scheduled_at sched jlp t_pi ->
forall t : nat,
t1 <= t <= t_pi -> scheduled_at sched jlp t
move => jlp1 SCHED3 t IN.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi jlp : Job SCHED : scheduled_at sched jlp t_pi NHEP : ~~ hep_job jlp j jlp1 : Job SCHED3 : scheduled_at sched jlp1 t_pi t : nat IN : t1 <= t <= t_pi
scheduled_at sched jlp1 t
apply : lower_priority_job_continuously_scheduled => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi jlp : Job SCHED : scheduled_at sched jlp t_pi NHEP : ~~ hep_job jlp j jlp1 : Job SCHED3 : scheduled_at sched jlp1 t_pi t : nat IN : t1 <= t <= t_pi
~~ hep_job jlp1 j
by have -> : jlp1 = jlp.
Qed .
(** Thus, priority inversion takes place from the start of the busy interval
to the instant [t_pi], i.e., priority inversion takes place
continuously. *)
Lemma pi_continuous :
forall t ,
t1 <= t <= t_pi ->
priority_inversion arr_seq sched j t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi
forall t : nat,
t1 <= t <= t_pi ->
priority_inversion arr_seq sched j t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi
forall t : nat,
t1 <= t <= t_pi ->
priority_inversion arr_seq sched j t
move : (H_PI_occurs) => /andP[j_nsched_pi /hasP[jlp jlp_sched_pi nHEPj]] t INTL.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t_pi jlp : Job jlp_sched_pi : jlp
\in scheduled_jobs_at arr_seq sched
t_pi nHEPj : ~~ hep_job jlp j t : nat INTL : t1 <= t <= t_pi
priority_inversion arr_seq sched j t
apply /uni_priority_inversion_P => // ; exists jlp => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t_pi jlp : Job jlp_sched_pi : jlp
\in scheduled_jobs_at arr_seq sched
t_pi nHEPj : ~~ hep_job jlp j t : nat INTL : t1 <= t <= t_pi
scheduled_at sched jlp t
apply : pi_job_remains_scheduled => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 t_pi : instant H_from_t1_before_t2 : t1 <= t_pi < t2 H_PI_occurs : priority_inversion arr_seq sched j t_pi j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t_pi jlp : Job jlp_sched_pi : jlp
\in scheduled_jobs_at arr_seq sched
t_pi nHEPj : ~~ hep_job jlp j t : nat INTL : t1 <= t <= t_pi
scheduled_at sched jlp t_pi
by rewrite -(scheduled_jobs_at_iff arr_seq).
Qed .
End SingleJob .
(** As a simple corollary to the lemmas proved in the previous
section, we show that for any two jobs [j1] and [j2] that cause
priority inversion to job [j], it is the case that [j1 = j2]. *)
Section SingleJobEq .
(** Consider a time instant [ts1] in <<[t1, t2)>> ... *)
Variable ts1 : instant.
Hypothesis H_ts1_in_busy_prefix : t1 <= ts1 < t2.
(** ... and a lower-priority (w.r.t. job [j]) job [j1] that is
scheduled at time [ts1]. *)
Variable j1 : Job.
Hypothesis H_j1_sched : scheduled_at sched j1 ts1.
Hypothesis H_j1_lower_prio : ~~ hep_job j1 j.
(** Similarly, consider a time instant [ts2] in <<[t1, t2)>> ... *)
Variable ts2 : instant.
Hypothesis H_ts2_in_busy_prefix : t1 <= ts2 < t2.
(** ... and a lower-priority job [j2] that is scheduled at time [ts2]. *)
Variable j2 : Job.
Hypothesis H_j2_sched : scheduled_at sched j2 ts2.
Hypothesis H_j2_lower_prio : ~~ hep_job j2 j.
(** Then, [j1] is equal to [j2]. *)
Corollary only_one_pi_job :
j1 = j2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j
j1 = j2
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j
j1 = j2
have [NEQ|NEQ] := leqP ts1 ts2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j NEQ : ts1 <= ts2
j1 = j2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j NEQ : ts1 <= ts2
j1 = j2
apply : H_uni; first by apply H_j1_sched.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j NEQ : ts1 <= ts2
scheduled_at sched j2 ts1
apply : pi_job_remains_scheduled; try apply H_j2_sched; try lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j NEQ : ts1 <= ts2
priority_inversion arr_seq sched j ts2
by erewrite priority_inversion_hep_job.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j NEQ : ts2 < ts1
j1 = j2
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j NEQ : ts2 < ts1
j1 = j2
apply : H_uni; last by apply H_j2_sched.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j NEQ : ts2 < ts1
scheduled_at sched j1 ts2
apply : pi_job_remains_scheduled; try apply H_j1_sched; try lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ts1 : instant H_ts1_in_busy_prefix : t1 <= ts1 < t2 j1 : Job H_j1_sched : scheduled_at sched j1 ts1 H_j1_lower_prio : ~~ hep_job j1 j ts2 : instant H_ts2_in_busy_prefix : t1 <= ts2 < t2 j2 : Job H_j2_sched : scheduled_at sched j2 ts2 H_j2_lower_prio : ~~ hep_job j2 j NEQ : ts2 < ts1
priority_inversion arr_seq sched j ts1
by erewrite priority_inversion_hep_job; try apply H_j1_sched.
}
Qed .
End SingleJobEq .
(** From the above lemmas, it follows that either job [j] incurs no priority
inversion at all or certainly at time [t1], i.e., the beginning of its
busy interval. *)
Lemma busy_interval_pi_cases :
cumulative_priority_inversion arr_seq sched j t1 t2 = 0
\/ priority_inversion arr_seq sched j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
cumulative_priority_inversion arr_seq sched j t1 t2 =
0 \/ priority_inversion arr_seq sched j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
cumulative_priority_inversion arr_seq sched j t1 t2 =
0 \/ priority_inversion arr_seq sched j t1
case : (posnP (cumulative_priority_inversion arr_seq sched j t1 t2)); first by left .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2
0 <
cumulative_priority_inversion arr_seq sched j t1 t2 ->
cumulative_priority_inversion arr_seq sched j t1 t2 =
0 \/ priority_inversion arr_seq sched j t1
rewrite sum_nat_gt0 // => /hasP[pi].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 pi : Datatypes_nat__canonical__eqtype_Equality
pi \in [seq _ <- index_iota t1 t2 | true] ->
0 < priority_inversion arr_seq sched j pi ->
cumulative_priority_inversion arr_seq sched j t1 t2 =
0 \/ priority_inversion arr_seq sched j t1
rewrite mem_filter /= mem_index_iota lt0b => INTL PI_pi.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 pi : Datatypes_nat__canonical__eqtype_Equality INTL : t1 <= pi < t2 PI_pi : priority_inversion arr_seq sched j pi
cumulative_priority_inversion arr_seq sched j t1 t2 =
0 \/ priority_inversion arr_seq sched j t1
by right ; apply : pi_continuous =>//; lia .
Qed .
(** Next, we use the above facts to establish bounds on the maximum priority
inversion that can be incurred in a busy interval. *)
(** * Priority Inversion due to Non-Preemptive Sections *)
(** First, we introduce the notion of the maximum length of a
nonpreemptive segment among all lower priority jobs (w.r.t. a
given job [j]) arrived so far. *)
Definition max_lp_nonpreemptive_segment (j : Job) (t : instant) :=
\max_(j_lp <- arrivals_before arr_seq t | (~~ hep_job j_lp j) && (job_cost j_lp > 0 ))
(job_max_nonpreemptive_segment j_lp - ε).
(** Note that any bound on the [max_lp_nonpreemptive_segment]
function is also be a bound on the maximum priority inversion
(assuming there are no other mechanisms that could cause
priority inversion). This bound may be different for different
scheduler and/or task models. Thus, we don't define such a bound
in this module. *)
Section TaskMaxNPS .
(** First, assuming proper non-preemptive sections, ... *)
Hypothesis H_valid_nps :
valid_model_with_bounded_nonpreemptive_segments arr_seq sched.
(** ... we observe that the maximum non-preemptive segment length
of any task that releases a job with lower priority (w.r.t. a
given job [j]) and non-zero execution cost upper-bounds the
maximum possible non-preemptive segment length of any
lower-priority job. *)
Lemma max_np_job_segment_bounded_by_max_np_task_segment :
max_lp_nonpreemptive_segment j t1
<= \max_(j_lp <- arrivals_between arr_seq 0 t1 | (~~ hep_job j_lp j)
&& (job_cost j_lp > 0 ))
(task_max_nonpreemptive_segment (job_task j_lp) - ε).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_nps : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
max_lp_nonpreemptive_segment j t1 <=
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_job
j_lp j &&
(0 <
job_cost
j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - 1 )
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_nps : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
max_lp_nonpreemptive_segment j t1 <=
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_job
j_lp j &&
(0 <
job_cost
j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - 1 )
rewrite /max_lp_nonpreemptive_segment.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_nps : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
\max_(j_lp <- arrivals_before arr_seq t1 | ~~
hep_job
j_lp j &&
(0 <
job_cost
j_lp))
(job_max_nonpreemptive_segment j_lp - 1 ) <=
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_job
j_lp j &&
(0 <
job_cost
j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - 1 )
apply : leq_big_max => j' JINB NOTHEP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_nps : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched j' : Job JINB : j' \in arrivals_before arr_seq t1 NOTHEP : ~~ hep_job j' j && (0 < job_cost j')
job_max_nonpreemptive_segment j' - 1 <=
task_max_nonpreemptive_segment (job_task j') - 1
rewrite leq_sub2r //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_nps : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched j' : Job JINB : j' \in arrivals_before arr_seq t1 NOTHEP : ~~ hep_job j' j && (0 < job_cost j')
job_max_nonpreemptive_segment j' <=
task_max_nonpreemptive_segment (job_task j')
apply in_arrivals_implies_arrived in JINB.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_nps : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched j' : Job JINB : arrives_in arr_seq j' NOTHEP : ~~ hep_job j' j && (0 < job_cost j')
job_max_nonpreemptive_segment j' <=
task_max_nonpreemptive_segment (job_task j')
by apply H_valid_nps.
Qed .
End TaskMaxNPS .
(** Next, we prove that the function [max_lp_nonpreemptive_segment]
indeed upper-bounds the priority inversion length. *)
Section PreemptionTimeExists .
(** In this section, we require the jobs to have valid bounded
non-preemptive segments. *)
Hypothesis H_valid_model_with_bounded_nonpreemptive_segments :
valid_model_with_bounded_nonpreemptive_segments arr_seq sched.
(** First, we prove that, if a job with higher-or-equal priority is scheduled at
a quiet time [t+1], then this is the first time when this job is scheduled. *)
Lemma hp_job_not_scheduled_before_quiet_time :
forall jhp t ,
quiet_time arr_seq sched j t.+1 ->
scheduled_at sched jhp t.+1 ->
hep_job jhp j ->
~~ scheduled_at sched jhp t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
forall (jhp : Job) (t : nat),
quiet_time arr_seq sched j t.+1 ->
scheduled_at sched jhp t.+1 ->
hep_job jhp j -> ~~ scheduled_at sched jhp t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
forall (jhp : Job) (t : nat),
quiet_time arr_seq sched j t.+1 ->
scheduled_at sched jhp t.+1 ->
hep_job jhp j -> ~~ scheduled_at sched jhp t
intros jhp t QT SCHED1 HP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job t : nat QT : quiet_time arr_seq sched j t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j
~~ scheduled_at sched jhp t
apply /negP; intros SCHED2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job t : nat QT : quiet_time arr_seq sched j t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
False
specialize (QT jhp).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job t : nat QT : arrives_in arr_seq jhp ->
hep_job jhp j ->
arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
False
feed_n 3 QT => //. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job t : nat QT : arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
arrived_before jhp t.+1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job t : nat QT : arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
arrived_before jhp t.+1
have MATE: jobs_must_arrive_to_execute sched by [].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job t : nat QT : arrived_before jhp t.+1 ->
completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t MATE : jobs_must_arrive_to_execute sched
arrived_before jhp t.+1
by have HA: has_arrived jhp t by exact : MATE.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job t : nat QT : completed_by sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
False
apply completed_implies_not_scheduled in QT => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job t : nat QT : ~~ scheduled_at sched jhp t.+1 SCHED1 : scheduled_at sched jhp t.+1 HP : hep_job jhp j SCHED2 : scheduled_at sched jhp t
False
by move : QT => /negP NSCHED; apply : NSCHED.
Qed .
(** Thus, there must be a preemption time in the interval [t1, t1
+ max_lp_nonpreemptive_segment j t1]. That is, if a job with
higher-or-equal priority is scheduled at time instant [t1],
then [t1] is a preemption time. Otherwise, if a job with lower
priority is scheduled at time [t1], then this job also should
be scheduled before the beginning of the busy interval. So,
the next preemption time will be no more than
[max_lp_nonpreemptive_segment j t1] time units later. *)
(** We proceed by doing a case analysis. *)
Section CaseAnalysis .
(** (1) Case when the schedule is idle at time [t1]. *)
Section Case1 .
(** Assume that the schedule is idle at time [t1]. *)
Hypothesis H_is_idle : is_idle arr_seq sched t1.
(** Then time instant [t1] is a preemption time. *)
Lemma preemption_time_exists_case1 :
exists pr_t ,
preemption_time arr_seq sched pr_t
/\ t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_is_idle : is_idle arr_seq sched t1
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_is_idle : is_idle arr_seq sched t1
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
set (service := service sched).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_is_idle : is_idle arr_seq sched t1 service := service.service sched : Job -> instant -> nat
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
move : (H_valid_model_with_bounded_nonpreemptive_segments) => CORR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_is_idle : is_idle arr_seq sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
move : (H_busy_interval_prefix) => [NEM [QT1 [NQT HPJ]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_is_idle : is_idle arr_seq sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
exists t1 ; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_is_idle : is_idle arr_seq sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
preemption_time arr_seq sched t1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_is_idle : is_idle arr_seq sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
preemption_time arr_seq sched t1
exact : idle_time_is_pt.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_is_idle : is_idle arr_seq sched t1 service := service.service sched : Job -> instant -> nat CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
t1 <= t1 <= t1 + max_lp_nonpreemptive_segment j t1
by apply /andP; split ; last rewrite leq_addr.
Qed .
End Case1 .
(** (2) Case when a job with higher-or-equal priority is scheduled at time [t1]. *)
Section Case2 .
(** Assume that a job [jhp] with higher-or-equal priority is scheduled at time [t1]. *)
Variable jhp : Job.
Hypothesis H_jhp_is_scheduled : scheduled_at sched jhp t1.
Hypothesis H_jhp_hep_priority : hep_job jhp j.
(** Then time instant [t1] is a preemption time. *)
Lemma preemption_time_exists_case2 :
exists pr_t ,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
set (service := service sched).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
move : (H_valid_model_with_bounded_nonpreemptive_segments) => [VALID BOUNDED].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
move : (H_valid_model_with_bounded_nonpreemptive_segments) => CORR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
move : (H_busy_interval_prefix) => [NEM [QT1 [NQT HPJ]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
exists t1 ; split ; last by apply /andP; split ; [|rewrite leq_addr].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp t1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : t1 < t2 QT1 : quiet_time arr_seq sched j t1 NQT : forall t : nat,
t1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : t1 <= job_arrival j < t2
preemption_time arr_seq sched t1
destruct t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j 0 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp 0 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : 0 < t2QT1 : quiet_time arr_seq sched j 0 NQT : forall t : nat,
0 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : 0 <= job_arrival j < t2
preemption_time arr_seq sched 0
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j 0 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp 0 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : 0 < t2QT1 : quiet_time arr_seq sched j 0 NQT : forall t : nat,
0 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : 0 <= job_arrival j < t2
preemption_time arr_seq sched 0
exact : zero_is_pt.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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 i : nat H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j i.+1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp i.+1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : i.+1 < t2 QT1 : quiet_time arr_seq sched j i.+1 NQT : forall t : nat,
i.+1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : i < job_arrival j < t2
preemption_time arr_seq sched i.+1
apply : first_moment_is_pt H_jhp_is_scheduled => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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 i : nat H_busy_interval_prefix : busy_interval_prefix arr_seq
sched j i.+1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched jhp : Job H_jhp_is_scheduled : scheduled_at sched jhp i.+1 H_jhp_hep_priority : hep_job jhp j service := service.service sched : Job -> instant -> nat VALID : valid_preemption_model arr_seq sched BOUNDED : model_with_bounded_nonpreemptive_segments
arr_seq CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched NEM : i.+1 < t2 QT1 : quiet_time arr_seq sched j i.+1 NQT : forall t : nat,
i.+1 < t < t2 -> ~ quiet_time arr_seq sched j tHPJ : i < job_arrival j < t2
~~ scheduled_at sched jhp i
exact : hp_job_not_scheduled_before_quiet_time.
Qed .
End Case2 .
(** The following argument requires a unit-service assumption. *)
Hypothesis H_unit : unit_service_proc_model PState.
(** (3) Case when a job with lower priority is scheduled at time [t1]. *)
Section Case3 .
(** Assume that a job [jhp] with lower priority is scheduled at time [t1]. *)
Variable jlp : Job.
Hypothesis H_jlp_is_scheduled : scheduled_at sched jlp t1.
Hypothesis H_jlp_low_priority : ~~ hep_job jlp j.
(** To prove the lemma in this case we need a few auxiliary
facts about the first preemption point of job [jlp]. *)
Section FirstPreemptionPointOfjlp .
(** Let's denote the progress of job [jlp] at time [t1] as [progr_t1]. *)
Let progr_t1 := service sched jlp t1.
(** Consider the first preemption point of job [jlp] after [progr_t1]. *)
Variable fpt : instant.
Hypothesis H_fpt_is_preemption_point : job_preemptable jlp (progr_t1 + fpt).
Hypothesis H_fpt_is_first_preemption_point :
forall ρ ,
progr_t1 <= ρ <= progr_t1 + (job_max_nonpreemptive_segment jlp - ε) ->
job_preemptable jlp ρ ->
service sched jlp t1 + fpt <= ρ.
(** For correctness, we also assume that [fpt] does not
exceed the length of the maximum non-preemptive
segment. *)
Hypothesis H_progr_le_max_nonp_segment :
fpt <= job_max_nonpreemptive_segment jlp - ε.
(** First we show that [fpt] is indeed the first preemption point after [progr_t1]. *)
Lemma no_intermediate_preemption_point :
forall ρ ,
progr_t1 <= ρ < progr_t1 + fpt ->
~~ job_preemptable jlp ρ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1
forall ρ : nat,
progr_t1 <= ρ < progr_t1 + fpt ->
~~ job_preemptable jlp ρ
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1
forall ρ : nat,
progr_t1 <= ρ < progr_t1 + fpt ->
~~ job_preemptable jlp ρ
move => prog /andP [GE LT].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt
~~ job_preemptable jlp prog
apply /negP; intros PPJ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog
False
move : H_fpt_is_first_preemption_point => K; specialize (K prog).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 ) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
False
feed_n 2 K => [|//|]; first (apply /andP; split => //). Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 ) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 )
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 ) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 )
apply leq_trans with (service sched jlp t1 + fpt).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 ) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
prog <= service sched jlp t1 + fpt
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 ) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
prog <= service sched jlp t1 + fpt
exact : ltnW.
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : progr_t1 <= prog <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 ) ->
job_preemptable jlp prog ->
service sched jlp t1 + fpt <= prog
service sched jlp t1 + fpt <=
progr_t1 + (job_max_nonpreemptive_segment jlp - 1 )
by rewrite leq_add2l; apply H_progr_le_max_nonp_segment.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 prog : nat GE : progr_t1 <= prog LT : prog < progr_t1 + fpt PPJ : job_preemptable jlp prog K : service sched jlp t1 + fpt <= prog
False
by move : K; rewrite leqNgt; move => /negP NLT; apply : NLT.
Qed .
(** Thanks to the fact that the scheduler respects the notion of preemption points
we show that [jlp] is continuously scheduled in time interval <<[t1, t1 + fpt)>>. *)
Lemma continuously_scheduled_between_preemption_points :
forall t' ,
t1 <= t' < t1 + fpt ->
scheduled_at sched jlp t'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1
forall t' : nat,
t1 <= t' < t1 + fpt -> scheduled_at sched jlp t'
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1
forall t' : nat,
t1 <= t' < t1 + fpt -> scheduled_at sched jlp t'
move : (H_valid_model_with_bounded_nonpreemptive_segments) => CORR.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched
forall t' : nat,
t1 <= t' < t1 + fpt -> scheduled_at sched jlp t'
have ARRs : arrives_in arr_seq jlp by [].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp
forall t' : nat,
t1 <= t' < t1 + fpt -> scheduled_at sched jlp t'
move => t' /andP [GE LT].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp t' : nat GE : t1 <= t' LT : t' < t1 + fpt
scheduled_at sched jlp t'
have Fact : exists Δ , t' = t1 + Δ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp t' : nat GE : t1 <= t' LT : t' < t1 + fpt
exists Δ : nat, t' = t1 + Δ
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp t' : nat GE : t1 <= t' LT : t' < t1 + fpt
exists Δ : nat, t' = t1 + Δ
by exists (t' - t1); apply /eqP; rewrite eq_sym; apply /eqP; rewrite subnKC. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp t' : nat GE : t1 <= t' LT : t' < t1 + fpt Fact : exists Δ : nat, t' = t1 + Δ
scheduled_at sched jlp t'
move : Fact => [Δ EQ]; subst t'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ
scheduled_at sched jlp (t1 + Δ)
have NPPJ := @no_intermediate_preemption_point (@service _ _ sched jlp (t1 + Δ)).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ NPPJ : progr_t1 <=
service sched jlp (t1 + Δ) <
progr_t1 + fpt ->
~~
job_preemptable jlp
(service sched jlp (t1 + Δ))
scheduled_at sched jlp (t1 + Δ)
apply proj1 in CORR; specialize (CORR jlp ARRs).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 CORR : job_cannot_become_nonpreemptive_before_execution
jlp /\
job_cannot_be_nonpreemptive_after_completion
jlp /\
not_preemptive_implies_scheduled sched jlp /\
execution_starts_with_preemption_point sched
jlp ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ NPPJ : progr_t1 <=
service sched jlp (t1 + Δ) <
progr_t1 + fpt ->
~~
job_preemptable jlp
(service sched jlp (t1 + Δ))
scheduled_at sched jlp (t1 + Δ)
move : CORR => [_ [_ [T _] ]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ NPPJ : progr_t1 <=
service sched jlp (t1 + Δ) <
progr_t1 + fpt ->
~~
job_preemptable jlp
(service sched jlp (t1 + Δ)) T : not_preemptive_implies_scheduled sched jlp
scheduled_at sched jlp (t1 + Δ)
apply T; apply : NPPJ; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
progr_t1 <= service sched jlp (t1 + Δ)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
progr_t1 <= service sched jlp (t1 + Δ)
by apply service_monotonic; rewrite leq_addr. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
service sched jlp (t1 + Δ) < progr_t1 + fpt
rewrite /service -(service_during_cat _ _ _ t1).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
service_during sched jlp 0 t1 +
service_during sched jlp t1 (t1 + Δ) < progr_t1 + fpt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
service_during sched jlp 0 t1 +
service_during sched jlp t1 (t1 + Δ) < progr_t1 + fpt
rewrite ltn_add2l; rewrite ltn_add2l in LT.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp LT : Δ < fpt
service_during sched jlp t1 (t1 + Δ) < fpt
apply leq_ltn_trans with Δ => [|//].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp LT : Δ < fpt
service_during sched jlp t1 (t1 + Δ) <= Δ
rewrite -{2 }(sum_of_ones t1 Δ).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp LT : Δ < fpt
service_during sched jlp t1 (t1 + Δ) <=
\sum_(t1 <= x < t1 + Δ) 1
by rewrite leq_sum. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
0 <= t1 <= t1 + Δ
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp Δ : nat LT : t1 + Δ < t1 + fpt GE : t1 <= t1 + Δ T : not_preemptive_implies_scheduled sched jlp
0 <= t1 <= t1 + Δ
by apply /andP; split ; [|rewrite leq_addr]. }
Qed .
(** Thus, assuming an ideal-progress processor model, job [jlp]
reaches its preemption point at time instant [t1 + fpt], which
implies that time instant [t1 + fpt] is a preemption time. *)
Lemma first_preemption_time :
ideal_progress_proc_model PState ->
preemption_time arr_seq sched (t1 + fpt).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1
ideal_progress_proc_model PState ->
preemption_time arr_seq sched (t1 + fpt)
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1
ideal_progress_proc_model PState ->
preemption_time arr_seq sched (t1 + fpt)
move => H_progress.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState
preemption_time arr_seq sched (t1 + fpt)
have [IDLE|[j' SCHED']] :=
scheduled_at_cases _ H_valid_arrivals sched ltac :(by []) ltac :(by []) (t1 + fpt);
first exact : idle_time_is_pt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt)
preemption_time arr_seq sched (t1 + fpt)
have [EQ|NEQ] := (eqVneq jlp j').Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
preemption_time arr_seq sched (t1 + fpt)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
preemption_time arr_seq sched (t1 + fpt)
move : (SCHED'); rewrite -(scheduled_job_at_scheduled_at arr_seq) // -EQ /preemption_time => /eqP ->.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
job_preemptable jlp (service sched jlp (t1 + fpt))
rewrite /service -(service_during_cat _ _ _ t1); last first .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
0 <= t1 <= t1 + fpt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
0 <= t1 <= t1 + fpt
by apply /andP; split ; last rewrite leq_addr. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
job_preemptable jlp
(service_during sched jlp 0 t1 +
service_during sched jlp t1 (t1 + fpt))
have ->: service_during sched jlp t1 (t1 + fpt) = fpt => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
service_during sched jlp t1 (t1 + fpt) = fpt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
service_during sched jlp t1 (t1 + fpt) = fpt
rewrite -{2 }(sum_of_ones t1 fpt) /service_during.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t =
\sum_(t1 <= x < t1 + fpt) 1
apply /eqP; rewrite eqn_leq //; apply /andP; split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t <=
\sum_(t1 <= x < t1 + fpt) 1
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t <=
\sum_(t1 <= x < t1 + fpt) 1
by rewrite leq_sum.
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
\sum_(t1 <= x < t1 + fpt) 1 <=
\sum_(t1 <= t < t1 + fpt) service_at sched jlp t
rewrite big_nat_cond [in X in _ <= X]big_nat_cond.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
\sum_(t1 <= i < t1 + fpt | (t1 <= i < t1 + fpt) &&
true) 1 <=
\sum_(t1 <= i < t1 + fpt | (t1 <= i < t1 + fpt) &&
true)
service_at sched jlp i
rewrite leq_sum //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j'
forall i : nat,
(t1 <= i < t1 + fpt) && true ->
0 < service_at sched jlp i
move => x /andP [HYP _].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) EQ : jlp = j' x : nat HYP : t1 <= x < t1 + fpt
0 < service_at sched jlp x
exact /H_progress/continuously_scheduled_between_preemption_points. } } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) NEQ : jlp != j'
preemption_time arr_seq sched (t1 + fpt)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) NEQ : jlp != j'
preemption_time arr_seq sched (t1 + fpt)
case : (posnP fpt) => [ZERO|POS].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) NEQ : jlp != j' ZERO : fpt = 0
preemption_time arr_seq sched (t1 + fpt)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) NEQ : jlp != j' ZERO : fpt = 0
preemption_time arr_seq sched (t1 + fpt)
subst fpt; rewrite addn0 in SCHED'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat H_progr_le_max_nonp_segment : 0 <=
job_max_nonpreemptive_segment
jlp - 1 H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
0 <= ρH_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + 0 ) H_progress : ideal_progress_proc_model PState j' : Job NEQ : jlp != j' SCHED' : scheduled_at sched j' t1
preemption_time arr_seq sched (t1 + 0 )
exfalso ; move : NEQ => /negP; apply ; apply /eqP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat H_progr_le_max_nonp_segment : 0 <=
job_max_nonpreemptive_segment
jlp - 1 H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
0 <= ρH_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + 0 ) H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' t1
jlp = j'
exact : H_uni. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) NEQ : jlp != j' POS : 0 < fpt
preemption_time arr_seq sched (t1 + fpt)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) NEQ : jlp != j' POS : 0 < fpt
preemption_time arr_seq sched (t1 + fpt)
have [sm EQ2]: exists sm , sm.+1 = fpt by exists fpt .-1 ; rewrite prednK.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job SCHED' : scheduled_at sched j' (t1 + fpt) NEQ : jlp != j' POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt
preemption_time arr_seq sched (t1 + fpt)
move : SCHED'; rewrite -EQ2 addnS => SCHED'.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job NEQ : jlp != j' POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt SCHED' : scheduled_at sched j' (t1 + sm).+1
preemption_time arr_seq sched (t1 + sm).+1
apply : first_moment_is_pt (SCHED') => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job NEQ : jlp != j' POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt SCHED' : scheduled_at sched j' (t1 + sm).+1
~~ scheduled_at sched j' (t1 + sm)
apply : scheduled_job_at_neq => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job NEQ : jlp != j' POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt SCHED' : scheduled_at sched j' (t1 + sm).+1
scheduled_at sched jlp (t1 + sm)
apply : (continuously_scheduled_between_preemption_points (t1 + sm)).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 H_progress : ideal_progress_proc_model PState j' : Job NEQ : jlp != j' POS : 0 < fptsm : nat EQ2 : sm.+1 = fpt SCHED' : scheduled_at sched j' (t1 + sm).+1
t1 <= t1 + sm < t1 + fpt
by apply /andP; split ; [rewrite leq_addr | rewrite -EQ2 addnS]. } }
Qed .
(** And since [fpt <= max_lp_nonpreemptive_segment j t1],
[t1 <= t1 + fpt <= t1 + max_lp_nonpreemptive_segment j t1]. *)
Lemma preemption_time_le_max_len_of_np_segment :
t1 <= t1 + fpt <= t1 + max_lp_nonpreemptive_segment j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1
t1 <= t1 + fpt <=
t1 + max_lp_nonpreemptive_segment j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1
t1 <= t1 + fpt <=
t1 + max_lp_nonpreemptive_segment j t1
have ARRs : arrives_in arr_seq jlp by [].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
t1 <= t1 + fpt <=
t1 + max_lp_nonpreemptive_segment j t1
apply /andP; split ; first by rewrite leq_addr.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
t1 + fpt <= t1 + max_lp_nonpreemptive_segment j t1
rewrite leq_add2l.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
fpt <= max_lp_nonpreemptive_segment j t1
unfold max_lp_nonpreemptive_segment.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
fpt <=
\max_(j_lp <- arrivals_before arr_seq t1 | ~~
hep_job
j_lp j &&
(0 <
job_cost
j_lp))
(job_max_nonpreemptive_segment j_lp - 1 )
rewrite (big_rem jlp) //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
fpt <=
maxn
(if ~~ hep_job jlp j && (0 < job_cost jlp)
then job_max_nonpreemptive_segment jlp - 1
else 0 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - 1 ))
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
fpt <=
maxn
(if ~~ hep_job jlp j && (0 < job_cost jlp)
then job_max_nonpreemptive_segment jlp - 1
else 0 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - 1 ))
rewrite H_jlp_low_priority //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
fpt <=
maxn
(if 0 < job_cost jlp
then job_max_nonpreemptive_segment jlp - 1
else 0 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - 1 ))
have NZ: service sched jlp t1 < job_cost jlp by exact : service_lt_cost.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
fpt <=
maxn
(if 0 < job_cost jlp
then job_max_nonpreemptive_segment jlp - 1
else 0 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - 1 ))
rewrite ifT; last lia .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
fpt <=
maxn (job_max_nonpreemptive_segment jlp - 1 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - 1 ))
apply leq_trans with (job_max_nonpreemptive_segment jlp - ε).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
fpt <= job_max_nonpreemptive_segment jlp - 1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
fpt <= job_max_nonpreemptive_segment jlp - 1
by apply H_progr_le_max_nonp_segment.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp NZ : service sched jlp t1 < job_cost jlp
job_max_nonpreemptive_segment jlp - 1 <=
maxn (job_max_nonpreemptive_segment jlp - 1 )
(\max_(y <- rem (T:=Job) jlp
(arrivals_before arr_seq t1) | ~~
hep_job
y j &&
(0 <
job_cost
y))
(job_max_nonpreemptive_segment y - 1 ))
by rewrite leq_maxl.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
jlp \in arrivals_before arr_seq t1
apply : arrived_between_implies_in_arrivals => [//|//|].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
arrived_between jlp 0 t1
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
job_arrival jlp < t1
eapply low_priority_job_arrives_before_busy_interval_prefix with t1; eauto 2 .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j progr_t1 := service sched jlp t1 : nat fpt : instant H_fpt_is_preemption_point : job_preemptable jlp
(progr_t1 + fpt) H_fpt_is_first_preemption_point : forall ρ : nat,
progr_t1 <= ρ <=
progr_t1 +
(job_max_nonpreemptive_segment
jlp - 1 ) ->
job_preemptable jlp
ρ ->
service sched jlp t1 +
fpt <= ρH_progr_le_max_nonp_segment : fpt <=
job_max_nonpreemptive_segment
jlp - 1 ARRs : arrives_in arr_seq jlp
t1 <= t1 < t2
by move : (H_busy_interval_prefix) => [NEM [QT1 [NQT HPJ]]]; apply /andP.
Qed .
End FirstPreemptionPointOfjlp .
(** For the next step, we assume an ideal-progress processor. *)
Hypothesis H_progress : ideal_progress_proc_model PState.
(** Next, we combine the above facts to conclude the lemma. *)
Lemma preemption_time_exists_case3 :
exists pr_t ,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
set (service := service sched).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
have EX: exists pt ,
((service jlp t1) <= pt <= (service jlp t1) + (job_max_nonpreemptive_segment jlp - 1 )) && job_preemptable jlp pt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
have ARRs: arrives_in arr_seq jlp by [].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
move : (proj2 (H_valid_model_with_bounded_nonpreemptive_segments) jlp ARRs) =>[_ EXPP].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : nonpreemptive_regions_have_bounded_length jlp
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
destruct H_sched_valid as [A B].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : nonpreemptive_regions_have_bounded_length jlp A : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
specialize (EXPP (service jlp t1)).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : 0 <= service jlp t1 <= job_cost jlp ->
exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
feed EXPP. Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : 0 <= service jlp t1 <= job_cost jlp ->
exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
0 <= service jlp t1 <= job_cost jlp
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : 0 <= service jlp t1 <= job_cost jlp ->
exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
0 <= service jlp t1 <= job_cost jlp
apply /andP; split => [//|].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : 0 <= service jlp t1 <= job_cost jlp ->
exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
service jlp t1 <= job_cost jlp
exact : service_at_most_cost.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp EXPP : exists pp : duration,
service jlp t1 <= pp <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) /\
job_preemptable jlp ppA : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
move : EXPP => [pt [NEQ PP]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat ARRs : arrives_in arr_seq jlp A : jobs_come_from_arrival_sequence sched arr_seq B : jobs_must_be_ready_to_execute sched pt : duration NEQ : service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp pt
exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
by exists pt ; apply /andP.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat EX : exists pt : nat,
(service jlp t1 <= pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp pt
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
move : (ex_minnP EX) => [sm_pt /andP [NEQ PP] MIN]; clear EX.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
have Fact : exists Δ , sm_pt = service jlp t1 + Δ.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
exists Δ : nat, sm_pt = service jlp t1 + Δ
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
exists Δ : nat, sm_pt = service jlp t1 + Δ
exists (sm_pt - service jlp t1).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
sm_pt = service jlp t1 + (sm_pt - service jlp t1)
apply /eqP; rewrite eq_sym; apply /eqP; rewrite subnKC //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= n
service jlp t1 <= sm_pt
by move : NEQ => /andP [T _]. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat NEQ : service jlp t1 <= sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 ) PP : job_preemptable jlp sm_pt MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
sm_pt <= nFact : exists Δ : nat, sm_pt = service jlp t1 + Δ
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
move : Fact => [Δ EQ]; subst sm_pt; rename Δ into sm_pt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
exists (t1 + sm_pt); split .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
preemption_time arr_seq sched (t1 + sm_pt)
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
preemption_time arr_seq sched (t1 + sm_pt)
apply first_preemption_time; rewrite /service.service//.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
forall ρ : nat,
service_during sched jlp 0 t1 <= ρ <=
service_during sched jlp 0 t1 +
(job_max_nonpreemptive_segment jlp - 1 ) ->
job_preemptable jlp ρ ->
service_during sched jlp 0 t1 + sm_pt <= ρ
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
forall ρ : nat,
service_during sched jlp 0 t1 <= ρ <=
service_during sched jlp 0 t1 +
(job_max_nonpreemptive_segment jlp - 1 ) ->
job_preemptable jlp ρ ->
service_during sched jlp 0 t1 + sm_pt <= ρ
by intros ; apply MIN; apply /andP; split .
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
sm_pt <= job_max_nonpreemptive_segment jlp - 1
by lia .
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
t1 <= t1 + sm_pt <=
t1 + max_lp_nonpreemptive_segment j t1
apply : preemption_time_le_max_len_of_np_segment => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState jlp : Job H_jlp_is_scheduled : scheduled_at sched jlp t1 H_jlp_low_priority : ~~ hep_job jlp j H_progress : ideal_progress_proc_model PState service := service.service sched : Job -> instant -> nat sm_pt : nat MIN : forall n : nat,
(service jlp t1 <= n <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )) &&
job_preemptable jlp n ->
service jlp t1 + sm_pt <= nPP : job_preemptable jlp (service jlp t1 + sm_pt) NEQ : service jlp t1 <=
service jlp t1 + sm_pt <=
service jlp t1 +
(job_max_nonpreemptive_segment jlp - 1 )
sm_pt <= job_max_nonpreemptive_segment jlp - 1
by lia .
Qed .
End Case3 .
End CaseAnalysis .
(** As Case 3 depends on unit-service and ideal-progress assumptions, we
require the same here. *)
Hypothesis H_unit : unit_service_proc_model PState.
Hypothesis H_progress : ideal_progress_proc_model PState.
(** By doing the case analysis, we show that indeed there is a
preemption time in the time interval [[t1, t1 +
max_lp_nonpreemptive_segment j t1]]. *)
Lemma preemption_time_exists :
exists pr_t ,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
have [Idle|[s Sched_s]] :=
scheduled_at_cases _ H_valid_arrivals sched ltac :(by []) ltac :(by []) t1.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState Idle : is_idle arr_seq sched t1
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState Idle : is_idle arr_seq sched t1
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
by apply preemption_time_exists_case1.
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState s : Job Sched_s : scheduled_at sched s t1
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
destruct (hep_job s j) eqn :PRIO.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = true
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = true
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
exact : preemption_time_exists_case2.
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = false
exists pr_t : instant,
preemption_time arr_seq sched pr_t /\
t1 <= pr_t <= t1 + max_lp_nonpreemptive_segment j t1
apply : preemption_time_exists_case3 => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_unit : unit_service_proc_model PState H_progress : ideal_progress_proc_model PState s : Job Sched_s : scheduled_at sched s t1 PRIO : hep_job s j = false
~~ hep_job s j
by rewrite -eqbF_neg; apply /eqP.
Qed .
End PreemptionTimeExists .
(** In this section we prove that if a preemption point [ppt] exists in a job's busy window,
it suffers no priority inversion after [ppt]. Equivalently the [cumulative_priority_inversion]
of the job in the busy window [t1,t2] is bounded by the [cumulative_priority_inversion]
of the job in the time window [t1,[ppt]). *)
Section NoPriorityInversionAfterPreemptionPoint .
(** Consider the preemption point [ppt]. *)
Variable ppt : instant.
Hypothesis H_preemption_point : preemption_time arr_seq sched ppt.
Hypothesis H_after_t1 : t1 <= ppt.
(** We first establish the aforementioned result by showing that [j] cannot
suffer priority inversion after the preemption time [ppt] ... *)
Lemma no_priority_inversion_after_preemption_point :
forall t ,
ppt <= t < t2 ->
~~ priority_inversion arr_seq sched j t.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt
forall t : nat,
ppt <= t < t2 ->
~~ priority_inversion arr_seq sched j t
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt
forall t : nat,
ppt <= t < t2 ->
~~ priority_inversion arr_seq sched j t
move => t /andP [pptt tt2].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2
~~ priority_inversion arr_seq sched j t
apply /negP => PI.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 PI : priority_inversion arr_seq sched j t
False
move : PI => /andP[j_nsched_pi /hasP[jlp jlp_sched_pi nHEPj]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job jlp_sched_pi : jlp
\in scheduled_jobs_at arr_seq sched t nHEPj : ~~ hep_job jlp j
False
have [/eqP SCHED1 //|[j' /eqP SCHED2 //=]] :=
scheduled_jobs_at_uni_cases arr_seq ltac :(done ) sched ltac :(done )
ltac :(done ) ltac :(done ) t; first by rewrite SCHED1 in jlp_sched_pi.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job jlp_sched_pi : jlp
\in scheduled_jobs_at arr_seq sched t nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_jobs_at arr_seq sched t = [:: j']
False
rewrite SCHED2 mem_seq1 in jlp_sched_pi.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_jobs_at arr_seq sched t = [:: j'] jlp_sched_pi : jlp == j'
False
move : jlp_sched_pi => /eqP HJLP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_jobs_at arr_seq sched t = [:: j'] HJLP : jlp = j'
False
replace j' with jlp in *; clear HJLP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_jobs_at arr_seq sched t = [:: jlp]
False
move : SCHED2 => /eqP SCHED2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_jobs_at arr_seq sched t == [:: jlp]
False
rewrite scheduled_jobs_at_scheduled_at in SCHED2 => //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_at sched jlp t
False
have [ptst [IN1 [PTT STT]]] : exists ptst : nat,
ppt <= ptst <= t /\ preemption_time arr_seq sched ptst /\ scheduled_at sched jlp ptst.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_at sched jlp t
exists ptst : nat,
ppt <= ptst <= t /\
preemption_time arr_seq sched ptst /\
scheduled_at sched jlp ptst
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_at sched jlp t
exists ptst : nat,
ppt <= ptst <= t /\
preemption_time arr_seq sched ptst /\
scheduled_at sched jlp ptst
by apply : scheduling_of_any_segment_starts_with_preemption_time_continuously_sched. } Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp : Job nHEPj : ~~ hep_job jlp j j' : Job SCHED2 : scheduled_at sched jlp t ptst : nat IN1 : ppt <= ptst <= t PTT : preemption_time arr_seq sched ptst STT : scheduled_at sched jlp ptst
False
contradict nHEPj.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp, j' : Job SCHED2 : scheduled_at sched jlp t ptst : nat IN1 : ppt <= ptst <= t PTT : preemption_time arr_seq sched ptst STT : scheduled_at sched jlp ptst
~ ~~ hep_job jlp j
apply /negP /negPn.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp, j' : Job SCHED2 : scheduled_at sched jlp t ptst : nat IN1 : ppt <= ptst <= t PTT : preemption_time arr_seq sched ptst STT : scheduled_at sched jlp ptst
hep_job jlp j
apply : scheduled_at_preemption_time_implies_higher_or_equal_priority => //.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt t : nat pptt : ppt <= t tt2 : t < t2 j_nsched_pi : j
\notin scheduled_jobs_at arr_seq sched
t jlp, j' : Job SCHED2 : scheduled_at sched jlp t ptst : nat IN1 : ppt <= ptst <= t PTT : preemption_time arr_seq sched ptst STT : scheduled_at sched jlp ptst
t1 <= ptst < t2
by lia .
Qed .
(** ... and then lift this fact to cumulative priority inversion. *)
Lemma priority_inversion_occurs_only_till_preemption_point :
cumulative_priority_inversion arr_seq sched j t1 t2 <=
cumulative_priority_inversion arr_seq sched j t1 ppt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt
cumulative_priority_inversion arr_seq sched j t1 t2 <=
cumulative_priority_inversion arr_seq sched j t1 ppt
Proof .Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt
cumulative_priority_inversion arr_seq sched j t1 t2 <=
cumulative_priority_inversion arr_seq sched j t1 ppt
have [LEQ|LT_t1t2] := leqP t1 t2;
last by rewrite /cumulative_priority_inversion big_geq //; exact : ltnW.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt LEQ : t1 <= t2
cumulative_priority_inversion arr_seq sched j t1 t2 <=
cumulative_priority_inversion arr_seq sched j t1 ppt
have [LEQ_t2ppt|LT] := leqP t2 ppt;
first by rewrite (cumulative_priority_inversion_cat _ _ _ t2 t1 ppt) //
; exact : leq_addr.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt LEQ : t1 <= t2 LT : ppt < t2
cumulative_priority_inversion arr_seq sched j t1 t2 <=
cumulative_priority_inversion arr_seq sched j t1 ppt
move : (H_busy_interval_prefix) => [_ [_ [_ /andP [T _]]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt LEQ : t1 <= t2 LT : ppt < t2 T : t1 <= job_arrival j
cumulative_priority_inversion arr_seq sched j t1 t2 <=
cumulative_priority_inversion arr_seq sched j t1 ppt
rewrite /cumulative_priority_inversion (@big_cat_nat _ _ _ ppt) //=.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt LEQ : t1 <= t2 LT : ppt < t2 T : t1 <= job_arrival j
\sum_(t1 <= i < ppt)
priority_inversion arr_seq sched j i +
\sum_(ppt <= i < t2)
priority_inversion arr_seq sched j i <=
\sum_(t1 <= t < ppt)
priority_inversion arr_seq sched j t
rewrite -[X in _ <= X]addn0 leq_add2l leqn0.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt LEQ : t1 <= t2 LT : ppt < t2 T : t1 <= job_arrival j
\sum_(ppt <= i < t2)
priority_inversion arr_seq sched j i == 0
rewrite big_nat_cond big1 //; move => t /andP[/andP[GEt LEt] _].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt LEQ : t1 <= t2 LT : ppt < t2 T : t1 <= job_arrival j t : nat GEt : ppt <= t LEt : t < t2
priority_inversion arr_seq sched j t = 0
apply /eqP; rewrite eqb0.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrivals : valid_arrival_sequence arr_seq PState : ProcessorState Job H_uni : uniprocessor_model PState sched : schedule PState JLFP : JLFP_policy Job H_priority_is_reflexive : reflexive_job_priorities
JLFP H_priority_is_transitive : transitive_job_priorities
JLFP H3 : TaskMaxNonpreemptiveSegment Task H4 : JobPreemptable Job H_valid_preemption_model : valid_preemption_model
arr_seq sched JobReady0 : JobReady Job PState H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq 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_interval_prefix : busy_interval_prefix arr_seq
sched j t1 t2 ppt : instant H_preemption_point : preemption_time arr_seq sched ppt H_after_t1 : t1 <= ppt LEQ : t1 <= t2 LT : ppt < t2 T : t1 <= job_arrival j t : nat GEt : ppt <= t LEt : t < t2
~~ priority_inversion arr_seq sched j t
by apply /no_priority_inversion_after_preemption_point/andP.
Qed .
End NoPriorityInversionAfterPreemptionPoint .
End PriorityInversionIsBounded .