Library rt.restructuring.model.preemption.preemption_model
From rt.restructuring.behavior Require Import all.
From rt.restructuring.model Require Import job task.
From mathcomp Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq fintype bigop.
From rt.restructuring.model Require Import job task.
From mathcomp Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq fintype bigop.
Platform with limited preemptions
Since the notion of preemption points is based on an user-provided predicate (variable job_can_be_preempted), it does not guarantee that the scheduler will enforce correct behavior. For that, we must define additional predicates.
Class JobPreemptable (Job : JobType) := job_preemptable : Job → duration → bool.
Section ValidPreemptionModel.
Section ValidPreemptionModel.
Consider any type of tasks ...
... and any type of jobs associated with these tasks.
Context {Job : JobType}.
Context `{JobTask Job Task}.
Context `{JobArrival Job}.
Context `{JobCost Job}.
Context `{JobTask Job Task}.
Context `{JobArrival Job}.
Context `{JobCost Job}.
In addition, we assume the existence of a function
maping jobs to theirs preemption points ...
Consider any kind of processor state model, ...
... any job arrival sequence, ...
... and any given schedule.
For simplicity, let's define some local names.
Let job_pending := pending sched.
Let job_completed_by := completed_by sched.
Let job_scheduled_at := scheduled_at sched.
Let job_completed_by := completed_by sched.
Let job_scheduled_at := scheduled_at sched.
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
must start execution to become non-preemptive.
And vice versa, a job cannot remain non-preemptive after its completion.
Definition job_cannot_be_nonpreemptive_after_completion (j : Job) :=
job_preemptable j (job_cost j).
job_preemptable j (job_cost j).
Next, if a job j is not preemptive at some time instant t,
then j must be scheduled at time t.
Definition not_preemptive_implies_scheduled (j : Job) :=
∀ t,
~~ job_preemptable j (service sched j t) →
job_scheduled_at j t.
∀ t,
~~ job_preemptable j (service sched j t) →
job_scheduled_at j t.
A job can start its execution only from a preemption point.
Definition execution_starts_with_preemption_point (j : Job) :=
∀ prt,
~~ job_scheduled_at j prt →
job_scheduled_at j prt.+1 →
job_preemptable j (service sched j prt.+1).
∀ prt,
~~ job_scheduled_at j prt →
job_scheduled_at j prt.+1 →
job_preemptable j (service sched j prt.+1).
We say that a preemption model is a valid preemption model if
all the assumptions given above are satisfied for any job.