大海战法国防空:实时系统与实时操作系统

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 03:30:38
      首先,“实时操作系统”可以说是一个“盗用”了“实时”这个概念的名词,其真正原型是“实时系统”。我注意到上面很多人把实时系统当作实时操作系统,这是一个很大的错误,真正的实时系统是指的一个由硬件、软件所搭配起来的完整系统,软件既包括操作系统,又包括应用,也就是那些有实时特性的应用。

       对于一个有“任务”概念的实时系统而言,系统的任务调度策略就是“实时调度”。请注意,真正的实时调度是指关心任务的“时间特性”并去保证时间特性的调度。

      实时调度通常按照实时任务调度的时间严格性划分为硬实时(hard real-time)和软实时(soft real-time)两大类。所谓“实时任务”,是指拥有明确的完成时间期限(deadline)的任务;所谓“时间严格性”,是指对于实时任务deadline监督的严格程度,如果超过deadline就必定导致任务的失败就是硬实时,而允许一定程度的越过dealine则通常称为软实时,因此,两者的关键区别也就是“guaranteed”和“best-effort”的区别。不同的硬实时系统中任务失败的严重性是不一样的,有的可能导致整个系统运作的失败(比如机车自动控制系统),有的则可以通过错误恢复机制来作某些弥补,还有的就简单的忽略掉这个任务(如媒体处理系统丢帧),因此,“硬实时系统”并不严格是一个“可靠性系统”(当然,实时系统本身的可靠性是相当高的)。

       我们再看看动态(Dynamic)调度与静态(Static)调度,两者关键区别在于任务的调度决定是否可以在运行期间动态的决定。静态调度通常是在系统配置过程中就决定了所有任务的执行时间,而动态调度则在系统运行过程中可以根据实际情况灵活决定任务的执行时间。在这里,需要说明的是,最佳化的硬实时系统通常都是静态调度的,也就是说,避免不可预知的任务(运行中也不会允许插入新任务),比如医院的病员供氧系统,静态调度可以说就是安排一张日程表,算法可以复杂,也可以手工排列完成。但是,诸如导弹预警这样的系统就无法做到这一点,所以不得不使用动态调度。

      实时系统内容很广泛,我只介绍一下实时调度策略(也就是“动态调度”)。实时系统中,一个任务通常用(相位,周期,执行时间,完成期限)四元组来描述,保证一个任务的实时性,就是要满足上面四元组的一些自然约束。真正的实时调度器,必定是对上面的四元组进行满足的(这也正是不具备这样的调度器的那些“实时操作系统”盗用“实时”概念的原因)。

      著名的实时调度算法有,RM算法(速率单调性算法)、EDF算法(最早完成期限优先算法)、LLF算法(最小松弛度算法)等,每个算法本身十分简单,但是对于这些算法及其变种的时间满足特性的证明则非常复杂。
      我们再看看“实时操作系统”,这里的“实时”,如上面所说,实际上大多情况下是失去其本色的(只有小部分实时操作系统允许使用上面说过的实时调度器)。

      那么“实时操作系统”的“实时”是什么呢?其实一般就是对2个指标的衡量,一是“最大中断处理延迟”,二是“最大任务调度延迟”。一般来说,市面上的实时操作系统把这两个指标列出来,当它们都足够小时(没有确定的尺度,大致的尺度是最大中断处理延迟在十微秒数量级,最大任务调度延迟在百微秒到毫秒数量级内),就可以说是一个“实时操作系统”。
      这两个指标跟什么有关系呢?首先,处理器的速度(准确的说是执行代码的计算机的速度)很重要,执行代码越快,这两个延迟就越小,这是理所当然的。然后我们分别考察这两个指标:

       先看最大中断处理延迟,最影响这个指标的是处理器关中断以及中断控制器mask掉中断整个区域的代码量,无论是操作系统内核还是driver还是应用程序(某些实时操作系统允许应用程序关中断),都会影响整个这个指标。软件需要可能减小关中断时间来保证这个指标。另外影响这个指标的是内核代码在正式调用中断处理代码前的运行开销,比如查找中断号之类的动作,某些情况下这个开销可能比较大。最后,很不幸,这个指标实际上是跟应用环境相关的,在真实的应用环境里,很可能存在突发密集中断的情形,这种境况下,最大中断延迟根本无法预料(当然了,处理器速度越快就会越有改善)。

       再看最大任务调度延迟,一般来说,可以用当前运行低优先级任务的系统中出现了高优先级任务的时刻到高优先级任务被调度后开始运行的这段时间来衡量。linux2.4之所以“实时性”不好,很大程度上就是因为这个指标与任务数量成正比,新的o(1)调度器就会好很多。另一个严重影响这个指标的是“内核抢占性”,对于一个分开用户级和内核级的操作系统而言,如果内核不可抢占,那就意味着最大任务调度延迟指标会受到运行时间最长的那个系统调用时间的影响(想想为什么吧),因此2.6内核也对这个做了改进。比上个指标更加不幸的是,这个指标在有虚存的操作系统上更加难以确定(你根本不好预料缺页后的一系列行为,万一访问硬盘就...),这也正是大多数时实操作系统不使用虚存的原因。

       就说到这里了,差不多讲清楚了吧