diff --git a/response_time.v b/response_time.v index 349f083d09314a81ba037cb58edad50a18e5a78f..02d697bb4b7e665c684e1bd53e3eab905ba36c98 100644 --- a/response_time.v +++ b/response_time.v @@ -1,10 +1,11 @@ Require Import Vbase task job task_arrival schedule util_lemmas ssreflect ssrbool eqtype ssrnat seq fintype bigop. +(* Definition of response-time bound and some simple lemmas. *) Module ResponseTime. Import Schedule SporadicTaskset SporadicTaskArrival. - + Section ResponseTimeBound. Context {sporadic_task: eqType}. @@ -57,16 +58,16 @@ Module ResponseTime. Section SpecificJob. - (* Consider any job ...*) + (* Then, for any job j ...*) Variable j: JobIn arr_seq. - (* ...with response-time bound R in this schedule. *) + (* ...with response-time bound R in this schedule, ... *) Variable R: time. Hypothesis response_time_bound: job_has_completed_by j (job_arrival j + R). - (* The service at any time t' after the response time is 0. *) - Lemma service_at_after_job_rt_zero : + (* the service received by j at any time t' after its response time is 0. *) + Lemma service_after_job_rt_zero : forall t', t' >= job_arrival j + R -> service_at rate sched j t' = 0. @@ -86,8 +87,8 @@ Module ResponseTime. by rewrite big_nat_recr // /=; apply leq_addl. Qed. - (* The cumulative service after the response time is 0. *) - Lemma sum_service_after_job_rt_zero : + (* The same applies for the cumulative service of job j. *) + Lemma cumulative_service_after_job_rt_zero : forall t' t'', t' >= job_arrival j + R -> \sum_(t' <= t < t'') service_at rate sched j t = 0. @@ -96,7 +97,7 @@ Module ResponseTime. rewrite big_nat_cond; rewrite -> eq_bigr with (F2 := fun i => 0); first by rewrite big_const_seq iter_addn mul0n addn0 leqnn. intro i; rewrite andbT; move => /andP [LE _]. - by rewrite service_at_after_job_rt_zero; + by rewrite service_after_job_rt_zero; [by ins | by apply leq_trans with (n := t')]. Qed. @@ -104,33 +105,35 @@ Module ResponseTime. Section AllJobs. - (* Assume a task tsk ...*) + (* Consider any task tsk ...*) Variable tsk: sporadic_task. - (* ...and that R is a response-time bound of tsk in this schedule. *) + (* ... for which a response-time bound R is known. *) Variable R: time. Hypothesis response_time_bound: is_response_time_bound_of_task job_cost job_task tsk rate sched R. + (* Then, for any job j of this task, ...*) Variable j: JobIn arr_seq. Hypothesis H_job_of_task: job_task j = tsk. - (* The service at any time t' after the response time is 0. *) - Lemma service_at_after_rt_zero : + (* the service received by job j at any time t' after the response time is 0. *) + Lemma service_after_task_rt_zero : forall t', t' >= job_arrival j + R -> service_at rate sched j t' = 0. Proof. - by ins; apply service_at_after_job_rt_zero with (R := R); [apply response_time_bound |]. + by ins; apply service_after_job_rt_zero with (R := R); [apply response_time_bound |]. Qed. - (* The cumulative service after the response time is 0. *) - Lemma sum_service_after_rt_zero : + (* The same applies for the cumulative service of job j. *) + Lemma cumulative_service_after_task_rt_zero : forall t' t'', t' >= job_arrival j + R -> \sum_(t' <= t < t'') service_at rate sched j t = 0. Proof. - by ins; apply sum_service_after_job_rt_zero with (R := R); [apply response_time_bound |]. + by ins; apply cumulative_service_after_job_rt_zero with (R := R); + first by apply response_time_bound. Qed. End AllJobs. diff --git a/schedulability.v b/schedulability.v index dbdedb2aca20fb11ac9ae6cfd77a085033bd4680..800bc70a96d1094a3699019759e413006fd37dbf 100644 --- a/schedulability.v +++ b/schedulability.v @@ -1,12 +1,14 @@ -Require Import Vbase task schedule - ssreflect eqtype ssrbool ssrnat seq. +Require Import Vbase job task schedule util_lemmas + ssreflect eqtype ssrbool ssrnat seq bigop. +(* Definitions of deadline miss. *) Module Schedulability. - Import Schedule SporadicTaskset. + Import Schedule SporadicTaskset Job. Section SchedulableDefs. - + + (* Assume that the cost and deadline of a job is known. *) Context {Job: eqType}. Context {arr_seq: arrival_sequence Job}. Variable job_cost: Job -> nat. @@ -14,13 +16,14 @@ Module Schedulability. Section ScheduleOfJobs. + (* For any job j in schedule sched, ...*) Context {num_cpus: nat}. Variable rate: Job -> processor num_cpus -> nat. Variable sched: schedule num_cpus arr_seq. Variable j: JobIn arr_seq. - (* Job won't miss its deadline if it is completed by its arrival time plus its (relative) deadline. *) + (* job j misses no deadline in sched if it completed by its absolute deadline. *) Definition job_misses_no_deadline := completed job_cost rate sched j (job_arrival j + job_deadline j). @@ -35,19 +38,20 @@ Module Schedulability. Variable rate: Job -> processor num_cpus -> nat. Variable sched: schedule num_cpus arr_seq. - Variable ts: taskset_of sporadic_task. + (* Consider any task tsk. *) Variable tsk: sporadic_task. - (* A task doesn't miss its deadline iff all of its jobs don't miss their deadline. *) + (* Task tsk doesn't miss its deadline iff all of its jobs don't miss their deadline. *) Definition task_misses_no_deadline := forall (j: JobIn arr_seq), - job_task j == tsk -> + job_task j = tsk -> job_misses_no_deadline rate sched j. - (* Whether a task misses a deadline before a particular time. *) + (* Task tsk doesn't miss its deadline before time t' iff all of its jobs don't miss + their deadline by that time. *) Definition task_misses_no_deadline_before (t': time) := forall (j: JobIn arr_seq), - job_task j == tsk -> + job_task j = tsk -> job_arrival j + job_deadline j < t' -> job_misses_no_deadline rate sched j. @@ -55,4 +59,113 @@ Module Schedulability. End SchedulableDefs. + Section BasicLemmas. + + Context {sporadic_task: eqType}. + Variable task_cost: sporadic_task -> nat. + Variable task_period: sporadic_task -> nat. + Variable task_deadline: sporadic_task -> nat. + + Context {Job: eqType}. + Variable job_cost: Job -> nat. + Variable job_deadline: Job -> nat. + Variable job_task: Job -> sporadic_task. + + Context {arr_seq: arrival_sequence Job}. + + (* Consider any valid schedule... *) + Context {num_cpus : nat}. + Variable sched: schedule num_cpus arr_seq. + Variable rate: Job -> processor num_cpus -> nat. + + (* ... where jobs dont execute after completion. *) + Hypothesis H_completed_jobs_dont_execute: + completed_jobs_dont_execute job_cost rate sched. + + Section SpecificJob. + + (* Then, for any job j ...*) + Variable j: JobIn arr_seq. + + (* ...that doesn't miss a deadline in this schedule, ... *) + Hypothesis no_deadline_miss: + job_misses_no_deadline job_cost job_deadline rate sched j. + + (* the service received by j at any time t' after its deadline is 0. *) + Lemma service_after_job_deadline_zero : + forall t', + t' >= job_arrival j + job_deadline j -> + service_at rate sched j t' = 0. + Proof. + intros t' LE. + rename no_deadline_miss into NOMISS, + H_completed_jobs_dont_execute into EXEC. + unfold job_misses_no_deadline, completed, completed_jobs_dont_execute in *. + apply/eqP; rewrite -leqn0. + rewrite <- leq_add2l with (p := job_cost j). + move: NOMISS => /eqP NOMISS; rewrite -{1}NOMISS addn0. + apply leq_trans with (n := service rate sched j t'.+1); last by apply EXEC. + unfold service; rewrite -> big_cat_nat with + (p := t'.+1) (n := job_arrival j + job_deadline j); + [rewrite leq_add2l /= | by ins | by apply ltnW]. + by rewrite big_nat_recr // /=; apply leq_addl. + Qed. + + (* The same applies for the cumulative service of job j. *) + Lemma cumulative_service_after_job_deadline_zero : + forall t' t'', + t' >= job_arrival j + job_deadline j -> + \sum_(t' <= t < t'') service_at rate sched j t = 0. + Proof. + ins; apply/eqP; rewrite -leqn0. + rewrite big_nat_cond; rewrite -> eq_bigr with (F2 := fun i => 0); + first by rewrite big_const_seq iter_addn mul0n addn0 leqnn. + intro i; rewrite andbT; move => /andP [LE _]. + by rewrite service_after_job_deadline_zero; + [by ins | by apply leq_trans with (n := t')]. + Qed. + + End SpecificJob. + + Section AllJobs. + + (* Consider any task tsk ...*) + Variable tsk: sporadic_task. + + (* ... that doesn't miss any deadline. *) + Hypothesis no_deadline_misses: + task_misses_no_deadline job_cost job_deadline job_task rate sched tsk. + + (* Then, for any valid job j of this task, ...*) + Variable j: JobIn arr_seq. + Hypothesis H_job_of_task: job_task j = tsk. + Hypothesis H_valid_job: + valid_sporadic_job task_cost task_deadline job_cost job_deadline job_task j. + + (* the service received by job j at any time t' after the deadline is 0. *) + Lemma service_after_task_deadline_zero : + forall t', + t' >= job_arrival j + task_deadline tsk -> + service_at rate sched j t' = 0. + Proof. + rename H_valid_job into PARAMS; unfold valid_sporadic_job in *; des; intros t'. + rewrite -H_job_of_task -PARAMS1. + by apply service_after_job_deadline_zero, no_deadline_misses. + Qed. + + (* The same applies for the cumulative service of job j. *) + Lemma cumulative_service_after_task_deadline_zero : + forall t' t'', + t' >= job_arrival j + task_deadline tsk -> + \sum_(t' <= t < t'') service_at rate sched j t = 0. + Proof. + rename H_valid_job into PARAMS; unfold valid_sporadic_job in *; des; intros t' t''. + rewrite -H_job_of_task -PARAMS1. + by apply cumulative_service_after_job_deadline_zero, no_deadline_misses. + Qed. + + End AllJobs. + + End BasicLemmas. + End Schedulability. \ No newline at end of file diff --git a/task_arrival.v b/task_arrival.v index dd35207290a574a6fcc16410ce702b5fca4e30fb..33b59d2278d6874b0e981f6574aeeb0d83e478d6 100644 --- a/task_arrival.v +++ b/task_arrival.v @@ -1,12 +1,14 @@ Require Import Vbase task job schedule util_lemmas ssreflect ssrbool eqtype ssrnat seq fintype bigop. +(* Properties of the job arrival. *) Module SporadicTaskArrival. Import SporadicTaskset Schedule. Section ArrivalModels. + (* Assume the task period is known. *) Context {sporadic_task: eqType}. Variable task_period: sporadic_task -> nat. @@ -14,13 +16,14 @@ Import SporadicTaskset Schedule. Variable arr_seq: arrival_sequence Job. Variable job_task: Job -> sporadic_task. - (* We define the sporadic task model *) + (* Then, we define the sporadic task model as follows.*) + Definition sporadic_task_model := forall (j j': JobIn arr_seq), - j <> j' -> (* Given two different jobs j and j' such that ... *) - job_task j = job_task j' -> (* ...they are from the same task ... *) - job_arrival j <= job_arrival j' -> (* ...and arr <= arr'... *) - (* then the next jobs arrives 'period' time units later. *) + j <> j' -> (* Given two different jobs j and j' ... *) + job_task j = job_task j' -> (* ... of the same task, ... *) + job_arrival j <= job_arrival j' -> (* ... if the arrival of j precedes the arrival of j' ..., *) + (* then the arrival of j and the arrival of j' are separated by at least one period. *) job_arrival j' >= job_arrival j + task_period (job_task j). End ArrivalModels.