嵌入式Linux实时性能优化文献综述Word格式.docx
- 文档编号:22406094
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:12
- 大小:35.18KB
嵌入式Linux实时性能优化文献综述Word格式.docx
《嵌入式Linux实时性能优化文献综述Word格式.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux实时性能优化文献综述Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
目前,国内主要有两种提高Linux实时性的技术方案:
一个是双内核思想,即让标准Linux内核与实时内核共存在系统中。
在标准Linux内核之上增加一个实时内核,让实时任务在实时内核中运行,实时内核把标准Linux内核作为运行在它上面的优先级最低的一个任务;
另一个是直接修改内核,比如对实时调度算法的改善、对中断机制的改善、对内核同步机制的改善以及对Linux的时钟粒度的细化等[7]。
国外研究现状
目前,国外不少大学、研究机构和知名公司加入了实时Linux的开发工作,较成熟的产品不断涌现,主要分为如下两种实时化方案。
双内核实时化方案
1.RT-Linux
RT-Linux是由美国新墨西哥州大学研制出来的实时操作系统。
它是通过在标准Linux内核之上增加一个实时内核的方法来获得系统的实时性,标准Linux内核作为它在空闲时的一个优先级最低的任务来运行。
为了使得系统的实时性要求得到满足,他们进行了以下改进[8]:
(1)对标准Linux内核进行改进,禁止其任意关中断
(2)对时钟中断机制进行了改动
(3)增加了实时任务调度算法
(4)增加了进程之间的通信机制
2.RTAI
RTAI是指实时应用接口。
由于RT-Linux在不同的Linux版本之间不易于移植,所以为了解决这个问题,RTAI被开发出来。
RTAI修改Linux/arch/i386中与体系结构相关的代码,建立了一个实时硬件抽象层,RTHAL隔离了Linux与中断控制器,接管了所有的硬件中断,建立了软件模拟中断机制[3]。
经过这些改动以后,在实时任务需要运行的任何时刻,RTAI都可以中断Linux的运行,以此保证实时任务的优先运行[9]。
尽管引入了RTAI,但是Linux的功能并没有因此受到影响。
Linux作为优先级最低的一个任务,只有在没有实时任务运行时,才允许被执行。
正是由于RTHAL所提供的接口,实时内核和Linux内核才能进行高效地交互。
单内核实时化方案
1.Red-Linux
Red-Linux是美国加州大学Irvine分校研制出来的实时操作系统。
在Linux内核中很好地融合了对实时调度支持的技术。
它同时支持三种类型的进程调度算法:
基于时间驱动的进程调度算法(Time-drivenScheduling)、基于优先级的进程调度算法(Priority-drivenScheduling)、基于共享CPU的进程调度算(Share-drivenScheduling)[11]。
Red-Linux解决了Linux进程在核心态不能被抢占的问题。
通过把抢占点插入在内核服务函数中,使得处在核心态的进程也可以被抢占,从而系统的实时性得到了增强。
除此以外,Red-Linux还提高了时钟中断频率。
2.Kurt-Linux
Kurt-Linux是美国堪萨斯大学研制出来的实时操作系统,它可以达到微秒级的时钟精度。
Kurt-Linux把系统分为正常态、实时态以及混合态三种状态。
在正常态时,系统只运行非实时任务;
在实时态时,系统只运行实时任务;
在混合态时,系统不仅运行实时任务,而且还运行非实时任务[5]。
提高系统的时钟精度可以让Linux的实时性得到增强,但若简单地提高系统的时钟中断频率,反而会加大系统的负载,降低系统的性能。
为了使得上述问题得到妥善地解决,Kurt-Linux将时钟设置成单次触发模式(one-shot-mode),即按照具体的情况,给时钟芯片设置一个超时时间。
在某个超时事件发生后,再按照具体的情况,重新设置一个超时时间[12]。
Linux自身的系统调用可以被使用是Kurt-Linux在应用时的一大优势。
3.Linux/RK
Linux/RK是美国卡内基梅隆大学的实时与多媒体系统实验室研制出来的实时操作系统。
它将资源内核(ResourceKernel)的思想体现在Linux中,他们最初将资源内核的思想在RT-MACH中体现出来,然后又用资源内核的思想改造了Linux。
起先预留资源的思想在网络领域有所体现,后来这种思想延伸到操作系统领域,使得资源内核的思想得以形成。
运行在操作系统之上的应用程序要想获得预留资源的使用权,首先要向操作系统提出申请,在获得许可后,预留资源才会被分配给应用程序[13]。
Linux/RK由普通的Linux内核和可移植的资源内核两部分组成。
这两个部分沟通的桥梁是回调钩子函数(Callbackhooks)。
4.Hard-hadLinux
为了更好地面向嵌入式的应用,MontaVista公司开发了Hard-hadLinux,这种新的操作系统的最大特点是它的内核是可以被抢占的,解决了原先的Linux内核不能被抢占的问题。
Hard-hadLinux的设计思想是使得调度程序可以获得更多的执行机会,从而使得从激励事件发生到调度程序被执行的时间得以缩小[15]。
在这个可抢占内核的补丁包中,中断返回处理代码和自旋锁(spinlock)的宏定义已经被修改了。
当处于就绪态的进程能够安全地抢占处于运行态的进程时,系统就会进行进程调度[4]。
发展现状及前沿问题
现有的工Linux是一个通用的操作系统,它提供了一些实时处理的支持,这包括支持大部分FOSIX标准中的实时功能,支持多任务、多线程,具有丰富的通信机制等,同时也提供了符合FOSIX标准的调度策略,包括FIFO调度策略、时间片轮转调度策略和静态优先级抢占式调度策略,其默认的调度策略是第三种。
Linux还提供了内存锁定功能,以避免在实时处理中存储页被换出[14]。
但是Linux的内核调度策略基本上是沿用UNIX系统的,Linux在用户态支持可抢占调度策略,而在核心态却不支持抢占式调度策略。
这样,运行在Linux核心态的任务(或系统调用)是不能被其他优先级更高的任务所抢占的,如此一来就会引起优先级逆转问题。
另外,Linux操作系统的中断处理句柄是不可调度的,不能依优先级高低调度[16]。
而在实时系统中,却希望中断处理句柄同实时任务一样,可以有优先级被系统的调度程序所调度。
此外,我们还关心与任务响应时间相关的时钟精度,以及由于资源共享而带来的优先级逆转问题。
时间系统是计算机系统中最为重要的组成部分,其主要作用是提供系统时间,任何一个实时操作系统必须有一个精确的、细粒度的定时器。
而Linux为了提高系统的平均吞吐量,将硬件时钟中断的默认周期设置为10ms,这样的定时机制根本不能满足实时系统的需要。
软件时钟都是靠硬件来触发的,而简单同步机制(互斥)不支持优先级继承又很可能导致优先级逆转。
因此,利用Linux作为底层操作系统,必须进行实时化改造,从而构建出一个具有实时处理能力的嵌入式系统,适应嵌入式领域应用的需要。
采用双内核结构,这类方案的特点是采用混合内核方案,即在Linux内核和硬件之间增加一个小的实时核,由它管理中断、驱动以及与嵌入设备交互的实时任务;
Linux内核本身成为其低优先级任务。
该方式使得Linux内核成为可以完全被抢占的,实时任务作为高优先级任务。
在实时任务睡眠时,才运行Linux任务,进而由其调度一般的进程。
典型的例子是FSM公司的RT-Linux。
实时任务构成Linux的内核模块形式,需要时将实时任务的内核模块插入到Linux内核中即可。
实时任务和Linux一般进程之间的通信通过共享内存或者FIFO通道实现。
因此,实时操作其实并不是Linux进程,而是Linux的一个可加载式核心模块,并且将时间精确度要求高的操作写成驱动程序形式。
RT-Linux实际是一个实时驱动程序构架,Linux作为低优先级的任务,为系统提供网络通信、GUI、数据存储等功能[17]。
该方案的优点是Linux内核可被抢占,实现了硬实时;
通过改变时钟中断机制而达到了细粒度的定时,对内核的改动较小。
由于Linux系统的支撑,实时核心并不需要“真”地去实现,而且熟悉Linux系统的开发人员也可以很快地熟悉这种方法开发出的实时系统,人们也会自然地想到用Linux系统作嵌入式系统的开发平台。
此外,如果这种实时系统的API是Linux系统API子集的话,我们还可以只在Linux主机上仿真,进行应用程序的开发和调试,从而免去了远程调试之苦[18]。
这种方案的局限性是由于设计了一个完全独立的实时核心而没有使用原有的Linux核心,导致Linux系统原有的一些优势难以继承,尤其是与Linux核心相关的一些优势无法获得,如Linux核心对大量硬件的广泛支持,Linux核心超群的可靠性、稳定性等。
另外,由于这种方法并没有通过修改Linux核心代码来开发实时核心,而是在Linux系统之上重新设计了一个实时核心[19],这样的开发并不要求源代码开放。
因此,Linux一些基于开放源代码的优势也势必受损。
最后一点,任何基于Linux核心的开发成果也无法方便地应用到实时核心中。
直接修改Linux内核,这类方案的共同点是针对以上提到的Linux实时性能的缺陷,直接修改内核,增强其实时性能。
主要途径是提供适应于实时系统的调度策略,提供细粒度的定时器,增加内核抢占点等[20]。
典型的例子是MontaVista公司的HardHatLinux(最新的版本已改名为MontaVistaLinux)。
在嵌入式方面,它采用标准Linux内核,针对嵌入式设备定制专用的嵌入式操作系统,即根据应用需求以及嵌入式设备的处理器、存储器资源有限的情况,对内核进行裁减、配置,使系统稳定,性能突出。
在实时性能方面,它提供了一个基于优先级的实时调度器。
对于无实时需求的进程,仍按Linux原有进程调度策略进行调度[21],而对于实时进程,则按照优先级驱动的原则进行调度,还实现了一定的抢占式内核。
MontaVistaLinux可抢占内核对Linux的修改包括:
(1)修改了SMP内核的自旋锁Spinlock的定义、实现,将它从针对SMP的特定实现改为可抢占锁Preemptionlock。
在抢占部分,就像它在SMP中的实现一样,锁的功能都是控制内核代码关键部分的可重入。
(2)修改了中断处理软件,允许从中断返回时,若有高优先级的进程可执行,则重新调度,即使中断处理进程运行于内核态(提供进程不在关键的锁定区域)。
(3)对SMPSpinunlock也作了重新定义,返回系统到可抢占状态,检查是否需要立即进行上下文转换。
(4)内核为单处理器的目标系统构造,修改成也包括Spinlock的结构,实现为Preemptionlock[22]。
通过上述四个基本的改变,内核就成为了基本可抢占的。
可抢占内核选项(CONFIGPREEMPT)减小了内核对实时或交互事件的响应时间,它允许低优先级的任务即使在内核态运行一个系统调用时也可以被抢占,该特性使系统可以更加可靠地满足应用的实时响应要求。
这种方案的优点是能够充分利用Linux本身所提供的各种功能与服务,系统结构清晰,能够支持众多的硬件平台,可以很好地将嵌入式与实时性相结合,缺点是实时性能不及双内核高[23]。
尽管Linux本身提供了一些支持实时性的机制,然而,由于Linux系统是以高的吞吐量和公平性为追求目标,基本上没有考虑实时应用所要满足的时间约束,它只是提供了一些相对简单的任务调度策略。
因此,实时性问题是将Linux应用于嵌入式系统开发的一大障碍,无法在硬实时系统中得到应用。
Linux在实时应用中的技术障碍具体表现在:
(1)Linux系统时钟精度太过粗糙,时钟中断周期为10ms,使得其时间粒度过大,加大了任务响应延迟[24]。
(2)Linux的内核是不可抢占的,当一个任务通过系统调用进入内核态运行时,一个具有更高优先级的进程,只有等待处于核心态的系统调用返回后方能执行,这将导致优先级逆转。
实时任务执行时间的不确定性,显然不能满足硬实时应用的要求。
(3)Linux采用对临界区操作时屏蔽中断的方式,在中断处理中是不允许进行任务调度的,从而抑制了系统及时响应外部操作的能力。
(4)缺乏有效的实时任务调度机制和调度算法。
针对这些问题,利用Linux作为底层操作系统,必须增强其内核的实时性能,从而构建出一个具有实时处理能力的嵌入式系统,适应嵌入式领域应用的需要。
针对Linux在实时应用中的技术障碍,将Linux改造成为支持实时任务的嵌入式操作系统,主要从下面三个方面进行着手。
细化时钟粒度
精确的计时是实时调度器正确操作所必须的,调度器通常要求在一个特定的时刻进行任务切换,计时的错误将导致背离计划的调度,引起任务释放抖动。
标准Linux系统时钟精度太过粗糙,时钟中断周期为10ms,不能满足特定嵌入式应用领域中对于响应时间精度的要求。
因此,在实时Linux应用中,需要细化其时钟粒度,具体有两种方式可以解决时钟粒度问题:
一是通过直接修改内核定时参数HZ的初值来细化时钟粒度,如将标准Linux中内核定时参数HZ改为10000,则时钟粒度可以达到100us,这种方式虽然会增加一些系统开销,但在强周期性环境下,对定时器的设置只需初始化一次,在一定程度上保证了处理效率;
二是通过对可编程中断定时器8254或先进的可编程中断控制器进行编程来改进Linux时钟机制,以提高其时钟的分辨率,使毫秒级的粗粒度定时器变成微秒级的细粒度定时器[25]。
增强Linux内核的抢占性
标准Linux内核是不可抢占的,导致较大的延迟,增强内核的可抢占性能,可提高系统内核对实时任务的响应能力。
目前,有两种方法修改Linux内核以提高实时任务抢占非实时任务的能力:
一是在内核中增加抢占点的方法;
二是直接将Linux内核改造成可抢占式内核。
插入抢占点方法是在Linux内核中插入一些抢占点,当一个系统调用执行到抢占点时,如果有更高优先级的实时进程正在等待运行,那么正在执行系统调用的内核进程将会把CPU的控制权转交给等待运行的实时进程;
如果没有更高优先级的实时进程等待,则当前进程将继续执行,此时系统增加的开销仅仅是检测一下调度标志。
将Linux内核改造成可抢占式内核方法的基本思想是产生运行调度器的机会,缩短任务发生到调度函数运行的时间间隔。
这种方法修改了Linux源代码中的自旋锁宏以避免竞争,并在其中引入一个称作抢占锁计数器(PLC)的新的计数信号允许内核代码抢占,当它为0时,允许抢占;
当其为大于0的任何值时,禁止抢占[26]。
目前,针对这两种修改Linux内核的方法,已经有两种比较成熟的Linux内核补丁被研制出来:
抢占式补丁和低时延补丁。
其中,抢占式补丁是MontaVista开发的,它修改了内核代码中的spinlock宏和中断返回代码,使得当前进程可被安全抢占,当自旋锁释放或者中断线程完成时,调度器就有机会执行调度;
低时延补丁是由IngoMalnor提出,该方法只是在执行时间长的代码块上抢占,不采用强制式抢占,因此,如何找到延时长的代码块是解决问题的关键。
改善Linux内核实时调度器的调度策略
将进入系统的所有任务按实时性分成三类:
硬实时、软实时、非实时任务。
硬实时要求系统确保任务执行最坏情况下的执行时间,即必须满足实时事件的响应时间的截止期限,否则,将引发致命的错误;
软实时是指统计意义上的实时,一般整体吞吐量大或整体响应速度快,但不能保证特定任务在指定时期内完成。
针对不同的实时性任务,分别采用不同的调度方法进行处理。
为了严格保证硬实时任务的时限要求,改善的Linux内核实时调度器采用了优先级调度算法,目前最小松弛时间优先调度算法MLF(Minimum-Laxity-FirstSchedulingAlgorithm)是动态优先级调度最常见的实时调度策略。
它在系统中为每一个任务设定松弛时间(任务的松弛时间等于任务的截止期减去任务执行时间、当前时间)即:
laxity=deadline―current_time―CPU_time_needed,系统优先执行具有最小松弛时间的任务。
根据就绪队列的各任务的松弛时间来分配优先级,松弛时间最小的任务具有最高的优先级。
为了提高Linux的实时性,我们设计了MLF调度器,并把它作为可加载模块加入Linux内核中,在实现中需对内核进行相应的修改[27]。
为了区分任务的类型,对基本Linux的task_struct属性进行改进,在其中增加SCHED_MLF调度策略,并按task_struct中的policy的取值来进行区分,分别用SCHED_MLF,SCHED_RR,SCHED_OTHER来标识硬实时、软实时、非实时任务。
将处于运行状态的三类任务放入两个队列,硬实时任务放入hard_real_queue队列,采用MLF调度算法,软实时和非实时任务放入non_real_queue队列(空闲任务也在其中),沿用原内核的RR调度算法。
这两个队列可以用一个run_queue的指针数组来指向,如图1所示。
双队列任务运行过程与原内核的单运行队列执行流程的主要区别在:
首先,各硬实时任务采用了MLF调度算法代替原内核的FIFO调度,提高了Linux系统的实时性能。
其次,在判断是否有软中断需要处理之前需判断硬实时任务队列是否为空,如果不为空,即使存在中断的后半部分需要处理,也要先调度硬实时任务投入运行,在硬实时队列为空的条件下才去处理中断的后半部分(因为中断的后半部分没有硬实时任务紧急)[28]。
最后,如果没有硬实时任务存在,则说明只有run_queue队列中有软实时或非实时任务存在,这时的处理方法和原内核对单运行队列的处理方法相同。
这样改进后,可以明显提高硬实时任务的调度效率,而在没有硬实时任务时,系统性能没有变化。
总结
国外对于嵌入式Linux的实时化起步较早并且取得了相当的成果,而国内在这方面的研究才刚刚起步。
嵌入式技术具有广阔的应用前景,渗透于社会生活的诸多领域,把Linux应用于嵌入式系统,把Linux自身固有的优越性融入嵌入式技术,是嵌入式技术发展的一个重要方向。
然而,由于Linux在实时应用领域的技术障碍,要将其应用在嵌入式领域还必须修改Linux内核中的各个模块以达到满足嵌入式实时应用的需求。
本文详细总结了嵌入式Linux实时性的当前国内外研究现状,探讨了其本身提供的一些支持实时性的机制以及在实时应用中的技术障碍。
随着微电子技术的迅速发展,原型技术和设计方法的不断成熟,嵌入式Linux系统将得到越来越广泛的应用。
预计在未来的几年里,嵌入式Linux实时化仍然是实时系统和Linux研究中的热点。
参考文献
[1]LinKweiJay.WangYu-Chung.TheDesignandImplementationofReal-timeSchedulersinRED-LINUX.ProceedingsoftheIEEE,2003,91(7):
1114~1129
[2]ShaL.,RajkumarR.,LehoczkyJ..Priorityinheritanceprotocols:
Anapproachtoreal-timesynchronization.IEEETransactionsonComputers,1990,39,9:
1175~1185
[3]MosesJ.Selectthesmallestmodularrealtimeoperatingsystemforembedded
Applications[J].RealTimeMagazine,2001,
(2):
66-68
[4]FerdyHanssen,SchedulingandResourceallocationwithRealTimeLinux.JournalofUniversityofTwente,1998,(7),33-34
[5]L.Dozio,P.Mantegazza.LinuxRealtimeApplicationInterface(RTAI)inlowcosthighperformancemotioncontrol.In:
MotionControl2003.aconferenceofANIPLA,
AssociazioneNazionaleItalianaperlAutomazione(NationalItalianAssociationfor
Automation),Milano,Italy,March2003,27~28
[6]赵慧斌,李小群,孙玉芳.改善Linux核心可抢占性方法的研究与实现.计算机学报,2004,27
(2):
244-251
[7]蒋溢,李琳皓,陈龙.Linux系统实时性探讨.重庆大学学报,2005,28(3):
61-64
[8]董晓峰,顾新.关于Linux内核可抢占性的研究.计算机工程,2005,31
(1):
82-84
[9]陈敏,周兴社.基于嵌入式Linux的实时优化方案.计算机应用研究,2005,22(3):
235-237
[10]齐俊生,崔杜武,黑新洪.嵌入式Linux硬实时性的研究与实现.计算机应用,2003,23(6):
34-36
[11]李凡,卢杜阶,邱鹏.在嵌入式应用中增强Linux实时性的方法研究.华中科技大学学报,2005,33
(2):
83-85
[12]钟汉如,王创生.嵌入式Linux中调度算法的实现及优化[J].计算机工程与科学,2002,24(3):
5-7.
[13]黄廷辉,农毅.嵌入式Linux的实时性能[J].桂林电
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 Linux 实时 性能 优化 文献 综述