APP下载

航天嵌入式Linux实时性能优化研究*

2018-07-05刘宇帅王金波吴晨阳

航天控制 2018年3期
关键词:实时性补丁内核

刘宇帅 苏 宇 王金波 吴晨阳

1. 中国科学院大学,北京 100049 2.中国科学院空间应用工程与技术中心,北京 100094

为了适应更为复杂的空间环境并完成繁杂的空间任务,近些年来航天领域的嵌入式软件系统从应用规模、复杂度及重要性程度都保持持续上升态势。相较于UC/OS难以满足复杂的多接口通信需求,VxWorks价格昂贵且不公开源码的问题,Linux以其稳定、开源以及容易移植等优势,逐渐应用在国外航空航天领域。2014年1月,日本宇宙航空研究开发机构JAXA将太阳观测卫星“日出”(SOLAR-B),以及观测卫星GEOTAIL的卫星管制功能转移至Linux平台上;Space X已将Linux广泛应用于航天器中,且好奇号火星探测器部分控制已由Linux实现。而国内在该领域的研究和应用尚属空白。

随着我国载人航天工程迈入载人空间站阶段,载荷种类、数量和复杂度均成倍增长,在未来航天器的建设中,需要利用实时操作系统在机制上给予保障,以保证系统的稳定、可靠与高质量,并提高软件的开发效率。Linux作为一个通用操作系统,虽然有许多优越的特性[1],但其实时性能有限[2],切换时间的不确定性对系统安全性造成严重威胁,甚至有可能造成灾难性事故,如1996年阿丽亚娜V运载火箭失事。优先级反转对系统有致命危害,会导致任务错乱、逻辑错乱,造成任务调度时时间的不确定性,甚至有可能致使系统崩溃。例如火星探路者号(Mars Pathfinder),曾由于优先级反转,导致内部执行逻辑出现bug,系统无故重启。因此,针对空间站下一阶段有效载荷多线程、高并发的特点,提出采用基于Preempt RT补丁的Linux系统作为有效载荷的控制系统,为保证在空间站阶段操作系统的稳定性和可靠性要求,将与空间站密切相关的任务切换时间、优先级反转作为重点进行分析研究。

1 标准Linux实时性能分析

标准Linux是一款优秀的分时操作系统,追求的是高的系统吞吐率和公平性[3],但实时性不佳,主要体现在以下几个方面:

1)内核不完全可抢占,相比2.4版本的内核,2.6版本开始引入了内核抢占机制,但内核对关键代码进行保护,仍然有相当一部分区域禁止抢占,大大增加任务切换时间的不确定性;

2)时钟颗粒度粗糙,2.6版本内核时钟精度可达1000Hz,但过度提高内核时钟精度又会牺牲系统的吞吐率;

3)关中断问题,内核在接收到外部中断进入中断处理程序后,会暂时关闭系统中断;

4)优先级翻转问题,标准Linux内核并未对优先级翻转问题采取保护措施,导致低优先级任务抢占高优先级任务,造成不可预知的后果。

以上特性对于有实时性要求的系统来说是不可容忍的,有可能给空间站系统带来巨大的不确定性。因此非常有必要提升Linux的实时性能。

2 Linux内核优化方法

标准的Linux 并未提供实时的操作系统内核[4],但其开源特性让我们可以通过改造实现实时性需求。目前主要有以下2种方式:①直接对标准的Linux内核进行修改,增强其实施性能;②采用双内核方案,对标准的Linux内核进行外部实时性扩展,以内核可加载模块的方式实现一个实时微内核,将所有实时任务都交由实时内核来处理[5]。与对Linux内核进行外部实时扩展相比,对内核修改使其应用程序的开发与标准毫无区别,可以充分利用Linux内的各种系统调用,更适合在现有平台上进行Linux实时性的测试和研发。综上,本文提出对标准Linux内核实时化的优化方案:重写实时互斥锁、改变优先级调度策略、增加可抢占点及为提高中断响应使其线程化等方面进行优化,如图1所示。因此,本文通过选取Preempt RT补丁的方案来提升Linux内核实时性。

