标准Linux内核里的调度程序是设计用于通用计算和服务器应用程序的。动态的优先权会保证所有的进程都能够获得对处理器的公平访问权。这个调度策略并不适合于大多数的嵌入式系统,后者通常要求某些线程以固定的优先权运行。
实时调度程序补丁加入了另一个调度程序,它会在标准的Linux调度程序之前执行。新的调度程序会对固定权限的实时线程进行调度安排。而常规的Linux调度程序则会以通常的方式处理其他所有的线程。
尽管这个补丁是迈向正确方向的一步,但是它并不会从根本上改善内核的任务切换反应时间,这是由非抢先任务代码造成的。对这个补丁的一个更好评价是:它是一个快速的、固定优先权的调度程序补丁。
在一个标准的Linux内核里,系统调用或者运行在内核里的其他代码会不停地运行,直到完成或者直到代码主动地对其他线程发起控制(例如,在等待一个外部硬件事件的时候)。在最糟糕的情况下,系统调用会需要数十或者数百毫秒来完成。
在这期间,内核不会在线程之间切换(除非它主动地对其他线程发起控制)——即使一个具有更高优先权的线程准备好执行,而且不管安装有哪种调度机制。线程切换时这种高速的反应时间(不要和中断反应时间弄混淆了,后者不受这种限制的影响)不能为很多多线程的实时应用程序所接受。
抢先任务补丁改变了这个状况:它允许线程几乎在内核里的任何地方以及任何时间被抢先运行。这是通过用已有的对称多处理(SMP)自旋块(spinlock)来指示内核里关键的非抢先任务区域而实现的。内核的所有其他区域都被认为是抢先任务的。这就极大地提高了系统响应时间,有报告说平均的任务切换响应时间会低于1毫秒。带有抢先任务的内核几乎会允许具有更高权限的任务立即运行,即使处理其正在执行内核里系统代码。
从Linux开发内核v2.5.4pre6开始,抢先任务补丁就被纳入了主要的Linux源代码树。这就改善了桌面音频和视频应用程序的软实时性能,并使得该补丁能够更容易地用于嵌入式软件的开发。
低反应时间补丁是抢先任务补丁的替代方案。抢先任务补丁要依托于已有的SMP锁定,而低响应时间补丁则着眼于改善导致反应时间过长的内核代码段的行为。这就涉及对内核里有问题部分以及驱动源代码处的重新编码。
低反应时间在本质上就是加入了指向代码段的明确的抢先任务,尤其是冗长的循环,后者导致了普通内核在抢险任务上的低性能。
上面这些软件都没有解决Linux内核中断延迟性能差的问题。就目前而言,提高中断响应时间的唯一办法是使用RTLinux或者RTAI所提供的Linux-in-an-RTOS方法,见本系列上篇。
你可能正在疑惑:打过补丁的Linux内核是否真的适合于实时的嵌入式应用程序。即使有了这些实时的补丁,嵌入式Linux也很难说是实时的(尽管它还是要比普通的内核好得多)。
因此,打过补丁的Linux内核不会适合于任务繁重的实时嵌入式应用程序,除非你走RTLinux或者RTAI这条路。但是,对于运行在高端硬件上的软实时应用程序,它是一个正式的用于嵌入式设备的平台。
本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。
|
|
|
|
|
|
|
|
|