Response-time analysis for mixed criticality systems

Response-time analysis for mixed criticality systems #

本文是非常重要的论文,至少在单核fp的情况下,是后续诸多论文的基础

对于模型,他基本符合在MCS综述里面提及的模型(我怀疑综述也是从这里抄过来的),模型中使用的只是一个双优先级的模型(LO和HI),当然这篇论文说他也有多优先级的情况,并且是单处理器的。

要是缺少相关模型知识就去看综述吧。

首先,本篇论文给出了几种算法

1/ PC(Partitioned Criticality) #

这个算法说的是,分割给不同的关键性以不同的时间区域,所以高低关键性没有互相影响的情况。相对的,这就是不混合的关键系统,而混合关键系统则是混合的时间区域,不在根据关键性来区分

2/ SMC #

优先级由ddl来确定而不再根据关键性水平,从而,一个任务会受到优先级更高(ddl更近或者其他优先级安排)但是临界性更低(也就是错过了ddl相对没那么有关系)的任务的影响。

SMC使用的方法是不允许其超过表示的执行时间

但AMC是允许的

在这里,通常按照之前的说法使用RTA分析方法,公式么也如出一辙

\[ R_i=C_i+\sum_{τ_j ∈ hp(i)} \lceil {\frac{R_i}{T_j}} \rceil C_j \]

但是考虑到临界性,假设有两个任务,其中任务i的优先级大于j,他认为需要考虑三种情况

2.1/ Li = Lj,相等的时候,正常用优先级即可,这没啥差别

2.2/ Li < Lj,这种情况下应当使用Cj(Li),就是在i的关键级别上的j的Cj,来计算

2.3/ Li > Lj,这种情况下,再使用Cj(Li),但是注意到Li大于Lj,所以实际上他被允许执行的时间会比Lj水平上的执行时间更长,并且系统是按照高优先级去进行验证系统可用性,其实不够优化,所以相应的,策略存在两种,另一种是按照Lj去给出Cj

分别是

\[ R_i=C_i+\sum_{τ_j ∈ hp(i)} \lceil {\frac{R_i}{T_j}} \rceil C_j(L_i) \]

\[ R_i=C_i+\sum_{τ_j ∈ hp(i)} \lceil {\frac{R_i}{T_j}} \rceil C_j(min(L_i,L_j)) \]

前者,实际上需要时间监控,来保证j在Lj上运行不超时。

后者虽然不需要监控器,保证不超时,但是实际上给了更高的关键级别的运行时间,这导致了成本更昂贵

被称为SMC-NO

然后提到了Vestal使用audsley的priority assign的事情,给出了一些分析。

3/ AMC #

这个算法嘛,伟大无需多言

简单来说分为几个步骤

3.1/ 存在一个全局的关键性指示器,最开始是LO,以及一个时间监控器(当然只需要监控是否超时即可)

3.2/ 当始终是LO的情况下,按照优先级依次调度

3.3/ 当超时(超过他的LO级别声明的C)发生的时候,关键性指示器从LO变到HI

3.4/ 当始终为HI的时候,声明的关键性级别为LO的任务将不会运行,只会按照优先级运行关键性级别为HI的任务

3.5/ 在某些情况下,可以允许他退化成为优先级为LO(比如优先级为HI的任务一个都不运行了)

他用于说明这个的例子我觉得也很合适

就是他有两种人群:certification authority(CA)就是验证系统可行性的,和system designer 前者会考虑他的WCET,后者希望尽量能用

考虑在抢占的固定优先级单处理器上的系统,仅包括三个工作J1、J2和J3。所有三个工作都在0时发布。工作J1的截止日期为时间2,而另外两份工作的截止日期为时间3.5。作业J2和J3是高临界且需要认证的,而J1是低临界的,因此不是需要认证的。

系统设计师相信,每项工作的最坏情况执行时间(WCET)不超过1。因此,只要J1没有给予最低优先级,所有三项工作都会在截止日期前完成。

然而,CA要求在认证过程中使用更悲观的WCET估计,并允许工作J2和J3可能需要1.5个执行时间单位。即使J1只执行1个时间单位,作业J2和J3只有在获得最高的两个优先级时才能安排;但如果这样做,即使J2和J3只执行1个时间单位,J1也会错过截止日期。

因此,人们可能会得出结论,系统不能以系统设计者和认证机构都能接受的方式安排系统。幸运的是,有一个可以让双方都满意的执行方案。考虑优先顺序J2,然后是J1,最后是J3;以及从时间0开始的以下运行时行为:

  • 在[0,1)执行优先级最高的工作J2。

  • 如果J2在时刻1完成执行,那么在[1,2)上执行J1,在[2,3)上执行J3,从而确保满足所有最后期限(如果需要的话J3可以在[2,3.5)执行)。

  • 如果J2没有按时完成1的执行,那么丢弃J1并继续执行J2,在[1.5,3)上执行J3。