图1 Linux内核优化示意图

2.1 实时可抢占补丁

实时抢占补丁(Realtime Preemption Patch,Preempt RT)由Ingo Molnar 和 Thomas Gleixner更新维护[6],并且由开源自动化实验室(OSADL)测试其稳定性。核心思想是提高内核本身的可抢占性,即让尽可能多的代码能够被抢占。其实现方法和原有的增加实施抢占方法不同,它是在原有低延迟补丁和抢占补丁的基础上加入中断线程化、高精度时钟、优先级继承等新特性,将Linux内核修改成完全可抢占式内核,使其具有硬实时能力[7]。实时抢占补丁最小化了内核中不可抢占部分的代码,同时也最小化了为支持抢占性所必须要修改的代码量[8]。

可抢占内核的实现对Linux具有非比寻常的意义。首先,这是将Linux应用于实时系统所必需的。严苛的响应时间限制是实时系统的特性之一,设备发生中断后会唤醒实时进程,该进程需要在规定时间内调度执行。但现有内核是不可抢占的,无法实现该要求,且内核中的响应时间不可控。在实际运行过程中,当较长的系统调用被执行时,实时进程只有在当前内核运行进程完全退出时才能执行,现有环境条件下的延迟时间达到100ms的数量级,对于有高实时响应要求的系统来说是不能容忍的。因此可抢占内核不仅对Linux实现实时性意义非凡,也改善了Linux对某些低延迟应用不能有效支持的问题。

2.2 机理分析

补丁引入了一组正交机制,减少内核延迟并使内核更具确定性。其中一些机制(例如高分辨率计时器和优先级继承)已经被合并到了主线内核[9]。补丁对内核的提升是多方面的,本文将与空间站密切相关的任务切换时间、优先级反转作为重点进行分析。

2.2.1 上下文切换时间

进程运行过程中CPU所包含的信息,包括寄存器值、进程状态和堆栈内容被称为该进程的上下文。当进程被其他进程抢占发生中断时,系统会将CPU中包含的信息保存,并将抢占了CPU活动进程的上下文信息加载入CPU,整个过程称为上下文切换。而当被抢占进程重新获得CPU等资源再次执行时,它能恢复自己的上下文信息并从中断时刻重新开始执行,其实质就是被中断运行的进程与准备运行的进程实现在CPU中上下文的切换。切换时间就是计算从保存被抢占进程的上下文、到恢复某一原先被抢占进程中被保存的上下文信息、最后将控制传递给这个新恢复的进程整个过程的时间就是切换时间。

标准Linux内核采用spin_lock(自旋锁)保护临界资源,spin_lock的一个特点是进入临界区时禁用抢占;而Preempt-rt补丁通过采用rt_mutex代替传统的禁用抢占的spin_lock,并定义了新的数据类型:spin_lock_t,即凡是使用了该数据类型的spin_lock不会禁用内核抢占。因此内核中不可抢占区域进一步减少,增加了内核的抢占点,降低了上下文切换时间不确定性。

2.2.2 优先级反转

优先级反转指具有较低优先级任务占有较高优先级任务所需的共享资源,高优先任务因资源无法获得而被迫挂起,直至较低优先级任务释放该资源为止。由于低优先级得到CPU时间短,若该时刻有优先级处于高低优先级之间的任务就绪,且不用该共享资源,则该中优先级任务将获得CPU时间。

如图2所示,假设此时系统中有A,B,C三个线程,优先级依次降低,其中线程A和线程C在运行过程中都需同一共享资源。程序开始执行,线程C获得资源开始运行,线程A由于优先级最高在T1时刻抢占CPU并运行。线程A需要的资源正被线程C占用,因此在T2时刻让出CPU,与此同时优先级较高的线程B获得调度抢占了CPU,直至T3时刻运行完成让出CPU。线程B运行结束后线程C继续执行。T4时刻,线程C运行结束释放共享资源,线程A获得资源最后运行。由此发现,线程A虽然具有最高优先级却最后才得到运行。

