刘剑. 基于国产平台的Linux实时性优化技术研究[D].中国航天科技集团公司第一研究院,2018.
引言
因为嵌入式领域对操作系统的实时性有较高要求,所以对RTOS的研究一直有较高的热度。RTOS更重视平均响应时间,这方面与通用操作系统看重系统整体平均性能不同。只有同时保证计算结果的正确性和和计算结果输出的时效性,才能保证RTOS逻辑的正确性。
虽然Linux内核提供实时支持,但仅支持软实时,尚不具备硬实时能力。所以,为了实现自主可控的实时操作系统,需要在了解Linux内核的基础上,对Linux内核进行实时性改造,从而使Linux操作系统符合RTOS的标准。
实时并不意味着任务执行的速度快,而是指任务的完成时间是可确定的,不会超过规定的时间延迟限制。无论系统负载有多重,实时系统必须保证时间要求。
研究现状和趋势
根据时间约束的重要性和计算结果带来后果的严重程度,RTOS通常有两种分类:软实时操作系统(soft-RTOS)和硬实时操作系统(hard-RTOS)两类,sof-RTOS则只要求任务按照优先级尽可能快地完成操作即可;硬实时操作系统要求任务在提前规定的时间内必须完成。
国外商用RTOS价格昂贵,且不安全
现在嵌入式领域有很多商用的RTOS,例如vxWorks,Windows CE,pSOS,QNX等。这几种RTOS基本可以满足实时系统的一般要求,但是这些商用的实时操作系统价格高昂,会额外增加不少的成本。另外,由于这些实时操作系统的内核代码并不是开源的,用户难以根据自身需要对其进行裁剪,所以在大范围推广和自主可控方面受到了很大的限制。
长期以来,航天领域的软件以应用软件、驱动软件、系统集成等作为软件主要研究方向,对基础软件的设计和研究投入相对较少。操作系统和编译器等真正体现软件核心技术能力的产品在自主可控方面有待大幅度提高,目前还是以国外的产品为主。国内操作系统在航天领域地面计算机操作系统中的使用相对较少,现有武器型号中地面计算机系统大多选用了美国WindRiver公司的vxWorks或Microsoft公司的Windows系列操作系统,导致武器装备系统软件难以达到完全自主可控的程度。另外,最近美国对中兴通讯的出口制裁已经向我们敲响了警钟,实现基础软件和芯片的自主可控迫在眉睫。
这些国外公司开发的实时操作系统使得建立在其上的应用系统和产品都会被国外势力牢牢控制,出现安全风险的机会就高很多,因此自主可控的国产处理器和操作系统一直是相关研究的重点。
国产RTOS专用性较强,一般用于专用领域
目前在中国比较成熟的RTOS有翼辉信息(北京翼辉信息技术有限公司)的Sylixos和中航工业计算所的天脉1、天脉2等。
-
翼辉信息的Sylixos不基于任何开源代码,是完全原创的操作系统,这款完全自主可控操作系统已经用在导弹、卫星、医疗、公交等多种行业控制中。 -
天脉1是一款面向多任务应用的强实时嵌入式系统,提供的调度方式有优先级抢占式调度和优先级时间片轮转调度,优先级管理算法基于位图以及高效的上下文切换算法,保证用户的实时应用需求,支持中断嵌套,为用户紧急事件处理提供了更有效的机制,高效的汇编级中断/异常响应过程能够保证用户外部事件的实时处理需求。C919国产大型客机中的机载信息系统计算机在其安全级别最高的模块中使用了天脉1操作系统。 -
天脉2是一款分区实时操作系统,具有完全自主的知识产权,可以处理多应用和多任务,既满足综合化又满足模块化航空电子系统的应用要求。
此外还有Reworks,DeltaOs等优秀的国产化RTOS。
但是,此类RTOS专用性较强,一般用于特定领域,适用性和可扩展性以及相关的开发工具、辅助工具、技术支持等无法与Linux生态圈相比。另外,上述实时操作系统都是属于受专利保护的商业实时操作系统,所以在测量它们的实际性能时可能存在限制。翼辉信息的Sylixos目前虽然支持源代码开放,但是其主要适用于主流的国外处理器,对国产处理器适配较差。而天脉1和天脉2代码不开源,所以很难对其进行深入研究。
对Linux的实时化改造具有可行性
另外,国内还没有基于国产平台的Linux实时操作系统,所以本文在龙芯平台上对Linux进行实时性改造意义重大。
Linux 2.6版内核开始支持可抢占式任务调度,此后随着低延迟补丁、CFS调度器、优先级继承、高精度时钟系统等改进技术进入Linux主线版本,Linux的实时性不断的提高。但Linux和Windows一样也是一个通用的分时操作系统。将Linux操作系统改造成实时操作系统仍然是一个重要的研究方向,很多国内外科研机构和科技公司都对Linux的实时性进行了深入研究和改进。
两大Linux实时性优化技术路线:
1. 直接修改内核方案:
直接修改Linux内核是让其本身具有实时能力,常见的修改方法是为Linux内核添加实时抢占补丁,主要包括高精度时钟、中断线程化、实时调度策略、优先级继承、临界区可抢占等。
首先,早期的Linux系统为了获取高精度时间,需要访问硬件平台的特定时钟计数器,例如基于x86架构处理器的TSC寄存器,短周期任务运行时,需要提高时钟频率HZ,从而造成时钟中断经常产生,但是这样CPU资源就会浪费在大量的时钟中断处理上。为了应对上述问题,Thomas Gleixner等人开发了新的时钟管理系统
[
1
]
[
2
]
^{[ 1 ] [ 2 ]}
[1][2],最重要的两个支持模块是时钟源clocksource和定时器clockevent。这种时钟管理系统已经在Linux2.6.16版本加入了Linux内核主线。
[1] Gleixner T,Niehaus D.Hrtimers and beyond:Transforming the linux time subsystems[J].Proceedings of the Ottawa Linux Symposium,2006. [2] 刘冀.Tickless技术研究及其在嵌入式系统中的实现[D].电子科技大学,2009.
其次,在中断线程化技术没有进入Linux内核主线以前,中断具有最高优先级,当中断产生时,中断会被优先执行,假如外部10事件发生频率较高,实时任务的调度就无法得到保证。此外,当禁止中断后,其它更紧迫的外部事件发生时,也无法得到处理。为了解决这个问题,Ingo Molnar等人提出了中断线程化技术,把中断变为一个线程,不仅可以避免大量关闭中断的区域,让调度器能够更及时地启动,而且根据任务的实时要求给中断线程安排优先级。需要注意的是,并不是所有的中断都能被线程化,比如时钟中断、Bus Error等中断,所以需要结合实际情况线程化对系统的实时性提高有帮助作用的中断。
再次,Linux系统中主要的实时调度策略是SCHED-FIFO和SCHED-RR,但是对于某些特殊的应用环境,这两种实时调度策略并不能满足所有的实际需求。比如,一些有明确截止时间要求的任务的情况可以使用最早截止时间优先调度策略(EDF)
[
6
]
^{[6]}
[6],EDF算法使用比较普遍,这种算法根据任务的截止时限动态的分配优先级,所以是一种动态优先级调度算法。另外,该算法的实现可以提高Linux系统的实时性。
[6] sha L, Rajkumar R, Lehoczky J P. Priority inheritance protocols: an approach to real-time synchronization[J]. IEEE Transactions on Computers, 2002, 39(9):1175-1185.
最后,早期Linux内核中临界区是被禁止抢占的,系统中的临界区主要使用了自旋锁、大内核锁等,这些临界区不可抢占严重影响了系统的实时性,所以可以用优先级继承的mutex代替自旋锁和大内核锁,从而其它没有使用该共享资源的高优先级任务可以抢占用mutex锁保护的临界区。当然并不是所有的临界区都能被抢占,如寄存器存在的临界区,与之相关的锁也不进行互斥锁转换。mutex锁机制下的优先级反转是一个不可避免的问题,一般使用优先级置顶协议和优先级继承协议阻止不可预期的优先级反转问题。
除此之外,虚拟内存管理方式也是影响Linux实时性能的一个重要因素,进程运行在一个比实际内存大的虚拟内存中,虚拟内存引起的不确定性对实时系统是不能忍受的。实时操作系统一般采用在原有虚拟内存机制之上将实时任务使用的内存页面锁定防止换入换出,或者采用为每个实时任务划分固定的内存区域的静态内存划分方式来解决虚拟内存技术给实时操作系统带来的不可预测性。
2. 双内核方案
双内核实时方案实现比较复杂,需要保留原Linux内核的前提下,另外开发一个新实时内核,实时内核比原内核有更高的优先级,原来的内核作为优先级最低的一个任务在实时内核上运行。
目前国际上基于双内核方案的成熟实时Linux系统有RT-Linux,RTAl,Xenomai等。RT-Linux目前已被WindRiver公司收购,成为了一种不开源的商业实时操作系统,很难对其进行进一步深入研究。RTAI和Xenomai是目前主流的Linux内核接口API改进方案,都基于RT-Linux。
实时操作系统
RTOS的主要特征如下: (1)实时性 实时操作系统在限定的时间内必须对实时任务做出及时的响应,只有符合时间约束的结果才是正确的。 (2)可靠性 实时操作系统的可靠性指在保证实时性的前提下,实时操作系统发生错误或者遇到故障时,系统仍然可以正常运行未出现致命错误的任务。 (3)可预测性 可预测性是实时操作系统的一个至关重要特征,尤其是hard-RTOS。可预测性在实时操作系统主要是指:可以计算出潜在最坏情况下任务的时限,从而保证所有的时限都得到满足。
对RTOS而言,系统的整体性能表现不是很重要,相反其更加关注最坏情况下某一个任务在规定时间内是否能顺利执行完成。
评价RTOS通常从最大中断禁止时间、上下文切换时间、内存开销、任务通信、内存管理、任务调度等几个方面来衡量,其中最大中断禁止时间和上下文切换时间是两个相对比较重要的评价指标。
Linux内核进程调度机制
目前Linux中普通进程使用CFS调度器,实时进程使用实时调度器。
Linux3.10.84调度器中实现了三种公平调度策略和两种实时调度策略,其调度器框架图如图所示:
调度策略 | 数值 | 含义 |
---|
SCHED_NORMAI | 0 | 用于普通进程,由完全公平调度类处理 | SCHED_IDLE | 5 | 在系统空闲时使用,由完全公平调度类处理 | SCHED_BATCH | 3 | 用于非交互的处理器消耗性进程,由完全公平调度类处理。不会抢占CFS调度器处理的另一个进程,因此不会干扰交互式进程 | SCHED_RR | 2 | 轮转调度算法(实时调度策略),用来实现软实时进程,由实时调度处理 | SCHED_FIFO | 1 | 先进先出调度算法(实时调度策略)用来实现软实时进程,由实时调度处理 |
模块化调度框架
Ingo Molnar
[
20
]
^{[20]}
[20]实现了Linux调度器的模块化,方便了调度器的扩展。
[20] Saez J C, Pousa A, Castro F, et al. ACFS: a completely fair scheduler for asymmetric single-isa multicore systems[J]. 2015:2027-2032.
3.1.2 进程和调度实体~~未完待续
|