EDF-VD算法

Preemptive Uniprocessor Scheduling of Mixed-Criticality Sporadic Task Systems #

其实应该来说,Mixed-Criticality Scheduling of Sporadic Task Systems可能是这个的原文(?)但是看上去内容和作者都没啥大变化,估计就是一篇文章改吧改吧的结果,那就只看这个顺序更靠后的文章即可(2015年 JACM)

模型在传统的MCS的基础上增强了di=pi的属性。这被本文称为混合关键性Sporadic task system

开头在上面那篇2010的文章的基础上也总结了一下10到15那段时间EDF-VD相关的研究。

模型定义 #

一个系统中有K个关键性级别。然后存在n个任务 每个任务都有一个关键性级别χ,属于K的取值中 以及三元组(ci,di,pi)

ci是一个向量,表明从关键性级别1到χ的WCET。并且,关键性级别越低,ci越少。

di是deadline

pi是任务的最小到达间隔。

这个task会按照上述的最小到达间隔生成一系列的MC Jobs,Jij 其中i表示task的id,而j表示序列号

Jij=(aij,lambda ij)

aij是到达时间,lambda在0-ci之间,是具体的job的要求执行时间

最后还有一个scenario的场景的关键性级别k(小k)。大于等于该关键性级别的任务都需要按时完成

对于利用率的定义

\[ u_i(k) = \frac{c_i(k)}{p_i} \]

在k level的利用率是

\[ U_l(k) = \sum_{i∈[n]:χ_i=l}{u_i(k)},其中l∈[1:K],k∈[1:l] \]

所以第一个条件是 对于一个速度为σ的处理器来说, 必须对于任何一个k等级而言,其利用率不大于1

但是并不是说,只要系统利用率小于1,EDF就一定有一个可行的调度

他给的例子是一个level转换的过程,如果一直都是低关键性级别,或者高关键性级别,那么就没问题。但是如果存在超时并进行状态切换,就会出问题。

至于为什么AMC那套不出事情(因为按照这个设定是没法处理的)。我的理解是他在静态分析的阶段已经完成了相关的事情的分析,这是没法过静态分析的。

我觉得,对于上面的这个,可以用一个矩阵(实际上,只有个三角矩阵)来形容,矩阵内是cij,i表示task,j表示level,因为高于task的level的系统level的cij没有意义,会丢弃掉低优先级的任务,所以是一个三角矩阵,下面task1和2的任务关键性级别是1,task3和4的任务关键性级别是2,task5的是3

我举个例子(下面表里面,实际上隐含了每个任务的p是不变的,所以u和c是一一对应的。因此下面有所混淆)

Level1Level2Level3
task1c11*
task2c21*
task3c31c32*
task4c41c42*
task5c51c52c53*

按照我对上面式子的理解,U_l(k)表示的是用户等于l(χ_i=l),系统等于k的u总和。 如,l=1,k=1,那么就应该是c11和c21在求u的和 如果是l=2,k=1,那么应该是c31和c41在求u的和

相应的

\[ \sum_{l=1}^{K}{U_l(l)} \]

这里头l=k都是l 也就相当于把上表的所有带星号的值对应的u求和。

我觉得对这个东西的理解很重要,否则,后面的公式推倒都抓瞎。

EDF-VD #

分为离线预处理和运行时调度两个阶段。

离线预处理阶段对可调度性进行了分析,如果可调度,则增加两个输出值,一个是k,另一个则是每个任务所具有的虚拟截止时间^di,虚拟截止时间永远不会大于真实的di。

运行时调度,如果系统小于等于k,则使用虚拟截止时间来安排作业(EDF嘛,调度顺序跟deadline相关),否则根据原始截止时间来安排作业

离线预处理阶段 #

看图

如果存在所有l情况下的U的求和都小于等于1。把虚拟截止时间设置为原始截止时间 (疑问:为什么如此???上面的例子里面U都小于1,但是却不可调度。而这里在U小于等于1的情况下,虚拟截止时间就是实际原始截止时间。 我仔细看了一下,上面讲的U_l(k)是说在每个任务的关键级别为l的情况下,所有的任务i在系统关键级别为k的情况下的使用率总和。 然后他这里的是对所有的U再求和。也就是说,所有关键级别的运行情况都求和,仍然小于1) 就实际意义而言,应该是,每个任务都按照他们自己宣称的关键性级别,在该级别上运行,这时候不需要丢弃低关键级别的任务,也仍然能够调度的过来。

否则判断是否满足条件(3)(之后说),如果没有满足条件的系统k,就说明不可调度。

如果存在这样的k,就把1到k的关键级别的截止时间都设为原始的截止时间,但是高于k但小于K的则按照一个缩放因子来进行缩放,具体的值为什么这么取,后面也可以继续接着说。

运行时调度 #

他定义了current_level函数 就是说,目前所有的真正的执行时间,都小于等于该level下声明的ci,并且该level是最小的。

运行时调度 首先是根据前面离线阶段的处理

在l小于等于k的时候

所有低于l的任务都被丢弃。更高的则按照虚拟截止时间运行

在l大于k的时候,关键性k+1的任务都恢复原始截止时间。

可调度性的条件 #

作者给出了,要么

\[ \sum_{l=1}^{K}{U_l(l)≤1} \]

要么,存在某个k值,满足

\[ 1-\sum_{l=1}^{k}{U_l(l)>0} \]

并且满足

\[ \frac {\sum_{l=k+1}^{K}{U_l(k)}} {1-\sum_{l=1}^{k}{U_l(l)}}≤ \frac {1-\sum_{l=k+1}^{K}{U_l(l)}} {\sum_{l=1}^{k}{U_l(l)}} \]

就是可调度的。 相关的证明如下

如果第一个条件满足,说明所有的任务都可以在他们自己宣称的关键级别上,按照该关键级别运行。

第二条件才是真正需要证明的部分

他的证明分为两部分

第一步,证明如果存在一个x≤1(这里的x不是指具体的task所在的level,χ,额有那么点混淆,不过问题不大),满足以下的条件

\[ \sum_{l=1}^{k}{U_l(l)}+\sum_{l=k+1}^{K}{\frac{U_l(k)}{x}}≤1 \] \[ x\sum_{l=1}^{k}{U_l(l)}+\sum_{l=k+1}^{K}{U_l(l)}≤1 \]

则对于某个任务来说,EDF就是正确的可调度策略 第二步则反过来证明,如果存在某个k < K,那么就有x≤1满足上面两个式子

(就是正着推和反过来推,都需要满足,从而说明充分必要嘛)