其实关键就在于这里如果J2没有按照系统设计师期望的那样正确的执行的话,就会丢弃J1(实质上就是AMC这里增加关键级别,而J1在低关键级别,所以他就没法完成了(如果我们需要J2和J3都按时完成的话)。

那么这时候,如果J2按照系统设计师所期望的正常在1个单位时间内执行完了,那么就按照第一种可能,否则丢弃J1,按照高优先级进行,以满足CA的需求。

SMC和AMC的差别 #

前者如果有一个LO的任务超时了,他会被禁止执行, 后者如果一个超时了,所有LO的都被禁止执行

前者如果高关键性的任务超时了,他还能继续跑,然后低关键级别任务就只是错过ddl 后者会停下来(我的理解是在LO关键级别停下来,但是还是能继续跑,而不错过DDL)

AMC的响应时间分析 #

LO模式的可调度性分析 #

跟那个基本上一模一样,反正在LO模式下所有task都能跑 \[ R_i^{LO}=C_i+\sum_{τ_j ∈ hp(i)} \lceil {\frac{R_i^{LO}}{T_j}} \rceil C_j(LO) \]

HI模式的可调度性分析 #

\[ R_i^{HI}=C_i+\sum_{τ_j ∈ hpH(i)} \lceil {\frac{R_i^{HI}}{T_j}} \rceil C_j(HI) \] 实际上只考虑LO模式下或者HI模式下都可以适用原先的可调度性框架

切换的可调度性分析 #

主要分析集中在这里

总而言之,他提供了两种响应时间分析的情况,一种被称为AMC-rtb,另一种被称为 AMC-max

关于同样都是,AMC算法,response time analyse的方法不同,如何影响最后的效果,这个怎么理解,我认为这是由于在这种实时的系统中往往依赖于早期的静态分析,从而决定这些任务是否能安排的下。

对于cpu利用率的影响,我的理解是这样的,如果我们的前期静态的算法能尽量的把多的任务放入到系统中去,那么实际的cpu利用率也会更高,但是如果我们的分析的响应时间上界离我们的实际情况差别太大,那么就会导致他实际上塞入了更少的任务。利用率更差

因此,我认为这是两种不同分析方法对于实际的系统的影响,哪怕他们使用相同的AMC调度算法(所以更贴近的响应时间分析是有意义的)

AMC-rtb分析 #

他这个最开始的想法是,在R*时刻,分别计数在他之前的高关键级别和低关键级别的任务,让高关键级别无论如何都运行在高关键级别的时间上面,而低关键级别无论如何都运行在低关键级别的时间上(显然这种情况高于他的真实上界,因为高关键级别的任务在发生这种模式切换之前是运行在C(LO)上面的,而不是C(HI))

具体的初始情况的公式如下(相关含义,刚才已经说了,不再赘述)

\[ R_i=C_i + \sum_{τ_j ∈ hpH(i)} \lceil {\frac{R_i}{T_j}} \rceil C_j(HI) + \sum_{τ_j ∈ hpL(i)} \lceil {\frac{R_i}{T_j}} \rceil C_j(LO) \]

当然,很显然的,他为了更好的贴近上界,这个公式又更进一步的使用Ri LO来表示后面的半个式子

\[ R_i^*=C_i + \sum_{τ_j ∈ hpH(i)} \lceil {\frac{R_i^*}{T_j}} \rceil C_j(HI) + \sum_{τ_j ∈ hpL(i)} \lceil {\frac{R_i^{LO}}{T_j}} \rceil C_j(LO) \]

AMC-max分析方法 #

这个相对来说更复杂一些,但是也更贴近上界 \[ R_i^{s} = C_i(HI)+ I_L(s) + I_H(s) \]

他这里假定有一个任务τs,在s时刻按照AMC的方式,进行了关键级别的转换(这是相比于rtb,额外考虑的情况)

\[ I_L(s)=\sum_{τ_j ∈ hpL(i)} (\lfloor {\frac{s}{T_j}} \rfloor+1) C_j(LO) \]

首先对于关键级别为低的任务,都应该使用LO的C来计算,因为显然在任务切换之后,肯定都不跑了嘛

另一个关键是,他这时候需要有多少次运行

这里必须从0到s这段时间开始算(因为之后就寄了,跑不了了)

对于I_H(s)的计算

则更为复杂,考虑一个其他的任务τ_k,运行到s之后的某个时刻t(事实上,按照响应时间分析的原则,以及之后的实际公式来看,应该用R*更合适,不过都一样,没必要)

在s到t这个时间,任务τ_k可能会最多释放 \[ \lceil {\frac{t}{T_k}} \rceil \] 这么多次数

在s到t这段时间可能产生的释放的次数是 \[ \lceil {\frac{t-s-(T_k-D_k)}{T_k}} \rceil + 1 \]

这里考虑了如果D < T的情况,deadline比周期更小,那么在ddl到下次周期到来中间存在一个空隙

然后定义了一个

\[ M(k,s,t)=min {\lceil {\frac{t-s-(T_k-D_k)}{T_k}} \rceil + 1,\lceil {\frac{t}{T_k}} \rceil} \]

按照他的说法是因为,这个+1会有影响,如果s很小,而Tk-Dk等于0的话,实际上他不应该超过后者,但是这种情况可能多了个1

相应的,对于I_H(s)的计算以及最终的公式如下

\[ R_i^s = C_i(HI) + I_L(s) + \sum_{τ_j ∈ hpH(i)} { M(k,s,R_i^s)C_k(HI) + ((\lceil {\frac{t}{T_k}} \rceil - M(k,s,R_i^s)))C_k(LO) } \]

很显然的,他就是计算了以s为分割,从0到响应时间Ri^s这段时间,前半段按照C(LO)计算的时间,后半段是C(HI)计算的时间。

例子和实测 #

总之,实测肯定是AMC-max更加贴合响应时间的上界,然后效果相对最好。

当然除了上面提到的SMC,SMC-NO,AMC-rtb,AMC-max,还有一个CrMPO和一个最优的,CrMPO这个是说先根据优先级排序然后根据ddl排序

可以看到混合关键系统中,这几个算法都是有效的但是AMC-max确实很棒就是了。