图2 优先级翻转示意图

Linux进程调度采用动态优先级调度方式。系统会根据每个进程的优先级和它所采用的调度策略[10]计算权值,并以此进行调度,简单而有效。

优先级反转解决方案主要有:(1)设置优先级的上限,为临界区设定某个高优先级,进入该临界区的每个进程,如果优先级低于设定的上线,就会获得这一优先级;(2)优先级继承,如果较高优先级进程正在等待某一较低优先级进程正在占用的资源时,则低优先级进程优先级会提升到和高优先级进程一样的优先级,在释放共享资源后,进程优先级能恢复到原有优先级状态;(3)采用中断禁止,以禁止中断的方法保护临界区。在该方法下系统只存在2种优先级:1)可抢占优先级,是进程一般运行过程中所拥有的优先级;2)中断禁止优先级,在临界区运行时拥有的优先级。

Preempt RT补丁中采用优先级继承协议的方法解决此问题。Preempt RT补丁为实现优先级继承,在内核中增加了名为rt_mutex的互斥锁。在具有补丁Preempt RT的Linux内核中,自旋锁和互斥体将转换为实时互斥体。旋转锁转换为实时自旋锁,使用rt_mutex实现互斥[11]。

rt_mutex是互斥锁结构,包含3个元素。

struct rt_mutex {

raw_spinlock_t wait_lock; /* 保护自旋锁 */

struct plist_head wait_list; /* 等待所有waiter链表 */

struct task_struct *owner; /* 获得锁的task,没有为NULL */

}

rt_mutex_waiter结构是作为task在rt_mutex上挂起时的连接件而存在的,其实它逻辑上应该是task_struct的一部分。rt_mutex waiter的数据结构如下,用于记录等待互斥锁的结构:

struct rt_mutex_waiter {

struct plist_node list_entry;/* 用于将此结构连接到对应的互斥锁上 */

struct plist_node pi_list_entry;/*连接到互斥锁所有者上等待链表 */

struct task_struct *task; /* 此waiter所属的task,等待此mutex的task */

struct rt_mutex *lock;/* 此waiter等待的mutex */

};

pi_waiters是进程描述符 task_struct中用来链入等待该进程持有的资源的等待者中优先级最高的rt_mutex_waiter。task通过pi_waiters遍历到在它持有的每个rt_mutex上挂起的最高优先级的task(称作top waiter)。整个遍历方式都由plist提供,与其相应的不同task优先级将作为挂起的rt_mutex_waiter排序的依据。这样,一个task能继承到的优先级就是通过pi_waiters取到的第一个rt_mutex_waiter所对应的task的优先级。rt_mutex则通过wait_list遍历在它身上挂起的rt_mutex_waiter,从而遍历到挂起的task。在此需要注意的是rt_mutex.wait_list中进程优先级的变化会引起top waiter优先级的改变,此时需要将原来的top waiter从task_struct的pi_waiters里面移出,再把新的top waiter加进去,为确保这一流程有序实现,rt_mutex.wait_list也应该是一个优先级已经排序的plist。综上所述,preempt RT通过优先级的继承解决了优先级反转的问题。

3 实验验证

实时操作系统是一个按照时序方式调度和执行任务、保证任务时间需求和管理系统资源的系统程序,其主要特点是响应及时和可靠性高[12]。因此,在阐述了Linux内核实时性能差的问题,并对Preempt RT进行分析后,下面对基于Preempt RT补丁的Linux的实时性从任务切换时间、优先级反转方面的问题进行测试验证。

3.1 ZYNQ处理器

接口随着嵌入式系统越来越复杂,功能越来越强大,在设计中既需要非常灵活的FPGA,又需要处理器去做一些控制,以及配合操作系统使用。因此本次实验基于Xilinx公司ZYNQ7000系列ZC7045处理器。

