Linux实时化技术及评价
2.6版本Linux内核实时性能有一定增强,双内核方式的Linux实时化技术也在不断发展中。原来由FSMLab维护的RTLinux,其版权在2007年2月被Wind River购买,RTAI支持x386等体系结构,但由于其代码较难维护、bug较难调试等原因,许多开发者加入了Xenomai项目。Xenomai支持最新2.6版 Linux,相比之下代码相对稳定和可维护,开发模式较活跃。
内核补丁方式的Linux实时化技术在2.6版内核基础上做了大量改进,使得内核中除了中断关闭和IRQ线程分派、调度和上下文切换之外的绝大部分代码都可以被抢占,不可抢占的自旋锁保护临界区从一千多个减少到几十个,使得内核实时性得到极大的提高,获得社区广泛支持并逐渐成为Linux实时化主流技术。
Linux内核实时化改进
实时抢占内核补丁针对Linux各种延迟进行了实时化改进,主要包括了几个方面的技术。
● 实时抢占内核
为了实现内核完全可抢占,实时内核临界区用高性能优先级继承mutex替换原来自旋锁(spin-lock)来进行保护,使得在临界区内的执行也可被抢占。只有当线程想访问一个其他线程正在访问的临界区时,才被调度至睡眠,直到所保护的临界区被释放时被唤醒。
在实时抢占内核中通过优先级继承机制(PI)在线程被一个低优先级线程所持有的资源阻塞时,低优先级线程通过继承被阻塞线程优先级,尽快执行并释放所持资源而不被其他线程所抢占。
● 新型锁机制带来内核性能提升
实时抢占补丁替换了大内核锁(BKL),将BKL从spin lock改成是mutex,持有BKL的线程也可以被抢占,减少了内核调度延迟。此外,实时抢占补丁通过mutex替代semaphore,避免了不必要的时间负载。实时抢占补丁实现了可抢占的RCU(Read- Copy Update)锁和串行化读写锁,保证了执行可预测性,提高了性能。
● 中断线程化
实时抢占补丁通过内核线程来实现一些硬件中断和软件中断的服务程序。体系结构相关处理代码设置IRQ状态、检查线程化的中断是否使能,并唤醒相关线程。在中断线程被调度执行后,进行中断服务处理。在实时抢占内核中,用户线程优先级可以高于设备中断服务线程。实时任务无需等待设备驱动处理程序执行,减小了实时抢占延迟。
● 时钟系统改进
实时抢占内核的时钟系统重新进行了设计,实现了高精度定时器。时钟精度不再依赖jiffies,使POSIX定时器和nanosleep精度由具体硬件所能提供的精度决定,使得gettimeofday能够提供实时系统所需的精确时间值。
● 其他改进
Linux在用户层支持性能良好的futex,实现原理类似于内核优先级继承mutex,仅在产生竞态时进入内核,提高了应用程序性能。此外,实时抢占补丁内核还提供mutex死锁检测、延迟跟踪与测量、中断关闭跟踪与延迟测量、抢占延迟测量等内核调试与诊断、内核性能测量与调优等工具、实时Trace支持( Ftrace)等支持。
现阶段实时化技术在各体系结构上逐渐得到了支持,如表1所示。
实时抢占内核延迟
现阶段,实时抢占补丁技术仍处于完善过程中,其表现在以下几点不足。
● 中断延迟
即使不发生中断线程抢占,实时抢占内核相对原来中断服务机制额外增加一对上下文切换时间,用于唤醒中断服务线程执行和进入睡眠状态。此外,内核中还存在少量用raw_spinlock锁禁用中断来保护的临界区,需要计算这些锁造成的中断延迟。
● 任务抢占延迟
内核抢占延迟主要是由于在内核中使用各种锁机制用于控制任务和中断对临界区的访问所造成的,特别是实时抢占内核中为了避免优先级逆转增加的锁机制带来了额外时间负载。
● 内核模块其他延迟
在实时抢占补丁中,内存管理模块还需减少页表错误引起的延迟,降低mlockall内存锁存造成的性能降级影响。实时抢占内核中高精度定时器的使用导致了额外定时器管理时间负载。此外,内核中一些驱动程序需要针对实时应用进行优化来提高实时响应。软浮点处理和软浮点内核仿真需要和实时抢占补丁兼容,能耗管理子系统还需要具备实时系统感知能力。
实时抢占内核性能测试
本文在Intel Pentium M 1.7GHz处理器上进行了测试。测试环境包括:Linux内核2.6.25.8最小配置;patch-2.6.25.8-rt7实时补丁;libc 2.5+和busybox-1.10.0构建initrdfs方式的根文件系统。
● 中断延迟
采用实时抢占补丁支持的内核中断延迟测量工具测量中断关闭(IRQ OFF)时间。在100%负载情况下,十万采样点中,最大值在31ms左右,绝大多数在1ms左右。
● 任务抢占延迟
内核抢占关闭时间采用实时抢占补丁所支持的内核抢占关闭测量工具测量。实时抢占内核和普通Linux内核情况比较如表2所示。
实时应用中周期性任务需要能在确定的时间内得到执行。实时抢占内核和普通内核下的周期性任务延迟对比中可以看出实时抢占内核提供了实时任务的精确执行,如图2所示。