Each task is assigned a preemption level based upon the following formula where D(T_i) denotes the deadline of task i and \pi_i(T_i) denotes the preemption level of task i: D(T_i) \pi_i(T_j) Each resource R has a current ceiling C_R(V_R) that represents the maximum of the preemption levels of the tasks that may be blocked, when there are V units of R available and \mu_R(J) is the maximum units of R that T_i may require at any one time. C_R(V_R) is assigned as follows: C_R(V_R) = max(\{0\} \cup \{\pi(J) | V_R There is also a system ceiling \pi' which is the maximum of all current ceilings of the resources. \pi' = max(\{C_R(i) | i = 1,...,m\} \cup \{\pi(J_c)\}) Any task T_i that wishes to preempt the system must first satisfy the following constraint: \pi' This can be refined for
Operating System implementation (as in
MarteOS) by removing the multi-unit resources and defining the stack resource policy as follows • All tasks are assigned a preemption level, in order to preserve the ordering of tasks in relation to each other when locking resources. The lowest relative deadline tasks are assigned the highest preemption level. • Each
shared resource has an associated ceiling level, which is the maximum preemption level of all the tasks that access this protected object. • The system ceiling, at any instant in time, is the maximum active priority of all the tasks that are currently executing within the system. • A task is only allowed to preempt the system when its absolute deadline is less than the currently executing task and its preemption level is higher than the current system ceiling. == Relevancy ==