介绍一种基于核集的多核嵌入式实时调度方法

描述

0   引言

在多任务环境下,嵌入式系统中通常运行着多于处理机数目的任务,这就要求操作系统能够按照某种算法为处于就绪状态的任务动态地分配处理机,处理机调度的实质是对处理器资源进行分配。调度算法的好坏直接影响系统运行时的性能(如响应的及时性、系统的吞吐量以及资源利用率等),是操作系统不可或缺的一部分。

多核处理器的引入使得嵌入式计算平台中的任务能够在不同处理器核心上并行运行,增加系统计算能力的同时也为系统调度带来了新的挑战。在单核处理器中调度程序仅需遍历任务就绪表、找到最高优先级的任务即可,而在多核处理器中不仅要考虑优先级问题,还要考虑任务将在哪个 CPU 核上运行的问题。本文基于多核嵌入式实时操作系统半划分调度算法,针对多核操作系统中任务调度存在的问题,在保证原有操作系统调度机制不被破坏的基础上提出了一种基于核集的多核嵌入式调度方法。改进了原来调度策略中任务只运行于一个处理器核或者可以运行于所有核的状况,使任务能够运行于局部核,在一定程度上可以解决半划分调度算法中负载不均衡问题。

1   多核嵌入式实时调度

多处理机调度分为全局调度(global scheduling)和划分调度(partitioned scheduling)。全局调度允许任务在所有处理核心之间自由迁移;划分调度则是将每个任务绑定到固定的处理核心上运行。全局调度能够提高处理机的利用率,但却会带来额外的系统开销;划分调度则恰恰相反,任务只会在固定处理核上运行,缓存命中率较高,不会产生任务跨核迁移的花销。但由于任务被绑定在固定核上,无法有效利用空闲处理器,处理机利用率较低。为了解决这一矛盾,研究者们提出一种半划分调度算法,该方法将全局调度和划分调度的行为特性进行综合,吸纳了两种方法的优点。在任务调度过程中,一部分任务采用划分调度思想,另外一部分任务则采用全局调度思想。这种策略可以均衡系统的负载,解决空闲处理器难以利用的问题。

1.1 全局调度

全局调度即任务可运行于任一处理器核,操作系统会根据任务优先级、空闲处理器核的情况进行任务的动态分配。全局调度是比较简单的调度算法,通过构建一个全局就绪队列来管理就绪任务。系统有空闲处理器核时便会 从全局就绪队列中调度一个最高优先级的任务。

多核采用该调度策略时,任务执行的时序关系将从单核原有的串行执行序列完全变为并行执行,较低优先级的任务将会与高优先级的任务在不同处理器核上同时运行。多核全局调度示意图如图1所示,在四处理器核系统中,任务1、任务2、任务3虽然优先级不同,但能够同时在不同核上运行,当处理器核3空闲时调度器将较低优先级任务调度到该空闲核上运行。在任务完全不相关的情况下,采用全局调度算法可以充分利用多核特性,有效利用空闲处理器提高系统总体处理机的利用率,自动平衡整个系统负载。

负载均衡

图1  多核全局调度

虽然多核系统通过全局调度能够带来很多好处,但其存在着不可避免的缺点,主要包括以下三点:

① 无执行序列:多核全局调度在提高任务执行性能的同时,任务的执行序列发生改变,原有任务之间的执行关系将因为并行执行而发生变化,需要对任务的调度安排进行统筹考虑。

② 缓存命中率低:多核处理器中每个处理器核都有自己的缓存,其中存储任务的相关数据,而在全局调度中任务可能会被调度到其他处理器核上,这无疑会降低缓存命中率,从而大幅度降低系统性能。

③ 全局就绪链表访问冲突:系统中仅有一个全局就绪链表属于核间共享数据,在某一时刻只能由一个核使用,访问冲突会随着核数的增大而愈加频繁,增加系统任务切换花销。

1.2 划分调度

针对全局调度的上述缺点,一些多核嵌入式实时操作系统选择使用划分调度。划分调度策略是对任务集进行划分,每个任务都与特定的处理器核建立绑定关系(即指定任务的亲和属性),任务仅在预先分配的处理器核上执行。在任务执行的过程中,不会在处理器核间进行迁移。当创建一个任务时,完全由用户来决定该任务在哪个处理器核上运行。划分调度的基本思想如图2所示,系统为每个处理器核建立一个任务就绪队列,该队列上的任务均为绑定亲和属性的任务,处理器核在进行任务调度时仅在对应自己核号的亲和队列(私有队列)上选择任务。

负载均衡

图2  多核划分调度

使用划分调度策略时,任务运行的确定性比全局任务调度的确定性更好,且由于没有任务的跨核调度,系统调度成本显著降低,处理器的缓存命中率与单核情况下保持一致。相对全局调度,划分调度主要存在以下缺点:

① 核间通信较为频繁:由于任务绑定在核上执行,那么不同处理核上运行的任务之间交互较多时,将导致核间通信(中断)的频繁发生,如此会对任务的执行产生一定负面影响。

② 处理器总体利用率相对较低:任务绑定在固定处理器核上运行会导致系统难以利用空闲处理器核,出现有的核空闲、有的核忙绿的低效率现象。

1.3  半划分调度

