1. 首先说一下实时的定义及要求:
参见Donal Gillies在Realtime Computing FAQ中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。
一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用足够强大的CPU,Windows在CPU空闲时可以提供非常短的典型中断响应。但是,当某些后台任务正在运行时,有时候响应会变得非常漫长,以至于某一个简单的读取文件的任务会长时间无响应,甚至直接挂死。这是一个基本的问题:并不是Windows不够快或效率不够高,而是因为它不能提供确定性,所以,Windows不是一个实时操作系统。
根据实际应用,可以选择采用硬实时操作系统或软实时操作系统。
硬实时 -代表产品 VxWorks
举一个经常使用的实例,中高档汽车中使用的气囊。当报告车辆碰撞的传感器中断CPU后,操作系统应快速地分配展开气囊的任务,并且不允许任何其他非实时处理进行干扰,晚一秒钟展开气囊比没有气囊的情况更糟糕,这就是一个典型的必须使用硬实时的系统。
硬实时系统指系统要有确保的最坏情况下的服务时间,即对于事件的响应时间的截止期限是无论如何都必须得到满足。
软实时 -代表产品软实时Linux
再举一个实例,IPTV数字电视机顶盒,需要实时的处理(解码)视频流,如果丢失了一个或几个视频帧,显然会造成视频的品质更差,但是只要做过简单的抖动处理的系统,丢失几个视频帧就不会对整个系统造成不可挽救的影响。
软实时系统就是那些从统计的角度来说,一个任务能够得到有确保的处理时间,到达系统的事件也能够在截止期限到来之前得到处理,但违反截止期限并不会带来致命的错误。
2. 如何衡量一个实时操作系统的实时性能?
主要有以下两个重要指标:
指标1、中断响应时间(可屏蔽中断)
计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。对于抢先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。抢先式内核的中断响应时间由下式给出:
中断响应时间=关中断的最长时间+保护CPU内部寄存器的时间+进入中断服务函数的执行时间+开始执行中断服务例程(ISR)的第一条指令时间
请注意:中断响应时间是系统在最坏情况下响应中断的时间,某系统100次中有99次在50ms之内响应中断,只有一次响应中断的时间是250ms,只能认为中断响应时间是250ms。
指标2、任务切换时间
除为中断处理提供确定性外,实时处理也需要支持周期性间隔的任务调度。大量控制系统要求周期性采样与处理。某个特定任务必须按照固定的周期(p)执行,从而确保系统的稳定性。考虑一下汽车的防抱死系统(ABS)。控制系统对车辆的每个车轮的转速进行采样(每秒最多20次)并控制每个制动器的压力(防止它锁死)。为了保持控制系统的正常工作,传感器的采样与控制必须按照一定的周期间隔。这意味着必须抢占其他处理,以便ABS任务能按照期望的周期执行。
当多任务内核决定运行另外的任务时,它把正在运行任务的当前状态(即CPU寄存器中的全部内容)保存到任务自己的栈区之中。然后把下一个将要运行的任务的当前状态从该任务的栈中重新装入CPU 的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。CPU 的寄存器越多,额外负荷就越重。
系统实时性能重要指标的典型值
--------------------------------------------------------------
VxWorks uC/OS-II RT-Linux2.0 QNX6
硬件平台 MC68000 33MHz-486 60MHz-486 33MHz-486
任务切换 3.8us <9us 不详 12.57us
中断响应 <3us <7.5us 25us 7.54us
--------------------------------------------------------------
参考文献:《4种实时操作系统实时性的分析对比》。
实时操作系统的核心是任务调度,下面我们来分析一下典型的硬实时代表产品VxWorks和软实时代表产品Linux的任务调度机制。
3. VxWorks的任务调度
既然实时性对于实时操作系统如此重要,同学们,我们下面就来学习一下实现实时性的核心模块——任务调度。
构成应用软件系统的程序集合中,独立的、相互作用的程序单元,在其执行时称之为任务,从系统的角度来看,任务是竞争系统资源的最小运行单元。单个CPU中,多任务机制制造了一个多个任务同时执行的假象。其实系统只是根据一个多任务调度算法,将内核插入到这些任务中执行。实时系统VxWorks的一个任务可有多种状态,但最基本的状态有以下四种:
(1)就绪态(Ready):任务只等待系统分配CUP资源。
(2)挂起态(Pend):任务需等待某些不可利用的资源而被阻塞。
(3)休眠态(Sleep):如果系统不需要某一个任务工作,则这个任务处于休眠状态。
(4)延迟态(Delay):任务被延迟时所处的状态。
大家可以在网上搜一下VxWorks任务调度的相关文章,一般都会配状态机图。
--------------------------------------------------------------
请注意:任务(task)、进程(process)、线程(thread)等概念相互联系又相互区别,因为不是本文的重点,这里不多解释,如果想详细了解推荐看一看“Windows Kernel Programming”。在VxWorks中,因为每个任务没有自己独立的虚拟内存空间,可以把任务理解为线程。
--------------------------------------------------------------
任务由系统内核调度运行一段固定长度的时间,称为时间片(time slice,quantum)。调度是指为任务分配资源和时间,使系统满足特定的性能要求。调度算法的目的是在正常情况下,尽可能满足所有任务的时限:在峰值负载条件下,保证强实时任务满足时限。因为时限是区分实时系统和非实时系统的关键因素,因此调度算法是实时系统的基本问题。实时操作系统所具有的运行性能,如吞吐量的大小、周转时间的长短、相应的及时性和可预测性等在很大程度上都取决于实时调度。
任务调度可采用下述两种方式:
(1)非抢占方式。采用这种调度方式,一旦把处理器分配给某任务后,便让该任务一直执行,直到该任务完成或发生某事件而被阻塞,才再把处理器分配给其他任务,决不允许某任务抢占已经分配出去的处理器。显然它难于满足紧急任务的要求,实时系统中不宜采用这种调度方式。
(2)抢占方式。允许调度程序根据某种原则,去停止某个正在执行的任务,将已分配给该任务的处理器,重新分配给另一任务。抢占的原则有:
- 时间片原则。各任务按时间片运行,当一个时间片用完后,便停止该任务的执行而重新进行调度。
- 优先权原则。当一个任务到来时,如果其优先级比正在执行的任务的优先级高,便停止正在执行的任务,将处理器分配给优先级高的任务,使之执行。实时系统中一般采用基于优先级的抢占式调度和轮转调度的任务调度和中程调度相结合的调度策略。因此既可具有较大的灵活性,又能获得极小的调度延迟。
VxWorks的wind内核缺省调度机制为基于优先级的抢占式调度。采用这种机制时,系统把处理器分配给优先级最高的任务,使之执行。一旦出现了另一个优先级更高的任务时,任务调度程序剥夺当前任务的执行,将处理器分配给高优先级任务。而在相同优先级的多个任务之间,采用时间片轮转调度机制。采用这种机制时,当一个任务到达时,它被排在轮转队列的后面,等待分配给自己的时间片的到来,如果在时间片内没有结束,则再等待属于自己的时间片的到来,直到任务完成。
- 优先级抢占式
采用基于优先级的抢占式调度,系统中每个任务都有一个介于最高0到最低255之间的优先级。任一时刻,系统内核一旦发现一个优先级更高的任务转变为就绪态,内核就保存当前任务的上下文并把当前任务状态转换为阻塞态,同时切换到这个高优先级任务的上下文执行。
- 轮转调度算法
采用轮转调度算法,系统让处于就绪态的优先级相同的一组任务依次轮流执行预先确定长度的时间片。这是一种处理器平均分配的方法。如果不使用轮转调度算法,优先级相同的一组任务中第一个获得处理器的任务将不会被阻塞而独占处理器,如果没有阻塞或其他情况发生,它不会放弃处理器的使用权。
- 抢占调度与轮转调度混合方式
有时,基于优先级的抢占式调度可与轮转调度相结合。当优先级相同的一组任务依次轮流平均分配处理器时,若有高优先级的任务转变为就绪态则可抢占该组任务。直到再一次符合执行条件时,该组任务才可再次共享处理器。
为了任务控制的灵活性,VxWorks内核还提供了动态优先级机制,任务的优先级在运行期间可动态地变化。同时,为了防止优先级反转,还具有优先级继承机制,通过使用互斥信号量可以防止高优先级的任务被迫等待一段不确定时间,直到一个低优先级任务完成。
参考文献:《实时操作系统VxWorks的内核任务调度研究》。
转载:http://blog.csdn.net/phunxm/article/details/9013535