Built with
Alectryon , running Coq+SerAPI v8.15.0+0.15.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 .
From mathcomp Require Import ssreflect ssrbool eqtype ssrnat seq path fintype bigop.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "_ + _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ - _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ < _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ > _" was already used in scope nat_scope.
[notation-overridden,parsing]Notation "_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing]Notation "_ * _" was already used in scope nat_scope.
[notation-overridden,parsing]
Require Export prosa.results.fixed_priority.rta.bounded_nps.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Require Export prosa.analysis.facts.preemption.rtc_threshold.limited.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Require Export prosa.analysis.facts.readiness.sequential.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
Require Export prosa.model.task.preemption.limited_preemptive.Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ | _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ : _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ | _ ]" was already used
in scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ & _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ | _ ]" was already used in
scope fun_scope. [notation-overridden,parsing]Notation "[ rel _ _ in _ ]" was already used in scope
fun_scope. [notation-overridden,parsing]
(** * RTA for FP-schedulers with Fixed Preemption Points *)
(** In this module we prove the RTA theorem for FP-schedulers with
fixed preemption points. *)
(** ** Setup and Assumptions *)
Section RTAforFixedPreemptionPointsModelwithArrivalCurves .
(** We assume ideal uni-processor schedules. *)
#[local] Existing Instance ideal .processor_state.
(** 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}.
(** We assume that jobs are limited-preemptive. *)
#[local] Existing Instance limited_preemptive_job_model .
(** 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.
(** 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.
(** First, we assume we have the model with fixed preemption points.
I.e., each task is divided into a number of non-preemptive segments
by inserting statically predefined preemption points. *)
Context `{JobPreemptionPoints Job}
`{TaskPreemptionPoints Task}.
Hypothesis H_valid_model_with_fixed_preemption_points :
valid_fixed_preemption_points_model arr_seq ts.
(** 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.
(** Recall that we assume sequential readiness. *)
#[local] Instance sequential_readiness : JobReady _ _ :=
sequential_ready_instance arr_seq.
(** Next, consider any valid ideal uni-processor schedule with limited preemptions of this arrival sequence ... *)
Variable sched : schedule (ideal.processor_state Job).
Hypothesis H_sched_valid : valid_schedule sched arr_seq.
Hypothesis H_schedule_respects_preemption_model :
schedule_respects_preemption_model arr_seq sched.
(** 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_priorities.
Hypothesis H_priority_is_transitive : transitive_priorities.
(** 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.
(** ** Total Workload and Length of Busy Interval *)
(** We introduce the abbreviation [rbf] for the task request bound function,
which is defined as [task_cost(T) × max_arrivals(T,Δ)] for a task T. *)
Let rbf := task_request_bound_function.
(** Next, we introduce [task_rbf] as an abbreviation
for the task request bound function of task [tsk]. *)
Let task_rbf := rbf tsk.
(** Using the sum of individual request bound functions, we define
the request bound function of all tasks with higher priority
... *)
Let total_hep_rbf := total_hep_request_bound_function_FP ts tsk.
(** ... and the request bound function of all tasks with higher
priority other than task [tsk]. *)
Let total_ohep_rbf := total_ohep_request_bound_function_FP ts tsk.
(** Next, we define a bound for the priority inversion caused by tasks of lower priority. *)
Let blocking_bound :=
\max_(tsk_other <- ts | ~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment tsk_other - ε).
(** Let L be any positive fixed point of the busy interval recurrence, determined by
the sum of blocking and higher-or-equal-priority workload. *)
Variable L : duration.
Hypothesis H_L_positive : L > 0 .
Hypothesis H_fixed_point : L = blocking_bound + total_hep_rbf L.
(** ** Response-Time Bound *)
(** 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 [A] from search space there is a solution of the
response-time bound recurrence which is bounded by [R]. *)
Variable R : nat.
Hypothesis H_R_is_maximum :
forall (A : duration),
is_in_search_space A ->
exists (F : duration),
A + F >= blocking_bound
+ (task_rbf (A + ε) - (task_last_nonpr_segment tsk - ε))
+ total_ohep_rbf (A + F) /\
R >= F + (task_last_nonpr_segment tsk - ε).
(** Now, we can reuse the results for the abstract model with
bounded non-preemptive segments to establish a response-time
bound for the more concrete model of fixed preemption points. *)
Let response_time_bounded_by := task_response_time_bound arr_seq sched.
Theorem uniprocessor_response_time_bound_fp_with_fixed_preemption_points :
response_time_bounded_by tsk R.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop
response_time_bounded_by tsk R
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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop
response_time_bounded_by tsk R
move : (H_valid_model_with_fixed_preemption_points) => [MLP [BEG [END [INCR [HYP1 [HYP2 HYP3]]]]]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts
response_time_bounded_by tsk R
move : (MLP) => [BEGj [ENDj _]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq
response_time_bounded_by tsk R
edestruct (posnP (task_cost tsk)) as [ZERO|POSt].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq ZERO : task_cost tsk = 0
response_time_bounded_by tsk R
{ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq ZERO : task_cost tsk = 0
response_time_bounded_by tsk R
intros j ARR TSK.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq ZERO : task_cost tsk = 0 j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j
job_response_time_bound sched j R
move : (H_valid_job_cost _ ARR) => POSt.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq ZERO : task_cost tsk = 0 j : Job ARR : arrives_in arr_seq j TSK : job_of_task tsk j POSt : valid_job_cost j
job_response_time_bound sched j R
move : TSK => /eqP TSK; move : POSt; rewrite /valid_job_cost TSK ZERO leqn0; move => /eqP Z.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq ZERO : task_cost tsk = 0 j : Job ARR : arrives_in arr_seq j TSK : job_task j = tsk Z : job_cost j = 0
job_response_time_bound sched j R
by rewrite /job_response_time_bound /completed_by Z.
} Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tsk
response_time_bounded_by tsk R
try ( eapply uniprocessor_response_time_bound_fp_with_bounded_nonpreemptive_segments
with (L0 := L) ) ||
eapply uniprocessor_response_time_bound_fp_with_bounded_nonpreemptive_segments
with (L := L).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tsk
reflexive_priorities
all : rt_eauto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tsk
work_bearing_readiness arr_seq 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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tsk
work_bearing_readiness arr_seq sched
by apply sequential_readiness_implies_work_bearing_readiness; rt_auto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tsk
sequential_tasks arr_seq 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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tsk
sequential_tasks arr_seq sched
by apply sequential_readiness_implies_sequential_tasks; rt_auto.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tsk
forall A : duration,
bounded_pi.is_in_search_space tsk L A ->
exists F : duration,
bounded_nps.blocking_bound ts tsk +
(task_request_bound_function tsk (A + ε) -
(task_cost tsk - task_rtct tsk)) +
total_ohep_request_bound_function_FP ts tsk (A + F) <=
A + F /\ F + (task_cost tsk - task_rtct tsk) <= R
- Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tsk
forall A : duration,
bounded_pi.is_in_search_space tsk L A ->
exists F : duration,
bounded_nps.blocking_bound ts tsk +
(task_request_bound_function tsk (A + ε) -
(task_cost tsk - task_rtct tsk)) +
total_ohep_request_bound_function_FP ts tsk (A + F) <=
A + F /\ F + (task_cost tsk - task_rtct tsk) <= R
intros A SP.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A
exists F : duration,
bounded_nps.blocking_bound ts tsk +
(task_request_bound_function tsk (A + ε) -
(task_cost tsk - task_rtct tsk)) +
total_ohep_request_bound_function_FP ts tsk (A + F) <=
A + F /\ F + (task_cost tsk - task_rtct tsk) <= R
destruct (H_R_is_maximum _ SP) as [FF [EQ1 EQ2]].Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
exists F : duration,
bounded_nps.blocking_bound ts tsk +
(task_request_bound_function tsk (A + ε) -
(task_cost tsk - task_rtct tsk)) +
total_ohep_request_bound_function_FP ts tsk (A + F) <=
A + F /\ F + (task_cost tsk - task_rtct tsk) <= R
exists FF ; rewrite subKn; first 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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
task_last_nonpr_segment tsk - ε <= task_cost tsk
rewrite /task_last_nonpr_segment -(leq_add2r 1 ) subn1 !addn1 prednK; 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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
0 < last0 (distances (task_preemption_points tsk))
+ Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
0 < last0 (distances (task_preemption_points tsk))
rewrite /last0 -nth_last.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
0 <
nth 0 (distances (task_preemption_points tsk))
(size (distances (task_preemption_points tsk))).-1
apply HYP3; try 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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
(size (distances (task_preemption_points tsk))).-1 <
size (distances (task_preemption_points tsk))
rewrite -(ltn_add2r 1 ) !addn1 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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
0 < size (distances (task_preemption_points tsk))
move : (number_of_preemption_points_in_task_at_least_two
_ _ H_valid_model_with_fixed_preemption_points _ H_tsk_in_ts POSt) => Fact2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R Fact2 : 1 < size (task_preemption_points tsk)
0 < size (distances (task_preemption_points tsk))
move : (Fact2) => Fact3.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R Fact2, Fact3 : 1 < size (task_preemption_points tsk)
0 < size (distances (task_preemption_points tsk))
by rewrite size_of_seq_of_distances // addn1 ltnS // in Fact2.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
last0 (distances (task_preemption_points tsk)) <=
(task_cost tsk).+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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
last0 (distances (task_preemption_points tsk)) <=
(task_cost tsk).+1
apply leq_trans with (task_max_nonpreemptive_segment tsk).Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
last0 (distances (task_preemption_points tsk)) <=
task_max_nonpreemptive_segment tsk
* Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
last0 (distances (task_preemption_points tsk)) <=
task_max_nonpreemptive_segment tsk
by apply last_of_seq_le_max_of_seq.Task : TaskType H : TaskCost Task Job : JobType H0 : JobTask Job Task H1 : JobArrival Job H2 : JobCost Job arr_seq : arrival_sequence Job H_valid_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
task_max_nonpreemptive_segment tsk <=
(task_cost tsk).+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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
task_max_nonpreemptive_segment tsk <=
(task_cost tsk).+1
rewrite -END; 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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
task_max_nonpreemptive_segment tsk <=
(last0 (task_preemption_points tsk)).+1
apply ltnW; rewrite ltnS; try 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_arrival_sequence : valid_arrival_sequence
arr_seq 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 H3 : JobPreemptionPoints Job H4 : TaskPreemptionPoints Task H_valid_model_with_fixed_preemption_points : valid_fixed_preemption_points_model
arr_seq ts 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 sched : schedule (ideal.processor_state Job) H_sched_valid : valid_schedule sched arr_seq H_schedule_respects_preemption_model : schedule_respects_preemption_model
arr_seq sched FP : FP_policy Task H_priority_is_reflexive : reflexive_priorities H_priority_is_transitive : transitive_priorities H_work_conserving : work_conserving arr_seq sched H_respects_policy : respects_FP_policy_at_preemption_point
arr_seq sched FP rbf := task_request_bound_function : Task -> duration -> nat task_rbf := rbf 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 blocking_bound := \max_(tsk_other <- ts |
~~ hep_task tsk_other tsk)
(task_max_nonpreemptive_segment
tsk_other - ε) : nat L : duration H_L_positive : 0 < LH_fixed_point : L = blocking_bound + total_hep_rbf L is_in_search_space := bounded_pi.is_in_search_space tsk
L : nat -> bool R : nat H_R_is_maximum : forall A : duration,
is_in_search_space A ->
exists F : duration,
blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + F) <=
A + F /\
F +
(task_last_nonpr_segment tsk - ε) <=
Rresponse_time_bounded_by := task_response_time_bound
arr_seq sched : Task -> duration -> Prop MLP : valid_limited_preemptions_job_model arr_seq BEG : task_beginning_of_execution_in_preemption_points
ts END : task_end_of_execution_in_preemption_points ts INCR : nondecreasing_task_preemption_points ts HYP1 : consistent_job_segment_count arr_seq HYP2 : job_respects_segment_lengths arr_seq HYP3 : task_segments_are_nonempty ts BEGj : beginning_of_execution_in_preemption_points
arr_seq ENDj : end_of_execution_in_preemption_points arr_seq POSt : 0 < task_cost tskA : duration SP : bounded_pi.is_in_search_space tsk L A FF : duration EQ1 : blocking_bound +
(task_rbf (A + ε) -
(task_last_nonpr_segment tsk - ε)) +
total_ohep_rbf (A + FF) <=
A + FF EQ2 : FF + (task_last_nonpr_segment tsk - ε) <= R
task_max_nonpreemptive_segment tsk <=
last0 (task_preemption_points tsk)
by apply max_distance_in_seq_le_last_element_of_seq; eauto 2 .
Qed .
End RTAforFixedPreemptionPointsModelwithArrivalCurves .