在全局调度模式下系统的总体处理机利用率较高,但却可能带来较大的系统开销;划分调度则恰恰相反,虽然调度花销较少,但空闲处理机无法充分利用,处理机使用率较低。为了解决这一矛盾,学术界吸收了两种调度方法的优点,基于划分调度提出一种称为半划分调度的调度方法,该方法将全局调度与划分调度结合,同时具有全局调度与划分调度的行为特征。在系统进行任务调度时,大部分任务被预先划分到一个固定的核心上运行,采用划分调度策略;而剩余部分任务则采用全局调度策略,运行在多个核心上。

多核半划分调度示意图如图3所示,半划分调度中有两种任务的就绪队列,分别是全局就绪队列和每核就绪队列,当有 N 个处理器核时,共有 N+1 个就绪队列。系统基于优先级的抢占式调度,处理器在调度时会选择每核就绪队列和全局就绪队列中优先级最高的任务。这种策略可以缓解空闲处理器难以利用的问题、增强系统的负载均衡,同时在一定程度上弥补了全局调度与划分调度的不足。

负载均衡

图3  多核半划分调度

2   基于核集的多核实时调度方法

由于半划分调度基于全局调度与划分调度的思想,系统在减少任务跨核调度的基础上,还可以尽可能充分地利用空闲处理器。但该方法仍然容易出现负载不平衡的现象,例如在航空航天领域,由于确定性需求,需要将大部分任务与处理器核建立绑定关系,所以仍然可能由于任务分配的不均匀导致部分空闲处理器无法得到利用、浪费处理器资源。

此外,当全局就绪链中的任务较多时,处理器缓存命中率也会降低、影响系统性能。本文基于半划分调度提出一种基于核集的嵌入式实时调度方法,为任务增加核集属性。用户在配置好任务的核集属性后,如果设置任务的亲和属性,只能在指定核集范围内设置;如果未设置亲和属性,则任务可全局调度,但此全局调度被限定为核集范围,即局部全局调度。如果用户没有为任务配置核集,则默认核集为所有核。

基于核集的半划分调度示意图如图4所示,任务A指定核集为[0,1],那么任务指定亲和属性只能是0核或者1核;如果不指定亲和属性,则任务进行全局调度,但调度范围由最初的[0,1,2,3,…,N] 缩小为核集指定的[0,1],任务只能在0核或者1核上运行。

负载均衡

图4  基于核集的半划分调度

在处理器核选择后继任务时,对全局就绪队列多加一层筛选,将任务核集中包含当前处理器核(即满足核集配置的任务)单独组成一个链表。在满足核集配置的任务链表中找到最高优先级任务,并与亲和就绪队列中最高优先级任务进行比较,将优先级高的任务调度到该处理器核上运行。处理器选择任务过程如图5所示。核2目前空闲或者需要重调度,首先按优先级从低到高依次遍历全局就绪队列:任务A核集不包含核2,不满足核集配置,继续遍历;任务B核集包含核2,加入到满足核集配置的任务链表;以此类推,继续遍历直到最高优先级任务X,核集不包含核2,第一轮遍历完毕,筛选出全局就绪队列中满足核集配置要求的任务集合。然后确认任务B是满足核集配置要 求的任务集合中优先级最高的任务,将任务B的优先级与核2亲和队列中最高优先级进行比较,两者取较高优先级的任务在核2上运行。

负载均衡

图5  处理器选择任务过程      

3   基于核集的多核实时调度流程

基于核集的实时调度流程图如图 6 所示。

负载均衡

图6  基于核集的实时调度流程图

步骤1:嵌入式系统通常在中断服务程序结束、任务因等待资源阻塞、高优先级任务就绪等触发调度事件发生后开始调度。

步骤2:获取当前核号,用于获取该核亲和队列以及筛选满足核集配置要求的任务集合。

步骤3:遍历该核亲和就绪队列,找到队列上最高优先级任务PrivateHightestTask。

步骤4:遍历全局就绪队列,将满足核集配置的任务筛选出来单独组成一个任务集合。

步骤5:获取步骤4中任务集合中优先级最高的任务 GlobalHightestTask。

步骤6:判断 PriveteHightestTask 的优先级是否高于 GlobalHightestTask 的优先级,如果是,则继续步骤7,否则继续步骤8。

步骤7:将 GlobalHightestTask 置为处理器核调度的后继任务,继续步骤11。

步骤8:判断PriveteHightestTask 的优先级是否等于 GlobalHightestTask 的优先级,如果是,则继续步骤9,否则继续步骤10。

步骤9:将 PrivateHightestTask 与 GlobalHightest Task中就绪时间长的任务置为处理器核调度的后继任务,继续步骤11。

步骤10:将 PrivateHightestTask 置为处理器核调度的后继任务,继续步骤11。

步骤11:处理器核调度确定的后继任务运行。

步骤12:一次任务调度结束,等待下次调度事件触发,进入下一次调度流程,执行步骤1。

4   结语

多核嵌入式系统中半划分调度使用一个全局运行队列来实现负载均衡,以此来提高划分调度的处理器利用率。本文针对半划分调度方法存在的多核负载不均衡问题,提出了改进的基于核集的调度算法,与原来的半划分调度算法相比,理论上该方法在不破坏原有系统调度的前提下,改善了半划分调度算法中处理器负载不均衡的问题,同时能够保证很好的实时性,也可为未来多核嵌入式容器运行配置提供支撑。目前已经在 FT1500-A 上完成了开发测试,任务可正常运行,且可配置任务核集属性,任务只可在指定核集范围内运行,下一步工作将通过实验验证该调度算法在负载均衡方面是否优于原来的半划分调度。




审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分