diff --git a/analysis/facts/preemption/job/nonpreemptive.v b/analysis/facts/preemption/job/nonpreemptive.v index be03b3fb3ab39d12f932aba3fd6d4d06824a2cf1..d2c2ee7b6cfc7edd762ad59921f48b13e2938822 100644 --- a/analysis/facts/preemption/job/nonpreemptive.v +++ b/analysis/facts/preemption/job/nonpreemptive.v @@ -7,16 +7,17 @@ Require Export prosa.model.schedule.nonpreemptive. Require Import prosa.model.preemption.fully_nonpreemptive. (** * Platform for Fully Non-Preemptive model *) + (** In this section, we prove that instantiation of predicate [job_preemptable] to the fully non-preemptive model indeed defines a valid preemption model. *) Section FullyNonPreemptiveModel. - + (** Consider any type of jobs. *) Context {Job : JobType}. Context `{JobArrival Job}. Context `{JobCost Job}. - + (** Consider any arrival sequence with consistent arrivals. *) Variable arr_seq : arrival_sequence Job. Hypothesis H_arrival_times_are_consistent : consistent_arrival_times arr_seq. @@ -28,7 +29,7 @@ Section FullyNonPreemptiveModel. (** ... where jobs do not execute before their arrival or after completion. *) Hypothesis H_jobs_must_arrive_to_execute : jobs_must_arrive_to_execute sched. - Hypothesis H_completed_jobs_dont_execute : completed_jobs_dont_execute sched. + Hypothesis H_completed_jobs_dont_execute : completed_jobs_dont_execute sched. (** For simplicity, let's define some local names. *) Let job_pending := pending sched. @@ -127,3 +128,45 @@ Section FullyNonPreemptiveModel. End FullyNonPreemptiveModel. Global Hint Resolve valid_fully_nonpreemptive_model : basic_facts. + +(** In this section, we prove the equivalence between no preemptions and a non-preemptive schedule. *) +Section NoPreemptionsEquivalence. + + (** Consider any type of jobs with preemption points. *) + Context {Job : JobType}. + Context `{JobArrival Job}. + Context `{JobCost Job}. + + (** Consider an ideal uniprocessor schedule. *) + Variable sched : schedule (ideal.processor_state Job). + + (** We prove that no preemptions in a schedule is equivalent to a non-preemptive schedule. *) + Lemma no_preemptions_equiv_nonpreemptive : + (forall j t, ~~preempted_at sched j t) <-> nonpreemptive_schedule sched. + Proof. + split. + { move=> NOT_PREEMPTED j t t'. + elim: t'; first by rewrite leqn0 => /eqP ->. + move=> t' IH LE_tt' SCHEDULED INCOMP. + apply contraT => NOT_SCHEDULED'. + move: LE_tt'. rewrite leq_eqVlt => /orP [/eqP EQ |]; + first by move: NOT_SCHEDULED' SCHEDULED; rewrite -EQ => /negP //. + rewrite ltnS => LEQ. + have SCHEDULED': scheduled_at sched j t' + by apply IH, (incompletion_monotonic _ _ _ t'.+1) => //. + move: (NOT_PREEMPTED j t'.+1). + rewrite /preempted_at -pred_Sn -andbA negb_and => /orP [/negP //|]. + rewrite negb_and => /orP [/negPn|/negPn]. + - by move: INCOMP => /negP. + - by move: NOT_SCHEDULED' => /negP. } + { move => NONPRE j t. + apply contraT => /negPn /andP [/andP [SCHED_PREV INCOMP] NOT_SCHED]. + have SCHED: scheduled_at sched j t + by apply: (NONPRE j t.-1 t) => //; apply leq_pred. + contradict NOT_SCHED. + apply /negP. + by rewrite Bool.negb_involutive. + } + Qed. + +End NoPreemptionsEquivalence. diff --git a/model/preemption/parameter.v b/model/preemption/parameter.v index a02fe8b78bea08d61a72b0e06f1595073dc82995..210792017ff0d552584e460df207df4072426cc6 100644 --- a/model/preemption/parameter.v +++ b/model/preemption/parameter.v @@ -87,7 +87,7 @@ End MaxAndLastNonpreemptiveSegment. model must satisfy. *) Section PreemptionModel. - (** Consider any type of jobs with arrival times and execution costs... *) + (** Consider any type of jobs with arrival times and execution costs... *) Context {Job : JobType}. Context `{JobArrival Job}. Context `{JobCost Job}. @@ -105,6 +105,13 @@ Section PreemptionModel. (** ... and any given schedule. *) Variable sched : schedule PState. + (** We say that a job is [preempted_at t] if the job is scheduled at [t-1] and not scheduled at [t], + but not completed by [t]. *) + Definition preempted_at (j : Job) (t : instant) := + scheduled_at sched j t.-1 + && ~~ completed_by sched j t + && ~~ scheduled_at sched j t. + (** In the following, we define the notion of a valid preemption model. To begin with, we require that a job has to be executed at least one time instant in order to reach a nonpreemptive segment. In other words, a job