ZYNQ-7000是第一代可扩展处理平台(Extensible Processing Platform,EPP),同时具有软件、硬件和IO均可编程的特性。传统模式中,FPGA和ARM之间的通信经常成为系统的瓶颈。在ZYNQ7000平台系列中,将FPGA和ARM集成在一个芯片内部,两者之间的通信使用AXI_HP、AXI_GP、AXI_ACP三种接口通信,带宽可达吉比特,解决了二者通信带宽不足的问题。

3.2 上下文切换时间

3.2.1 测试设计

创建两个或多个进程,某个进程在执行过程中被其他进程抢占或自动挂起而让出CPU,同时新进程开始执行,进而完成进程间的切换,通过多次循环切换来统计进程间切换时间。在本设计中以父子进程之间通过管道通信完成上下文切换为例。

在进程中创建子进程,同时创建2个管道并在管道中存放定量数据,管道A被用于子进程的读操作和父进程的写操作,管道B被用于父进程的读操作和子进程写操作。

程序运行时,子进程循环先读取管道A中数据并将其写入管道B中,当没有数据读入时被阻塞,而后跳转入父进程。父进程循环读取管道B数据并写入管道A,当没有数据读入时被阻塞再次跳转回子进程,这就完成一组父子进程切换。在最初进入子进程时和最后退出父进程时分别获取时间。在父子进程执行过程中为确保不被其他进程抢占CPU,在其执行时优先级设置为最高。将上述过程进行5000次循环获取10000次上下文切换的平均时间,测试流程如图3所示。

图3 上下文切换测试流程图

3.2.2 实验结果及分析

首先在标准Linux内核中进行测试,得到的结果如图4所示;再将标准内核打入PREEMPT RT补丁,重新配置内核,选择Fully Preemptible Kernel (RT)选项,编译内核并将其移植到ZC7045处理器平台测试,结果如图5所示,在程序执行过程中,增加CPU的负载压力,结果如图6所示:

图4 标准内核上下文切换时间测试结果

图5 补丁内核无负载切换时间

图6 补丁内核有负载切换时间

将上述实验数据进行对比分析可得:对比图4和5不难看出,Preempt RT补丁可以使内核上下文切换10000次的平均时间范围更加集中,补丁内核的切换时间平均值为15.9μs,方差为0.88,均小于标准内核16.6μs的平均时间和1.36的方差,Preempt RT补丁内核在一定程度上提高了内核的稳定性;同时对比图5和6,在系统负载增加时,上下文切换的平均值的最大值略有增加,但基本满足软实时系统的要求。

运用相关工具对切换时间进行上万次实验,结果如表1所示,补丁内核的最大值为167μs,满足航天领域期望的最大值不超过200μs的要求,而标准内核峰值达到500μs以上,甚至达到9166μs,切换时间极不稳定。

表1 切换时间/μs

3.3 优先级反转

3.3.1 测试设计

通过程序捕获优先级反转:模拟优先级反转的过程,在程序中设置标记位,分别标记高中低3个进程占用资源的情况和是否开始运行,中优先级进程运行时进行标记置1,在高优先级进程执行时,通过对标识位判定确定是否发生优先级反转,如果标记中优先级进程已经执行,则表明发生反转,反之,则表明通过优先级继承解决了反转问题。

实现方案:模拟优先级反转的过程,在程序运行过程中通过捕获优先级反转判断是否发生反转,程序流程图如图7所示:

图7 优先级反转程序流程图

3.3.2 测试及结果分析

通过5000次试验可知,在Preempt RT补丁内核上未捕捉到优先级反转,而标准内核则全部捕捉到优先级翻转,由此得出,Preempt RT补丁解决了优先级反转的问题。

4 结论

