Library prosa.results.edf.rta.limited_preemptive

RTA for EDF with Fixed Preemption Points

In this module we prove the RTA theorem for EDF-schedulers with fixed preemption points.

Setup and Assumptions

Consider any type of tasks ...
  Context {Task : TaskType}.
  Context `{TaskCost Task}.
  Context `{TaskDeadline 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 the classic (i.e., Liu & Layland) model of readiness without jitter or self-suspensions, wherein pending jobs are always ready.
  #[local] Existing Instance basic_ready_instance.

We assume that jobs are limited-preemptive.
  #[local] Existing Instance limited_preemptive_job_model.

Consider any arrival sequence with consistent, non-duplicate arrivals.
Consider an arbitrary task set ts, ...
  Variable ts : list Task.

... assume that all jobs come from this task set, ...
... and the cost of a job cannot be larger than the task cost.
Next, 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.
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.
Let tsk be any task in ts that is to be analyzed.
  Variable tsk : Task.
  Hypothesis H_tsk_in_ts : tsk \in ts.

Next, consider any valid ideal uni-processor schedule with limited preemptions of this arrival sequence ...
Next, we assume that the schedule is a work-conserving schedule...
... and the schedule respects the policy defined by the job_preemptable function (i.e., jobs have bounded non-preemptive segments).

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.
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 (total request bound function).
We define a bound for the priority inversion caused by jobs with lower priority.
  Let blocking_bound A :=
    \max_(tsk_other <- ts | (blocking_relevant tsk_other)
                             && (task_deadline tsk_other > task_deadline tsk + A))
     (task_max_nonpreemptive_segment tsk_other - ε).

Next, we define an upper bound on interfering workload received from jobs of other tasks with higher-than-or-equal priority.
Let L be any positive fixed point of the busy interval recurrence.
  Variable L : duration.
  Hypothesis H_L_positive : L > 0.
  Hypothesis H_fixed_point : L = total_rbf L.

Response-Time Bound

To reduce the time complexity of the analysis, recall the notion of search space.
Consider any value R, and assume that for any given arrival offset A in the search space, there is a solution of the response-time bound recurrence which is bounded by R.
  Variable R : duration.
  Hypothesis H_R_is_maximum:
     (A : duration),
      is_in_search_space A
       (F : duration),
        A + F blocking_bound A
                + (task_rbf (A + ε) - (task_last_nonpr_segment tsk - ε))
                + bound_on_total_hep_workload A (A + F)
        R F + (task_last_nonpr_segment tsk - ε).

Now, we can leverage 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_edf_with_fixed_preemption_points:
    response_time_bounded_by tsk R.
  Proof.
    move: (H_valid_model_with_fixed_preemption_points) ⇒ [MLP [BEG [END [INCR [HYP1 [HYP2 HYP3]]]]]].
    move: (MLP) ⇒ [BEGj [ENDj _]].
    case: (posnP (task_cost tsk)) ⇒ [ZERO|POSt].
    { intros j ARR TSK.
      move: (H_valid_job_cost _ ARR) ⇒ POSt.
      move: TSK ⇒ /eqP TSK; move: POSt; rewrite /valid_job_cost TSK ZERO leqn0; move ⇒ /eqP Z.
      by rewrite /job_response_time_bound /completed_by Z.
    }
    try ( eapply uniprocessor_response_time_bound_edf_with_bounded_nonpreemptive_segments with (L0 := L) ) ||
    eapply uniprocessor_response_time_bound_edf_with_bounded_nonpreemptive_segments with (L := L).
    all: rt_eauto.
    rewrite subKn; first by done.
    rewrite /task_last_nonpr_segment -(leq_add2r 1) subn1 !addn1 prednK; last first.
    - rewrite /last0 -nth_last.
      apply HYP3; try by done.
      rewrite -(ltn_add2r 1) !addn1 prednK //.
      move: (number_of_preemption_points_in_task_at_least_two
               _ _ H_valid_model_with_fixed_preemption_points _ H_tsk_in_ts POSt) ⇒ Fact2.
      move: (Fact2) ⇒ Fact3.
      by rewrite size_of_seq_of_distances // addn1 ltnS // in Fact2.
    - apply leq_trans with (task_max_nonpreemptive_segment tsk).
      + by apply last_of_seq_le_max_of_seq.
      + rewrite -END; last by done.
        apply ltnW; rewrite ltnS; try done.
        by apply max_distance_in_seq_le_last_element_of_seq; eauto 2.
  Qed.

End RTAforFixedPreemptionPointsModelwithArrivalCurves.