1.2实时系统概况 1.2.1什么是实时系统 实时计算正在成为越来越重要的原则。操作系统,特别是调度程序, 可能是实时系统中最重要的组件。实时系统的例子包括实验控制、过程控 制设备、机器人、空中交通管制、远程通信、军事指挥与控制系统,下一 代系统还将包括自动驾驶汽车、具有弹性关节的机器人控制器、智能化生 产中的系统控制、空间站和海底勘探等。 实时计算[5]可以定义成这样一类计算,即系统的正确性不仅取决于计 算的逻辑结果,而且还依赖于产生结果的时间。我们可以通过定义实时进 程或实时任务来定义实时系统。一般说来,在实时系统中,某些任务是实 时任务,它们具有一定的紧急程度。这类任务试图控制外部世界发生的事 件,或者对事件做出反应。由于这些事件是“实时”发生的,因而实时任 务必须能够跟得上它所关心的事件。因此,通常给一个特定的任务制定一 个最后期限,最后期限指定开始时间或结束时间。这类任务可以分为硬任 务或软任务两类。一个硬实时任务(hard real-time task)指必须满足最后期 限的限制,否则会给系统带来不希望的破坏或者致命的错误。一个软实时 任务(soft real-.time task)也是一个与之关联的最后期限,并希望能满足这 个期限的要求,但这并不是强制的,即使超过了最后期限,调度和完成这 个任务仍然是有意义的。实时任务的另一个特征是它们是周期还是非周期 的。一个非周期任务(aperiodic task)有个必须结束或开始的最后期限, 或者有一个关于开始时间和结束时间的约束。而对于周期任务(periodic task),这个要求描述成“每隔周期T一次”或者“每隔T个单位”。 1.2.2实时操作系统的特点 实时操作系统一般符合以下的一些要求[S]: ●可确定性:是指它可以按照固定的、预先确定的时间或时间间隔执 行操作。 ●响应性:是指在系统得到中断后系统为中断提供服务的时间。 ●用户控制:是指允许用户细粒度地控制任务的各种属性(任务优先 级、任务权限等)。 ·可靠性 ryan_joseph@163.net Copyright2002杨立峰
ryan_joseph@163.net Copyright 2002 杨立峰 4 1.2 实时系统概况 1.2.1 什么是实时系统 实时计算正在成为越来越重要的原则。操作系统,特别是调度程序, 可能是实时系统中最重要的组件。实时系统的例子包括实验控制、过程控 制设备、机器人、空中交通管制、远程通信、军事指挥与控制系统,下一 代系统还将包括自动驾驶汽车、具有弹性关节的机器人控制器、智能化生 产中的系统控制、空间站和海底勘探等。 实时计算[5]可以定义成这样一类计算,即系统的正确性不仅取决于计 算的逻辑结果,而且还依赖于产生结果的时间。我们可以通过定义实时进 程或实时任务来定义实时系统。一般说来,在实时系统中,某些任务是实 时任务,它们具有一定的紧急程度。这类任务试图控制外部世界发生的事 件,或者对事件做出反应。由于这些事件是“实时”发生的,因而实时任 务必须能够跟得上它所关心的事件。因此,通常给一个特定的任务制定一 个最后期限,最后期限指定开始时间或结束时间。这类任务可以分为硬任 务或软任务两类。一个硬实时任务(hard real-time task)指必须满足最后期 限的限制,否则会给系统带来不希望的破坏或者致命的错误。一个软实时 任务(soft real-time task)也是一个与之关联的最后期限,并希望能满足这 个期限的要求,但这并不是强制的,即使超过了最后期限,调度和完成这 个任务仍然是有意义的。实时任务的另一个特征是它们是周期还是非周期 的。一个非周期任务(aperiodic task)有个必须结束或开始的最后期限, 或者有一个关于开始时间和结束时间的约束。而对于周期任务(periodic task),这个要求描述成“每隔周期 T 一次”或者“每隔 T 个单位”。 1.2.2 实时操作系统的特点 实时操作系统一般符合以下的一些要求[5]: z 可确定性:是指它可以按照固定的、预先确定的时间或时间间隔执 行操作。 z 响应性:是指在系统得到中断后系统为中断提供服务的时间。 z 用户控制:是指允许用户细粒度地控制任务的各种属性(任务优先 级、任务权限等)。 z 可靠性
●故障弱化运行:是指系统在故障时尽可能多地保存其权能和数据的 能力。 嵌入式系统一般都是实时系统,实时系统大都是用在嵌入式环境。用 于嵌入式场合的实时操作系统就是嵌入式实时操作系统。在一个较为完善 的嵌入式系统环境中,需要一个支持实时多任务的操作系统(RTOS)内核, 因为广泛应用于现实世界的嵌入式设备必须具有与外部环境实时交互的能 力。RTOS是和嵌入式应用复杂化直接相关的,在应用需求的复杂度不断 增加的今天,如果实时应用软件开发还是没有基于一个完善的RTOS,那 么无法将系统软件和应用软件分离,开发周期过长、成本过高。因此,因 此RTOS是实时应用软件开发的必然产物。 ryan_joseph@163.net Copyright2002杨立峰
ryan_joseph@163.net Copyright 2002 杨立峰 5 z 故障弱化运行:是指系统在故障时尽可能多地保存其权能和数据的 能力。 嵌入式系统一般都是实时系统,实时系统大都是用在嵌入式环境。用 于嵌入式场合的实时操作系统就是嵌入式实时操作系统。在一个较为完善 的嵌入式系统环境中,需要一个支持实时多任务的操作系统(RTOS)内核, 因为广泛应用于现实世界的嵌入式设备必须具有与外部环境实时交互的能 力。RTOS 是和嵌入式应用复杂化直接相关的,在应用需求的复杂度不断 增加的今天,如果实时应用软件开发还是没有基于一个完善的 RTOS,那 么无法将系统软件和应用软件分离,开发周期过长、成本过高。因此,因 此 RTOS 是实时应用软件开发的必然产物
第二章 实时系统的相关研究 尽管现在的操作系统变得种类繁多,但是UNX及其兼容的系统仍然 是工业和学术领域标准的操作系统。一些非UNIX系统,比如Windows NT, 也是与POSX.1003标准兼容,这个标准无疑是基于UNIX。这个系统的成 功是由于它的开放性、稳定性和事实的标准。随着POSIX1003.1b实时扩 展标准的发布,UNIX有机会成为分布最广泛的实时处理平台。Liux作为 一个类UNX的系统,凭借其开放源码的优势,获得越来越广泛的应用。 由于以上的原因,在这一章我将集中讨论与Liux相关的实时系统。 我将讨论在Liux上进行实时运算的问题,和在一些系统中如何解决这些 问题。 2.1 LINUX的分时特性 UNIX最初是作为一个分时系统设计的[I7刀。LINUX作为UNIX的克 隆,很多当前的实现中仍然保留了这些特点。它们力争最优的平均性能。 这个目标通常与实时系统的低延迟和高可预言的要求相勃的。为了说明这 个问题,让我们考虑一个通过扬声器发声的程序(程序2.1)。 #define DELAY 10000 main() int i; while (1){ for (i=0;i<DELAY;i++) speaker on(); for (i=0;i<DELAY;i++) speaker off(); 程序2.1简单的发声程序 扬声器的驱动程序假定为只有两种状态o或off。初看起来这个程序 可以按给定的周期输出方波,使扬声器正常的发声。然而,当运行一个标 准的LINUX程序时,它将不能正确的发声。 我在一个有4I2 MHz Celeron处理器的Linux操作系统上运行这个程 yan_joseph@163.net Copyright2002杨立峰 6
ryan_joseph@163.net Copyright 2002 杨立峰 6 第二章 实时系统的相关研究 尽管现在的操作系统变得种类繁多,但是 UNIX 及其兼容的系统仍然 是工业和学术领域标准的操作系统。一些非 UNIX 系统,比如 Windows NT, 也是与 POSIX.1003 标准兼容,这个标准无疑是基于 UNIX。这个系统的成 功是由于它的开放性、稳定性和事实的标准。随着 POSIX1003.1b 实时扩 展标准的发布,UNIX 有机会成为分布最广泛的实时处理平台。Linux 作为 一个类 UNIX 的系统,凭借其开放源码的优势,获得越来越广泛的应用。 由于以上的原因,在这一章我将集中讨论与 Linux 相关的实时系统。 我将讨论在 Linux 上进行实时运算的问题,和在一些系统中如何解决这些 问题。 2.1 LINUX 的分时特性 UNIX 最初是作为一个分时系统设计的[17]。LINUX 作为 UNIX 的克 隆,很多当前的实现中仍然保留了这些特点。它们力争最优的平均性能。 这个目标通常与实时系统的低延迟和高可预言的要求相勃的。为了说明这 个问题,让我们考虑一个通过扬声器发声的程序(程序 2.1)。 #define DELAY 10000 main() { int i; while (1) { for (i=0;i<DELAY;i++) speaker_on(); for (i=0;i<DELAY;i++) speaker_off(); } } 程序 2.1 简单的发声程序 扬声器的驱动程序假定为只有两种状态 on 或 off。初看起来这个程序 可以按给定的周期输出方波,使扬声器正常的发声。然而,当运行一个标 准的 LINUX 程序时,它将不能正确的发声。 我在一个有 412MHz Celeron 处理器的 Linux 操作系统上运行这个程
序。当在系统没有别的程序在运行时,扬声器发出稳定的声音。每一个滴 答声都可以听到。当有按键动作或者移动鼠标时,都会引起声音的断续。 在执行磁盘操作或高运算量的程序时,声音将变得严重失真。最后,起动 一个大的程序,比如X-Windows,扬声器将持续大约半秒的时间不能发声。 假如这个程序是控制步进电机的,而不是使扬声器发声,那么程序将不能 使电机稳定地运行。 Liux的设计和实现的原理大体上与UNIX是相同的12]。它们都是采 用分时的调度,低的计时分辨率,非占先式内核,关中断和虚拟内存。我 们在细节上来考虑这些问题。 调度程序是内建在操作系统内部的一组策略和机制,它决定哪一项工 作将由计算机来完成[4]。 大部分的UNX操作系统,尤其是Liux操作系统,它们的调度程序 追求的是平均响应时间、吞吐量和在进程之间的公平的CPU时间分配[16]。 每个进程的优先级是动态的基于进程己经花费的CPU时间,输入/输出强 度和别的一些因素来决定。 Linux系统使用固定的时间片(time slices)来调度CPU时间。最开始进 程赋予一个高的优先级。如果在某个进程的时间片内,这个进程放弃CPU, 它的优先级将不会变,或者变的更高。另一方面,如果一个进程使用完它 的时间片,它的优先级将会变低。这种策略关心的是交互式程序,比如说 编辑器,由于这类程序更多的把时间花费在等待/O输入输出的完成。虽 然对在终端前的用户来说是有利的。由于程序的执行完全依赖于复杂的、 不可预知的系统负荷与别的进程的活动,这种调度方式对于实时进程而言 完全没有用。 Liux中加进了POSIX实时扩展部分,引进了实时进程的概念,允许 一个进程定义为一个实时进程。Liux区分实时进程和普通进程,采用不 同的调度策略。即先来先服务调度(SCHED FIFO)和时间片轮转调度 (SCHED RR)。在SCHED RR调度中,任务一旦时间片用完就被移动到优 先级队列的队尾,并允许同一优先级的其它任务运行。如果同一优先级没 有其它任务,该任务继续运行下一个时间片。SCHED FIFO是运行直至阻 塞的策略。$CHED FIFO任务按优先级调度,一旦开始就一直运行到结束 或阻塞在某种资源上。不像SCHED RR任务那样共享处理器。 另外还有计时器的精度问题。以前提供给用户进程警报信号和sleep() 系统调用只有1秒的精度,如此粗糙的计时精度是不适合大多数的实时进 ryan_joseph@163.net Copyright2002杨立峰 7
ryan_joseph@163.net Copyright 2002 杨立峰 7 序。当在系统没有别的程序在运行时,扬声器发出稳定的声音。每一个滴 答声都可以听到。当有按键动作或者移动鼠标时,都会引起声音的断续。 在执行磁盘操作或高运算量的程序时,声音将变得严重失真。最后,起动 一个大的程序,比如 X-Windows,扬声器将持续大约半秒的时间不能发声。 假如这个程序是控制步进电机的,而不是使扬声器发声,那么程序将不能 使电机稳定地运行。 Linux 的设计和实现的原理大体上与 UNIX 是相同的[12]。它们都是采 用分时的调度,低的计时分辨率,非占先式内核,关中断和虚拟内存。我 们在细节上来考虑这些问题。 调度程序是内建在操作系统内部的一组策略和机制,它决定哪一项工 作将由计算机来完成[4]。 大部分的 UNIX 操作系统,尤其是 Linux 操作系统,它们的调度程序 追求的是平均响应时间、吞吐量和在进程之间的公平的 CPU 时间分配[16]。 每个进程的优先级是动态的基于进程已经花费的 CPU 时间,输入/输出强 度和别的一些因素来决定。 Linux 系统使用固定的时间片(time slices)来调度 CPU 时间。最开始进 程赋予一个高的优先级。如果在某个进程的时间片内,这个进程放弃 CPU, 它的优先级将不会变,或者变的更高。另一方面,如果一个进程使用完它 的时间片,它的优先级将会变低。这种策略关心的是交互式程序,比如说 编辑器,由于这类程序更多的把时间花费在等待 I/O 输入输出的完成。虽 然对在终端前的用户来说是有利的。由于程序的执行完全依赖于复杂的、 不可预知的系统负荷与别的进程的活动,这种调度方式对于实时进程而言 完全没有用。 Linux 中加进了 POSIX 实时扩展部分,引进了实时进程的概念,允许 一个进程定义为一个实时进程。Linux 区分实时进程和普通进程,采用不 同的调度策略。即先来先服务调度(SCHED_FIFO)和时间片轮转调度 (SCHED_RR)。在 SCHED_RR 调度中,任务一旦时间片用完就被移动到优 先级队列的队尾,并允许同一优先级的其它任务运行。如果同一优先级没 有其它任务,该任务继续运行下一个时间片。SCHED_FIFO 是运行直至阻 塞的策略。SCHED_FIFO 任务按优先级调度,一旦开始就一直运行到结束 或阻塞在某种资源上。不像 SCHED_RR 任务那样共享处理器。 另外还有计时器的精度问题。以前提供给用户进程警报信号和 sleep() 系统调用只有 1 秒的精度,如此粗糙的计时精度是不适合大多数的实时进
程。当前的版本提供了更高精度的时间间隔,然而,内在的时钟实现限制 了计时的正确性。这方面的内容在后面将由更详细的论述。 大部分的Linux的核心进程是不能中断的10]。换句话说,一旦一个 进程进入到核心模式,它将运行到系统调用的完成或者被阻塞为止。假如 在这期间有一个更高优先级的实时进程准备好运行了,它将不得不等待。 由于不需要考虑内核重入的问题,这种设计的方式使内核的开发更为简单。 然而,一个系统调用可能花费很长时间来完成,对于一个实时进程来说长 的延迟是不能接受的。 于非占先式内核相关的问题是系统的同步。为了保护数据可能被非同 步的操作,比方说中断处理函数,系统设计者通常在临界区代码中选择关 中断的方式来处理。比起信号量(semaphores)或者自旋锁(spinlocks)这是更 为简单有效的技术。但是,禁止中断是系统能力与系统对外部事件的快速 响应的一个折中。这种方法还是不能解决多处理器系统的同步化问题。 Liuⅸ系统使用了虚拟内存用于分页[10]。虚拟内存技术只是保护程序 在运行部分在RAM中,可以使运行的程序超过系统RAM的容量。这种 方式在分时系统中将很好的运行。然而,对于实时系统来说,虚拟内存引 起的系统不可确定性达到一个无法忍受的地步。 所有考虑的这些因素来看,显然传统的Liuⅸ是不可能用于实时处理。 我们需要一些根本的改变。 2.2 Linux性能测试 为了对Linux的性能有一个直观的了解,我对Linux系统进行了测试。 测试的内容包括中断延迟时间和上下文切换。对测试的结果进行分析,以 寻找提高Linux延时间性能的途径。 2.2.1中断延迟测试 中断可以分为两种不同类型:同步和非同步中断。对应用程序来说, 重要的是非同步中断。非同步中断发生的情况如图2.1所示。中断响应时 间是中断发生到中断处理程序开始执行之间的时间差。这个时间差包括直 到在运行任务停止和中断分派时间。 yan_joseph@163.net Copyright2002杨立峰 6
ryan_joseph@163.net Copyright 2002 杨立峰 8 程。当前的版本提供了更高精度的时间间隔,然而,内在的时钟实现限制 了计时的正确性。这方面的内容在后面将由更详细的论述。 大部分的 Linux 的核心进程是不能中断的[10]。换句话说,一旦一个 进程进入到核心模式,它将运行到系统调用的完成或者被阻塞为止。假如 在这期间有一个更高优先级的实时进程准备好运行了,它将不得不等待。 由于不需要考虑内核重入的问题,这种设计的方式使内核的开发更为简单。 然而,一个系统调用可能花费很长时间来完成,对于一个实时进程来说长 的延迟是不能接受的。 于非占先式内核相关的问题是系统的同步。为了保护数据可能被非同 步的操作,比方说中断处理函数,系统设计者通常在临界区代码中选择关 中断的方式来处理。比起信号量(semaphores)或者自旋锁(spinlocks)这是更 为简单有效的技术。但是,禁止中断是系统能力与系统对外部事件的快速 响应的一个折中。这种方法还是不能解决多处理器系统的同步化问题。 Linux 系统使用了虚拟内存用于分页[10]。虚拟内存技术只是保护程序 在运行部分在 RAM 中,可以使运行的程序超过系统 RAM 的容量。这种 方式在分时系统中将很好的运行。然而,对于实时系统来说,虚拟内存引 起的系统不可确定性达到一个无法忍受的地步。 所有考虑的这些因素来看,显然传统的 Linux 是不可能用于实时处理。 我们需要一些根本的改变。 2.2 Linux 性能测试 为了对 Linux 的性能有一个直观的了解,我对 Linux 系统进行了测试。 测试的内容包括中断延迟时间和上下文切换。对测试的结果进行分析,以 寻找提高 Linux 延时间性能的途径。 2.2.1 中断延迟测试 中断可以分为两种不同类型:同步和非同步中断。对应用程序来说, 重要的是非同步中断。非同步中断发生的情况如图 2.1 所示。中断响应时 间是中断发生到中断处理程序开始执行之间的时间差。这个时间差包括直 到在运行任务停止和中断分派时间