分析研究了Linux操作系统在实时性方面的问题,并通过增加PREEMPT RT抢占补丁提高其实时性能,在基于ZYNQ-7000处理器的平台上对其进行了测试。实验结果显示实时可抢占补丁对Linux的实时性具有较好的提升,达到软实时操作系统的性能要求。综上, 基于PREEMPT RT补丁内核满足载人航天应用领域中对非硬实时嵌入式操作系统的要求,大大降低了载人航天工程的成本和开发难度,同时加快了我国载人航天技术向民用方向发展的步伐。

参 考 文 献

[1] Fayyad-Kazan H, Perneel L, Timmerman M. Linux PREEMPT-RT v2.6.33 Versus v3.6.6:Better or Worse for Real-time Applications?[J]. Acm Sigbed Review, 2014, 11(1):26-31.

[2] 祁磊. 基于ARM的嵌入式系统内核移植及实时性研究[D].兰州:兰州交通大学, 2016.

[3] 苏宇, 张涛, 孙黎. 基于Xenomai的实时Linux系统的研究[J]. 计算机技术与发展, 2013(10):1-5. (Su Yu,Zhang Tao,Sun Li. Research on Real-time Linux System Based on Xenomai[J]. Computer Technology and Development, 2013(10):1-5.)

[4] 介龙梅, 徐有军, 邵国强. 嵌入式Linux内核实时性测试研究[J]. 智能计算机与应用, 2016, 6(3):105-107.(Jie Longmei,Xu Youjun,Shao Guoqiang. The Research on the Real-time Performance Test of Embedded Linux Kernel[J].Intelligent Computer and Applications, 2016, 6(3):105-107.)

[5] 刘胜, 王丽芳, 蒋泽军. 基于多核 PC 的 Linux 系统实时性改造[J]. 微电子学与计算机, 2013(8):120-123. (Liu Sheng,Wang Lifang,Jiang Zejun. Resconstruct Real-time of Linux Based on Multicore Computer[J]. Microelectronics & Computer, 2013(8):120-123.)

[6] Fayyad-Kazan H, Perneel L, Timmerman M. Linux PREEMPT-RT vs. Commercial RTOSs: How Big is The Performance Gap?[J]. Gstf Journal on Computing, 2014.

[7] 张晓龙, 郭锐锋, 陶耀东,等. Linux实时抢占补丁研究及实时性能测试[J]. 计算机工程, 2014, 40(10):304-307.(Zhang Xiaolong, Guo Ruifeng,Tao Yaodong,Liu Sheng. Research of Linux Real-time Preemption Patch and Real-time Performance Measure[J]. Computer Engineering, 2014, 40(10):304-307.)

[8] 董艳雪, 韩卫光. 基于多核ARM的Linux操作系统的实时性研究[J]. 小型微型计算机系统, 2017, 38(6):1262-1266.(Dong Yanxue,Han Weiguang. Real-time Research of Linux System Based on the Multi-core ARM Platform[J]. Journal of Chinese Computer Systems, 2017, 38(6):1262-1266.)

[9] Scordino C, Scordino C, Abeni L, et al. Deadline Scheduling in the Linux Kernel[J]. Software—practice & Experience, 2016, 46(6):821-839.

[10] Oliveira D B, Oliveira R S. Timing Analysis of the PREEMPT RT Linux Kernel[J]. Software Practice & Experience, 2016, 46(6):789-819.

[11] 黄芳. 基于ARM和RTAI的嵌入式实时平台的设计与实现[D]. 沈阳:中国科学院研究生院(沈阳计算技术研究所), 2014.

[12] 郑祥. 浅析Linux进程调度策略[J]. 科技致富向导, 2013(12):22.

猜你喜欢

实时性补丁内核
强化『高新』内核 打造农业『硅谷』
基于规则实时性的端云动态分配方法研究
基于嵌入式Linux内核的自恢复设计
健胃补丁
Linux内核mmap保护机制研究
绣朵花儿当补丁
补丁奶奶
基于虚拟局域网的智能变电站通信网络实时性仿真
航空电子AFDX与AVB传输实时性抗干扰对比
微生物内核 生态型农资