Built with
Alectryon , running Coq+SerAPI v8.20.0+0.20.0. Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents. Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus. On Mac, use
⌘ instead of
Ctrl .
Require Export prosa.analysis.facts.busy_interval.pi_bound.[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.results.fixed_priority.rta.bounded_pi.
Require Export prosa.model.schedule.work_conserving.
Require Export prosa.analysis.definitions.busy_interval.classical.
Require Export prosa.analysis.definitions.blocking_bound.fp.
(** * RTA for FP-schedulers with Bounded Non-Preemptive Segments *)
(** In this section we instantiate the Abstract RTA for FP-schedulers
with Bounded Priority Inversion to FP-schedulers for ideal
uni-processor model of real-time tasks with arbitrary
arrival models _and_ bounded non-preemptive segments. *)
(** Recall that Abstract RTA for FP-schedulers with Bounded Priority
Inversion does not specify the cause of priority inversion. In
this section, we prove that the priority inversion caused by
execution of non-preemptive segments is bounded. Thus the Abstract
RTA for FP-schedulers is applicable to this instantiation. *)
Section RTAforFPwithBoundedNonpreemptiveSegmentsWithArrivalCurves .
(** Consider any type of tasks ... *)
Context {Task : TaskType}.
Context `{TaskCost Task}.
Context `{TaskRunToCompletionThreshold Task}.
Context `{TaskMaxNonpreemptiveSegment Task}.
(** ... and any type of jobs associated with these tasks. *)
Context {Job : JobType}.
Context `{JobTask Job Task}.
Context `{Arrival : JobArrival Job}.
Context `{Cost : JobCost Job}.
(** Consider an FP policy that indicates a higher-or-equal priority
relation, and assume that the relation is reflexive and
transitive. *)
Context {FP : FP_policy Task}.
Hypothesis H_priority_is_reflexive : reflexive_task_priorities FP.
Hypothesis H_priority_is_transitive : transitive_task_priorities FP.
(** Consider any arrival sequence with consistent, non-duplicate arrivals. *)
Variable arr_seq : arrival_sequence Job.
Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.
(** Next, consider any ideal uni-processor schedule of this arrival sequence, ... *)
Variable sched : schedule (ideal.processor_state Job).
(** ... allow for any work-bearing notion of job readiness, ... *)
Context `{@JobReady Job (ideal.processor_state Job) Cost Arrival}.
Hypothesis H_job_ready : work_bearing_readiness arr_seq sched.
(** ... and assume that the schedule is valid. *)
Hypothesis H_sched_valid : valid_schedule sched arr_seq.
(** In addition, we assume the existence of a function mapping jobs
to their preemption points ... *)
Context `{JobPreemptable Job}.
(** ... and assume that it defines a valid preemption
model with bounded non-preemptive segments. *)
Hypothesis H_valid_model_with_bounded_nonpreemptive_segments :
valid_model_with_bounded_nonpreemptive_segments arr_seq sched.
(** Next, we assume that the schedule is a work-conserving schedule... *)
Hypothesis H_work_conserving : work_conserving arr_seq sched.
(** ... and the schedule respects the scheduling policy. *)
Hypothesis H_respects_policy : respects_FP_policy_at_preemption_point arr_seq sched FP.
(** Assume we have sequential tasks, i.e, jobs from the
same task execute in the order of their arrival. *)
Hypothesis H_sequential_tasks : sequential_tasks arr_seq sched.
(** Consider an arbitrary task set ts, ... *)
Variable ts : list Task.
(** ... assume that all jobs come from the task set, ... *)
Hypothesis H_all_jobs_from_taskset : all_jobs_from_taskset arr_seq ts.
(** ... and the cost of a job cannot be larger than the task cost. *)
Hypothesis H_valid_job_cost :
arrivals_have_valid_job_costs arr_seq.
(** Let max_arrivals be a family of valid arrival curves, i.e., for
any task [tsk] in ts [max_arrival tsk] is (1) an arrival bound of
[tsk], and (2) it is a monotonic function that equals 0 for the
empty interval delta = 0. *)
Context `{MaxArrivals Task}.
Hypothesis H_valid_arrival_curve : valid_taskset_arrival_curve ts max_arrivals.
Hypothesis H_is_arrival_curve : taskset_respects_max_arrivals arr_seq ts.
(** Let [tsk] be any task in ts that is to be analyzed. *)
Variable tsk : Task.
Hypothesis H_tsk_in_ts : tsk \in ts.
(** Consider a valid preemption model... *)
Hypothesis H_valid_preemption_model :
valid_preemption_model arr_seq sched.
(** ...and a valid task run-to-completion threshold function. That
is, [task_rtct tsk] is (1) no bigger than [tsk]'s cost, (2) for
any job of task [tsk] [job_rtct] is bounded by [task_rtct]. *)
Hypothesis H_valid_run_to_completion_threshold :
valid_task_run_to_completion_threshold arr_seq tsk.
(** Let's define some local names for clarity. *)
Let task_rbf := task_request_bound_function tsk.
Let total_hep_rbf := total_hep_request_bound_function_FP ts tsk.
Let total_ohep_rbf := total_ohep_request_bound_function_FP ts tsk.
Let response_time_bounded_by := task_response_time_bound arr_seq sched.
(** ** Priority inversion is bounded *)
(** In this section, we prove that a priority inversion for task [tsk] is bounded by
the maximum length of non-preemptive segments among the tasks with lower priority. *)
Section PriorityInversionIsBounded .
(** First, we prove that the maximum length of a priority inversion of a job j is
bounded by the maximum length of a non-preemptive section of a task with
lower-priority task (i.e., the blocking term). *)
Lemma priority_inversion_is_bounded_by_blocking :
forall j t1 t2 ,
arrives_in arr_seq j ->
job_of_task tsk j ->
busy_interval_prefix arr_seq sched j t1 t2 ->
max_lp_nonpreemptive_segment arr_seq j t1 <= blocking_bound ts tsk.Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop
forall (j : Job) (t1 t2 : instant),
arrives_in arr_seq j ->
job_of_task tsk j ->
busy_interval_prefix arr_seq sched j t1 t2 ->
max_lp_nonpreemptive_segment arr_seq j t1 <=
blocking_bound ts tsk
Proof .Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop
forall (j : Job) (t1 t2 : instant),
arrives_in arr_seq j ->
job_of_task tsk j ->
busy_interval_prefix arr_seq sched j t1 t2 ->
max_lp_nonpreemptive_segment arr_seq j t1 <=
blocking_bound ts tsk
move => j t1 t2 ARR TSK BUSY; move : TSK => /eqP TSK.Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk
max_lp_nonpreemptive_segment arr_seq j t1 <=
blocking_bound ts tsk
rewrite /blocking_bound /max_lp_nonpreemptive_segment.Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk
\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_(tsk_other <- ts | ~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment tsk_other - 1 )
apply : leq_trans; first exact : max_np_job_segment_bounded_by_max_np_task_segment.Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk
\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 ) <=
\max_(tsk_other <- ts | ~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment tsk_other - 1 )
apply : (@leq_trans (\max_(j_lp <- arrivals_between arr_seq 0 t1
| (~~ hep_task (job_task j_lp) tsk) && (0 < job_cost j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - ε))).Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk
\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 ) <=
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_task
(job_task
j_lp)
tsk &&
(0 <
job_cost
j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - 1 )
{ Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk
\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 ) <=
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_task
(job_task
j_lp)
tsk &&
(0 <
job_cost
j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - 1 )
rewrite /hep_job /FP_to_JLFP TSK.Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_task
(job_task
j_lp)
tsk &&
(0 <
job_cost
j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - 1 ) <=
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_task
(job_task
j_lp)
tsk &&
(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 H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk j' : Job JINB : j' \in arrivals_between arr_seq 0 t1 NOTHEP : ~~ hep_task (job_task j') tsk &&
(0 < job_cost j')
task_max_nonpreemptive_segment (job_task j') - 1 <=
task_max_nonpreemptive_segment (job_task j') - 1
rewrite leq_sub2r //. } Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_task
(job_task
j_lp)
tsk &&
(0 <
job_cost
j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - 1 ) <=
\max_(tsk_other <- ts | ~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment tsk_other - 1 )
{ Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk
\max_(j_lp <- arrivals_between arr_seq 0 t1 | ~~
hep_task
(job_task
j_lp)
tsk &&
(0 <
job_cost
j_lp))
(task_max_nonpreemptive_segment (job_task j_lp) - 1 ) <=
\max_(tsk_other <- ts | ~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment tsk_other - 1 )
apply /bigmax_leq_seqP => j' JINB /andP[NOTHEP POS].Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk j' : Job JINB : j' \in arrivals_between arr_seq 0 t1 NOTHEP : ~~ hep_task (job_task j') tsk POS : 0 < job_cost j'
task_max_nonpreemptive_segment (job_task j') - 1 <=
\max_(tsk_other <- ts | ~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment tsk_other - 1 )
apply leq_bigmax_cond_seq with
(x := (job_task j')) (F := fun tsk => task_max_nonpreemptive_segment tsk - 1 );
last by done .Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk j' : Job JINB : j' \in arrivals_between arr_seq 0 t1 NOTHEP : ~~ hep_task (job_task j') tsk POS : 0 < job_cost j'
job_task j' \in ts
apply : H_all_jobs_from_taskset.Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop j : Job t1, t2 : instant ARR : arrives_in arr_seq j BUSY : busy_interval_prefix arr_seq sched j t1 t2 TSK : job_task j = tsk j' : Job JINB : j' \in arrivals_between arr_seq 0 t1 NOTHEP : ~~ hep_task (job_task j') tsk POS : 0 < job_cost j'
arrives_in arr_seq j'
by apply : in_arrivals_implies_arrived (JINB). }
Qed .
(** Using the above lemma, we prove that the priority inversion of the task
is bounded by the blocking_bound. *)
Lemma priority_inversion_is_bounded :
priority_inversion_is_bounded_by
arr_seq sched tsk (constant (blocking_bound ts tsk)).Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop
priority_inversion_is_bounded_by arr_seq sched tsk
(constant (blocking_bound ts tsk))
Proof .Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop
priority_inversion_is_bounded_by arr_seq sched tsk
(constant (blocking_bound ts tsk))
have PIB: priority_inversion_is_bounded_by arr_seq sched tsk (fun => blocking_bound ts tsk); last by done .Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop
priority_inversion_is_bounded_by arr_seq sched tsk
(fun => blocking_bound ts tsk)
apply : priority_inversion_is_bounded => //.Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop
forall (j : Job) (t1 t2 : instant),
arrives_in arr_seq j ->
job_of_task tsk j ->
busy_interval_prefix arr_seq sched j t1 t2 ->
max_lp_nonpreemptive_segment arr_seq j t1 <=
blocking_bound ts tsk
by exact : priority_inversion_is_bounded_by_blocking.
Qed .
End PriorityInversionIsBounded .
(** ** Response-Time Bound *)
(** In this section, we prove that the maximum among the solutions of the response-time
bound recurrence is a response-time bound for [tsk]. *)
Section ResponseTimeBound .
(** Let L be any positive fixed point of the busy interval recurrence. *)
Variable L : duration.
Hypothesis H_L_positive : L > 0 .
Hypothesis H_fixed_point : L = blocking_bound ts tsk + total_hep_rbf L.
(** To reduce the time complexity of the analysis, recall the notion of search space. *)
Let is_in_search_space := is_in_search_space tsk L.
(** Next, consider any value R, and assume that for any given arrival offset A from the search
space there is a solution of the response-time bound recurrence that is bounded by R. *)
Variable R : duration.
Hypothesis H_R_is_maximum :
forall (A : duration),
is_in_search_space A ->
exists (F : duration),
A + F >= blocking_bound ts tsk
+ (task_rbf (A + ε) - (task_cost tsk - task_rtct tsk))
+ total_ohep_rbf (A + F) /\
F + (task_cost tsk - task_rtct tsk) <= R.
(** Then, using the results for the general RTA for FP-schedulers, we establish a
response-time bound for the more concrete model of bounded nonpreemptive segments.
Note that in case of the general RTA for FP-schedulers, we just _assume_ that
the priority inversion is bounded. In this module we provide the preemption model
with bounded nonpreemptive segments and _prove_ that the priority inversion is
bounded. *)
Theorem uniprocessor_response_time_bound_fp_with_bounded_nonpreemptive_segments :
response_time_bounded_by tsk R.Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop L : duration H_L_positive : 0 < LH_fixed_point : L =
blocking_bound ts tsk +
total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : duration H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound ts tsk +
(task_rbf (A + 1 ) -
(task_cost tsk - task_rtct tsk)) +
total_ohep_rbf (A + F) <=
A + F /\
F + (task_cost tsk - task_rtct tsk) <=
R
response_time_bounded_by tsk R
Proof .Task : TaskType H : TaskCost Task H0 : TaskRunToCompletionThreshold Task H1 : TaskMaxNonpreemptiveSegment Task Job : JobType H2 : JobTask Job Task Arrival : JobArrival Job Cost : JobCost Job FP : FP_policy Task H_priority_is_reflexive : reflexive_task_priorities FP H_priority_is_transitive : transitive_task_priorities
FP arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq sched : schedule (ideal.processor_state Job) H3 : JobReady Job (ideal.processor_state Job) H_job_ready : work_bearing_readiness arr_seq sched H_sched_valid : valid_schedule sched arr_seq H4 : JobPreemptable Job H_valid_model_with_bounded_nonpreemptive_segments : valid_model_with_bounded_nonpreemptive_segments
arr_seq sched H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP H_sequential_tasks : sequential_tasks arr_seq sched ts : seq Task H_all_jobs_from_taskset : all_jobs_from_taskset
arr_seq ts H_valid_job_cost : arrivals_have_valid_job_costs
arr_seq H5 : MaxArrivals Task H_valid_arrival_curve : valid_taskset_arrival_curve ts
max_arrivals H_is_arrival_curve : taskset_respects_max_arrivals
arr_seq ts tsk : Task H_tsk_in_ts : tsk \in ts H_valid_preemption_model : valid_preemption_model
arr_seq sched H_valid_run_to_completion_threshold : valid_task_run_to_completion_threshold
arr_seq tsk task_rbf := task_request_bound_function tsk : duration -> nat total_hep_rbf := total_hep_request_bound_function_FP ts
tsk : duration -> nat total_ohep_rbf := total_ohep_request_bound_function_FP
ts tsk : duration -> nat response_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop L : duration H_L_positive : 0 < LH_fixed_point : L =
blocking_bound ts tsk +
total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : duration H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound ts tsk +
(task_rbf (A + 1 ) -
(task_cost tsk - task_rtct tsk)) +
total_ohep_rbf (A + F) <=
A + F /\
F + (task_cost tsk - task_rtct tsk) <=
R
response_time_bounded_by tsk R
eapply uniprocessor_response_time_bound_fp;
eauto using priority_inversion_is_bounded with basic_rt_facts.
Qed .
End ResponseTimeBound .
End RTAforFPwithBoundedNonpreemptiveSegmentsWithArrivalCurves .