操作系统
严丽平,宋凯,邓胡滨:基于嵌入式应用的Linux内核实时性改进研究2011,Vol.32,No.1121
0引言
个:确定性、可抢占性、上下文切换时间、中断延迟以及调度延迟。在上述的5个指标中,上下文切换时间与具体的CPU有关,而确定性又由其他的3个指标决定。所以笔者主要从可抢占性、中断延迟以及调度延迟几个角度来讨论Linux内核的实时性能。
(1)可抢占性
在Linux2.4内核中,可分为用户态以及核心态两种模式。当进程运行在用户态时,在不使用共享数据的前提下,抢占是可以发生的,但在核心态时,不允许抢占,处于就绪态的进程会被顺序执行。Linux的上述特性也决定了系统在对进程进行切换时的时间比较长和难以预测,系统很难在一个较短的时限内完成任务的切换,故此也就不能保证系统的实时性。综上所述,从根本上2.4内核是非抢占的,而2.6内核对此做了改进,它允许在核心态发生抢占,但必须满足诸多条件,在进入临界区时或者强制使用Preempt_disable使抢占失效时就不能进行抢占,因此其抢占性能仍不能满足硬实时性的要求。(2)调度延迟
调度延迟是指当一个事件引发高优先级任务就绪时,高优先级任务从就绪到运行之间的时间差,而这个时间差又由中断延迟、非可抢占的时间以及调度算法决定。在Linux2.4内
Linux操作系统以其开源免费的优势,以及稳定和支持多种处理器结构的特点受到诸多嵌入式商业产品开发者的青睐,成为嵌入式领域发展最快的操作系统。事实上,Linux在嵌入式系统应用中能够成为宠儿绝非偶然。第一,Linux自身具备一套完备的开发工具链,能够快速建立完整的嵌入式系统开发环境及交叉编译环境,并且可以跨越在嵌入式系统开发中的仿
真工具(ICE)的障碍。第二,Linux内核源代码完全开放,使得开发者可以真正了解其内部代码结构,自行设计开发真正的硬实时系统;对于软实时系统,在现有的Linux版本中可通过补丁形式实现。第三,丰富的网络功能及完备的网络协议体系,为嵌入式系统的网络开发提供了有力的保障。但对于嵌入式开发而言,Linux的实时性能仍旧是其致命的短板,在2.4时代,甚至其内核都是非可抢占的,2.6内核虽然对此做了很大的改进,但其在硬实时性方面仍不能令人满意。因此,在规模较小的嵌入式应用中,改进2.6内核的硬实时性能具有重要意义。
1制约Linux2.6内核实时性的原因分析
众所周知,衡量操作系统实时性能的主要技术指标有5
收稿日期:2010-01-08;修订日期:2010-03-15。
操作系统
1222011,Vol.32,No.1计算机工程与设计ComputerEngineeringandDesign
Hrt_taskqueue
核中,使用固定的时间片对CPU时间进行分配调度,一开始进程将被赋予较高优先级。一方面,若在某个进程的执行时间片内,该进程主动放弃CPU资源,则其系统优先级不变,甚至变的更高。另一方面,若某某一进程用完了自己的时间片,被强制切换,则其优先级自然降低。上述调度策略对于交互性较强的程序非常有利,比如文本编辑器,它需要频繁的输入及输出工作,随时需要等待键盘或者鼠标的消息。这种做法虽然对于终端用户的使用感受非常有利,但很多程序的执行还是依赖复杂的代码或者其他的任务进程以及一些不可预知的外来负载,因此该调度策略对于实时性能而言,完全不可满足。从根本上而言,上述调度算法是一个O(n)算法,即调度时间与规模有关,这与其集中计算时间片有很大关系,而Linux2.6内核中,调度算法得到了改进,其是一个O(1)算法,调度时间是确定的与任务规模无关,因为其设置了Active队列和Expired队列,这样无需集中计算时间片,也无需扫描整个队列,即可实现调度切换。但是2.6内核的调度仍然不能脱离原来的框架,实时任务和非实时任务在地位上仍没有根本的区别,很容易导致非实时任务通过关闭中断等方式阻塞实时任务等。
(3)中断延迟
中断服务是内核处理的最敏感的任务之一,内核在正常的运行过程中,内外中断随时可能到来并终止当前程序,转去处理中断服务程序。因此内核的实时性能参数之一,也就是其最大的关中断时间,这个时间越短,越能提高系统的实时性能。在关中断的处理方式上,Linux2.4内核和Linux2.6内核是基本一致的。中断具有最高的优先级,它可以抢占任何的进程。在Linux的内核进程中,关闭中断来寻求安全是很常见的做法,即使一些低优先级的非实时进程也可以关闭中断,这种做法将使关中断的最大时间很长甚至无法预料,也将对实时任务的响应将带来不确定的延迟时间,实时系统是不能容忍的。
综上所述,Linux2.6内核实时性的根本缺陷是调度策略不明确和中断延迟而造成的实时任务随时可能被阻塞。
Hrt时为硬实时任务,其进入硬实时任务的专有队列,硬实时任务具有静态的优先级,调度采用适合于应用规模较小的优先级位图调度算法。而标志为Srt的任务为软实时任务,其进入正常的任务队列,调度也采用2.6内核自身的SCHED_RR或者SCHED_FIFO算法,非实时任务具有Non标志,使用SCHED_NORMAL调度算法。
在新的调度体系中,当具有Hrt标志的任务就绪时,只有更高优先级的Hrt任务可能阻塞它,当然如果普通任务关闭了中断也可能阻塞Hrt任务(关于这个问题,将在下文中通过对中断机制的改进解决)。由此可见,Hrt任务被阻塞的可能性将大大降低,实时任务的响应速度将得到保证。另外,在调度算法上,Hrt任务采用全新引入的适合小规模嵌入式应用的高效算法——优先级位图算法,在优先级位图算法中,所有的操作
都具有O(1)特性。为了使用该算法,必须设计新的数据结构及适用于该算法的基本操作,主要的代码如下所示。
charpriorityReadyGroup;应于ReadyTable的一行。
charpriorityReadyTable[8];64以内。
charpriorityMapTable[8];优先级映射表,为固定值。
charpriorityDecisionTable[256];//优先级判定表,为固定值。/*任务进入就绪状态操作*/
priorityReadyGroup|=priorityMapTable[priority>>3];
priorityReadyTable[priority>>3]|=priorityMapTable[priority&0x07];
/*任务退出就绪状态操作*/
if((priorityReadyTable[priority>>3]&=~priorityMapTable[priority&0x07])==0)
priorityReadyGroup&=~priorityMapTable[priority>>3];/*从就绪队列中找到优先级最高的任务*/
high3Bit=priorityDecisionTable[priorityReadyGroup];low3Bit=priorityDecisionTable[priorityReadyTable[high3Bit]];
priority=(high3Bit<<3)+low3Bit;
当具有Hrt标志以外的任务就绪时,仍采用Linux2.6内核本身的调度策略,这样即可以保证硬实时任务的响应速度,又可以利用Linux本身的高效和稳定的调度策略。
//任务优先级到ReadyGroup的//优先级就绪表,假设规模在//优先级就绪组,其中一位对
Activequeue
Srt-task0
Hrt-task0
ExpiredqueueSrt-task1
图1改进后2.6内核的任务队列
2Linux2.6内核实时性改进方法
Linux内核的发展,经历了漫长的时间,其性能也在不断的改善和提高。对于标准的Linux内核其实时性问题始终无法彻底解决,当然不是设计者的水平问题,在Linux内核的开发过程中,很多当今世界最顶尖的程序员和工程师参与其中,归根到底是因为标准的Linux内核要兼顾公平性、平衡性和规模的兼容性等很多因素,因此必须在实时性方面做出牺牲。笔者从规模较小的嵌入式应用出发,假设出一个单处理器的环境,对于上述阻塞实时任务的调度策略及中断延迟进行改进。
2.1调度策略改进
在Linux2.6内核中,虽然具有两个队列Active和Expired,任
务也可以具有优先级,但由于所有任务都在一个框架下调度,实时任务的阻塞难免发生。笔者在Linux2.6内核中重新设计任务模型,将任务分为硬实时任务和普通任务。硬实时任务进入
专有的队列(如图1所示),独立调度。而普通任务包括软实时任务和非实时任务,它们仍然使用2.6内核的固有调度策略。
对于所有的任务拥有任务标志Task.flag。当任务标志为
2.2中断延迟改进
在上文中,笔者讨论了在标准Linux2.6内核中,中断对实
时性能的负面影响主要来自于任何任务都可以关闭中断,从而导致硬实时任务阻塞,因此本文中重新设计了中断模型以
操作系统
严丽平,宋凯,邓胡滨:基于嵌入式应用的Linux内核实时性改进研究
解决该问题。
在新的中断体系中,所有的中断被分成两大类:硬中断(Hard_int)和普通中断(Nor_int),相应的中断操作也被分成两大类:硬中断操作(H为标志)和普通中断操作(N为标志)。对于来自外部的中断和硬实时任务的中断请求均定义为硬中断,由此引发的中断操作对应使用硬中断操作方式,其他的中断定义为普通中断,对应于普通中断操作方式。硬中断操作方式由3个函数组成:关中断H_cli、开中断H_sli以及中断标志检测Test_H。普通的中断操作方式也由3个函数组成:关中断N_cli、开中断N_sli以及中断标志检测Test_N。主要的代码实现如下所示:
voidH_cli(void){
__asm{
MRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0}
}
voidH_sti(void){
__asm{
MRSR0,CPSRORRR0,R0,#0x80MSRCPSR_c,R0}
}
intTest_H(){
inttest;__asm{
ANDR0,R0,#0x80STRR0,test}returntest;}
voidN_cli(void){
Status=1;}voidN_sti(void){
Status=0;}intTest_N(){
returnStatus;}
通过上述代码可知,在新的体系中普通中断操作和硬中断操作的主要区别是它并没有真正的去对CPSR中的中断标志位进行清零和置位,而是使用了一个全局量Status模拟了中断的开关,在中断发生时,Status的状态并不能影响到硬中断,但可以影响普通的中断。具体的中断响应与中断操作处理过程如图2所示。
//普通操作-中断标志检测//普通操作-开中断//普通操作-关中断//硬操作-中断标志检测//硬操作-开中断//硬操作-关中断
2011,Vol.32,No.1123
即可得到实时任务的响应时间。
(2)测试结果分析
测试使用的标准内核版本是Linux2.6.26,为了便于测试,测试环境为普通PC(P42.8GHz,512MRAM)。首先打开一终端运行realfeel命令,再打开另一终端通过Ping命令模拟系统负载,对改进前后的内核分别测试,结果如表1和表2所示。
表1
响应时间/ms中断次数
0.0293501
标准Linux内核测试结果
0.11163
0.4198
0.776
1.110
4.31
从表的测试结果可知,标准Linux内核的最长系统响应时间为4.3ms,而改进后Linux内核的最长系统响应时间减小到了0.7ms,改进效果显著。
3结束语
在嵌入式应用中,对Linux内核的实时性改进意义深远。
本文通过对Linux2.6内核实时性制约因素的分析,提出了在规模较小、任务确定的嵌入式系统中改进调度策略和中断延迟的方案并加以实现。测试表明,改进后实时任务的响应速度提高显著,达到了预期目的。相信该方案对于Linux内核的进一步实时化可以起到一定的推动作用。不过,本文中实时性的改进是在规模小,任务相对确定的条件下实现的,对于适用于更大规模体系的实时性改进方案有待进一步研究。
2.3
改进效果测试
(1)测试工具与思想
笔者采用了目前应用广泛的开源基准测试程序realfeel对
改进前后的Linux内核进行实时性能测试。该程序的测试思想是对/dev/rtc进行反复读操作,该读操作会被阻塞直至一次RTC的中断完成。因此,每次RTC中断可以读出一个/dev/rtc值。设置合理的RTC中断频率,把理论值和实际测试值比较
参考文献:
[1]
刑建生,王永吉,刘军详,等.一种静态最少优先级分配算法[J].
操作系统
124
[2][3][4][5]
2011,Vol.32,No.1
软件学报,2007,18(7):1844-1854.
计算机工程与设计ComputerEngineeringandDesign
RTAI,andXenomaiinahardreal-timeapplication[J].IEEETransactionsonNuclearScience,2008,55(1):435-439.[7]
XingJS,LiuJX,WangYJ.Schedulabilitytestperformanceanaly-sisofratemonotonicalgorithmanditsextendedones[J].JournalofComputerResearchandDevelopment,2005,42(11):2025-2032.[8][9]
Hart,Darren.Real-timeLinuxinrealtime[J].IBMSystemsJournal,2008,47(2):207-220.
BruzzoneG.StandardLinuxforembeddedreal-timeroboticsandmanufacturingcontrolsystems[J].RoboticsandComputer-IntegratedManufacturing,2009,25(1):178-190.
褚文奎,张凤鸣,樊晓光.电嵌入式Linux系统实时性能测试研究[J].系统工程与子技术,2007,29(8):1385-1388.
丁聪,张玉磷.Linux2.6进程调度算法实时性能改进[J].济南大学学报,2008,22(4):362-365.
黎兵,黎忠文.Linux操作系统实时性分析[J].计算机技术与发展,2007,17(9):41-44.
WangBJ,LiMS,WangZG.Uniprocessorstaticpriorityschedu-lingwithlimitedprioritylevels[J].JournalofSoftware,2006,17(3):602-610.
[6]BarbalaceA.PerformancecomparisonofVxWorks,Linux,
(上接第120页)
对应的芯片系统上,实验中,将各结点系统向网络中PC监控终端为目标地址送包,采用极端的连续每融500ms发信息帧包方式,信息包为16字符串,发帧包结点数由1个点逐渐增加到6个结点,在PC监控终端上,接收信息包,并作统计分析如表1发现,当仅一个PC结点发包时,监控PC接收信息包与发包速率相当,当逐渐增加到6个结点时,来自各结点的收包效率降低,且以优先级低的“邮政所”Agent所管理的信息包源信息会出现延宕现象,而高优先级管理的信息包未受太大影响,就其原因,是因为实时操作系统为抢占式操作,因此在高优先级的任务里适当添加时间管理函数OSTimeDly(OS_TICKS_SEC),间隔性地放弃抢占权,让其它接口完成信息包的读取和转发,其中根据最佳信息包流的分布统计来调整各OS_TICKS_SEC值。收包率降低主要是内核管理下的任务切换占用一定的CPU时间所致,但影响不是很大,仅当间融发包频率提高后较为明显。但当所有结点所发信息包并非连续进行,而是随机间隔性发送,往往不添加OSTimeDly或让添加但让OS_TICKS_SEC为0,这时任务的选择切换会受消息队列事件请求成功与否的影响,而当请求不成功,高优先级任务将放弃抢占CPU的权利,由低优先级任务抢占CPU,完成其它接口帧信息包的收发。
芯片系统通过Internet相连,通过相应线程程序在线跟踪,所有结点的传感数据都实时显示在PC机显示屏上,发现异构网关得到了有效的运行。目前在解决异构结点的网络容错路由协议及扩网上还有待研究。
5结束语
本文充分结合实时操作系统的任务消息机制,设计模拟
“邮政”体系的多Agent网关模块及程序设计,克服传统数据交换时只局限固定结构的模式,让网关的总线管理与计算实体更规范,层次更分明,调整更容易,开发系统的应用证明,本文的设计,是采用小巧化、高可靠性、适用于任何从低端到高端系统的
4应用实例
结合理论设计结构,开发一种山区道路及边坡测控异构
传感网络系统,采用多片LPC2239芯片中心系统和大量AT89S52芯片传感系统,每一片LPC2239负责管理一片传感网络区,并与远程中心检控报警PC点相连,在LPC2239芯片系统上嵌入支持1个USB接口,1个RJ45接口、2个UART串行接口、1个CAN接口、1个R485接口、1个无线RF2401[5,8]接口的网关模块程序,同时又在多个AT89S52上内嵌上支持1个UART、或1个UART和1个RF2401同时支持接口网关模块,在PC机上开发支持RJ45接口的应用程序,将PC机与LPC2239