Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1863771
  • 博文数量: 343
  • 博客积分: 10342
  • 博客等级: 上将
  • 技术积分: 2892
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 12:34
个人简介

你必须非常努力,才能看起来毫不费力!

文章存档

2012年(3)

2011年(5)

2010年(2)

2009年(40)

2008年(293)

分类: LINUX

2008-10-15 10:52:19

级别: 中级

M. Tim Jones (), 顾问工程师, Emulex Corp.

2008 年 5 月 19 日

Linux® 的速度或效率都非常不错,只是在一些情况下,这样的速度还不能满足需求。我们需要的是在特定的容差范围内确定性地满足调度期限的能力。本文将揭示各种实现实时 Linux 的可选方案以及它们如何实现实时性 — 从早期的模仿虚拟化解决方案的架构到如今标准 2.6 内核中可用的选项。

本文探索了一些支持实时特性的 Linux 架构,并探讨了实时架构 的含意是什么。有许多种解决方案赋予 Linux 实时能力,本文将对瘦内核(或微内核)方法、超微内核方法以及资源内核(resource-kernel)方法进行考查。最后,描述了标准 2.6 内核的实时功能,并向您示范如何启用并使用这种功能。

下列实时 的定义为探讨实时 Linux 架构提供了基础。定义由 Donal Gillies 在 Realtime Computing FAQ 中提出(参见 参考资料 的链接)。

实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。
更多内容见 developerworks 上 Tim 的 Anatomy of... 系列

换句话说,系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。注意,上述定义并未提到性能,原因是实时性与速度关系不大:它与可预见性有关。例如,使用快速的现代处理器时,Linux 可以提供 20 μ 微秒的典型中断响应,但有时候响应会变得很长。这是一个基本的问题:并不是 Linux 不够快或效率不够高,而是因为它不能提供确定性。

一些例子将演示全部这些内容的含意。图 1 显示的是中断延迟指标。当中断到达时(event),CPU 发生中断并转入中断处理。执行一些工作以确定发生了什么事件,然后执行少量工作分配必需的任务以处理此事件(上下文切换)。中断到达与分发必需任务之间的时间(假设分配的是优先级最高的任务)称为响应时间。对于实时性要求,响应时间应是确定的并应当在已知的最坏情况的时间内完成。


发生中断后分配新任务的过程中隐含着上下文切换。这个过程在中断时存储 CPU 的当前状态,然后恢复一项给定任务的状态。上下文切换依赖于操作系统及底层的处理器架构。


中断延迟和响应时间

有关这个过程的一个例子就是目前汽车中使用的气囊。当报告车辆碰撞的传感器中断 CPU 后,操作系统应快速地分配展开气囊的任务,并且不允许其他非实时处理进行干扰。晚一秒钟展开气囊比没有气囊的情况更糟糕。

除为中断处理提供确定性外,实时处理也需要支持周期性间隔的任务调度。考虑图 2。本图演示了周期性任务调度。大量控制系统要求周期性采样与处理。某个特定任务必须按照固定的周期(p)执行,从而确保系统的稳定性。考虑一下汽车的防抱死系统(ABS)。控制系统对车辆的每个车轮的转速进行采样(每秒最多 20 次)并控制每个制动器的压力(防止它锁死)。为了保持控制系统的正常工作,传感器的采样与控制必须按照一定的周期间隔。这意味着必须抢占其他处理,以便 ABS 任务能按照期望的周期执行。



周期性任务调度

能够在指定的期限完成实时任务(即便在最坏的处理负载下也能如此)的操作系统称为硬实时 系统。但并不是任何情况下都需要硬实时支持。如果操作系统在平均情况下能支持任务的执行期限,则称它为软实时 系统。硬实时系统指超过截止期限后将造成灾难性后果(例如展开气囊过晚或制动压力产生的滑行距离过长)的系统。软实时系统超过截止期限后并不会造成系统整体失败(如丢失视频中的一帧)。

现在您已经对实时性要求有了一些深入了解,让我们查看一些实时 Linux 架构各支持哪个级别的实时性以及如何做到这一点。





回页首


瘦内核(或微内核)方法使用了第二个内核作为硬件与 Linux 内核间的抽象接口(见图 3)。非实时 Linux 内核在后台运行,作为瘦内核的一项低优先级任务托管全部非实时任务。实时任务直接在瘦内核上运行。



硬实时的瘦内核方法

瘦内核主要用于(除了托管实时任务外)中断管理。瘦内核截取中断以确保非实时内核无法抢占瘦内核的运行。这允许瘦内核提供硬实时支持。

虽然瘦内核方法有自己的优势(硬实时支持与标准 Linux 内核共存),但这种方法也有缺点。实时任务和非实时任务是独立的,这造成了调试困难。而且,非实时任务并未得到 Linux 平台的完全支持(瘦内核执行称为 的一个原因)。

使用这种方法的例子有 RTLinux (现在由 Wind River Systems 专有),实时应用程序接口(RTAI)和 Xenomai。





回页首


这里瘦内核方法依赖于包含任务管理的最小内核,而超微内核法对内核进行更进一步的缩减。通过这种方式,它不像是一个内核而更像是一个硬件抽象层(HAL)。超微内核为运行于更高级别的多个操作系统提供了硬件资源共享(见图 4)。因为超微内核对硬件进行了抽象,因此它可为更高级别的操作系统提供优先权,从而支持实时性。



对硬件进行抽象的超微内核法。

注意,这种方法和运行多个操作系统的虚拟化方法有一些相似之处。使用这种方法的情况下,超微内核在实时和非实时内核中对硬件进行抽象。这与 hypervisor 从客户(guest)操作系统对裸机进行抽象的方式很相似。更多信息参见 参考资料

关于超微内核的示例是操作系统的 Adaptive Domain Environment for Operating Systems (ADEOS)。ADEOS 支持多个并发操作系统同步运行。当发生硬件事件后,ADEOS 对链中的每个操作系统进行查询以确定使用哪一个系统处理事件。





回页首


另一个实时架构是资源内核法。这种方法为内核增加一个模块,为各种资源提供预留(reservation)。这种机制保证了对时分复用(time-multiplexed)系统资源的访问(CPU、网络或磁盘带宽)。这些资源拥有多个预留参数,如循环周期、需要的处理时间(也就是完成处理所需的时间),以及截止时间。

资源内核提供了一组应用程序编程接口(API),允许任务请求这些预留资源(见图 5)。然后资源内核可以合并这些请求,使用任务定义的约束定义一个调度,从而提供确定的访问(如果无法提供确定性则返回错误)。通过调度算法,如 Earliest-Deadline-First (EDF),内核可以处理动态的调度负载。



实现资源预留的资源内核法

资源内核法实现的一个示例是 CMU 公司的 Linux/RK,它把可移植的资源内核集成到 Linux 中作为一个可加载模块。这种实现演化成商用的 TimeSys Linux/RT 产品。





回页首


目前探讨的这些方法在架构上都很有趣,但是它们都在内核的外围运行。然而,如果对标准 Linux 内核进行必要的修改使其支持实时性,结果会怎么样呢?

今天,在 2.6 内核中,通过对内核进行简单配置使其完全可抢占(见图 6),您就可以得到软实时功能。在标准 2.6 Linux 内核中,当用户空间的进程执行内核调用时(通过系统调用),它便不能被抢占。这意味着如果低优先级进程进行了系统调用后,高优先级进程必须等到调用结束后才能访问 CPU。新的配置选项 CONFIG_PREEMPT 改变了这一内核行为,在高优先级任务可用的情况下(即使此进程正在进行系统调用),它允许进程被抢占。



允许抢占的标准 2.6 Linux 内核

但这种配置选项也是一种折衷。虽然此选项实现了软实时性能并且即使在负载条件下也可使操作系统顺利地运行,但这样做也付出了代价。代价就是略微减低了吞吐量以及内核性能,原因是 CONFIG_PREEMPT 选项增加了开销。这种选项对桌面和嵌入式系统而言是有用的,但并不是在任何场景下都有用(例如,服务器)。


2.6 内核中新的 O(1) 调度程序对性能有很大的提升,即使存在很多任务的情况下也是如此。不管需要运行的任务有多少个,新的调度程序都会在有限的时间内运行。您可以在 参考资料 一节中找到这种调度的更多信息以及它如何进行工作。

在 2.6 内核中另一项有用的配置选项是高精度定时器。这个新选项允许定时器以 1μs 的精度运行(如果底层硬件支持的话),并通过红黑树实现对定时器的高效管理。通过红黑树,可以使用大量的定时器而不会对定时器子系统(O(log n))的性能造成影响。

只需要一点额外的工作,您就可以通过 PREEMPT_RT 补丁实现硬实时。PREEMPT_RT 补丁提供了多项修改,可实现硬实时支持。其中一些修改包括重新实现一些内核锁定原语,从而实现完全可抢占,实现内核互斥的优先级继承,并把中断处理程序转换为内核线程以实现线程可抢占。





回页首


Linux 不仅是一个实验和描述实时算法的理想平台,目前在标准的 2.6 内核中也实现了实时功能。从标准内核中您可以实现软实时功能,再执行一些额外的工作(内核补丁)您就可以构建硬实时应用程序。

本文简要介绍了一些为 Linux 内核提供实时计算的技术。很多早期的尝试使用瘦内核方法把实时任务与标准内核分离。后来,出现了超微内核法,它与如今的虚拟化解决方案中使用的 hypervisor 非常相似。最后,Linux 内核提供了自己的实时方法,包括软实时和硬实时。

虽然本文只是对 Linux 的实时方法进行了简单介绍,但 参考资料 一节中提供了更多的信息,可以从中获得额外的信息和其他有用的实时技术。



学习
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • 在 Tim 的文章 “虚拟 Linux”(developerWorks,2006 年 12 月)中,了解从虚拟化架构中借鉴而来的实现实时性的瘦内核和超微内核法是多么流行。

  • 在 Tim 的文章 “Linux 调度器内幕”(developerWorks,2006 年 6 月)中,了解 2.6 内核中 O(1) 调度程序的更多内容。

  • 阅读 developerWorks 上的 Tim 的全部 Anatomy of... 文章

  • 是一个很棒的学习实时计算的起点。它涵盖了可移植操作系统接口(POSIX)、实时操作系统的基础知识,以及一些实时分析技巧。

  • “”(PDF)是由 A. Gambier 撰写的有趣教程,它介绍了实时控制系统的设计并探讨了各种调度算法。

  • 第六届实时 Linux 研讨会(2007 年 11 月举办)的会议记录中包含的论文和参考资料可以帮助您了解实时 Linux 的最新发展。

  • 早期的 以及 都应用了瘦内核方法。虽然运用方式略有不同,但整体方法被证明是有价值的。

  • 是一个在 Linux 内核中提供实时功能的硬件抽象层(HAL)或超微内核。它也已应用到对称多处理器(SMP)集群和内核调试中。

  • “” 描述了一个通过预留 API 提供对时分复用资源(如 CPU、网络或磁盘)的可靠访问的组件。

  • 是一个自平衡的二叉查找树。虽然算法本身很复杂,但它在实践应用中的效率很高,可以按照 O(log n) 的时间操作。

  • 补丁为标准 2.6 Linux 内核提供了硬实时功能。这些页面详细地说明了 RT_PREEMPT 配置的方法以及一些有用的 。

  • 在这个 场景中,低优先级的任务占有着高优先级任务需要的资源(这个问题出现在 )。此问题的解决方法是 ,这增加了低优先级任务的优先级,允许它运行从而释放资源。

  • Novell 公司最近公布了它们的 SUSE Linux Enterprise Real-Time (SLERT) 1.0 版。这个发行版包含内核更新以及对实时应用程序的 POSIX 实时支持。两项改进包括 CPU 屏蔽和 动态优先级分配 。

  • Xenomai/SOLO 宣布不使用内核共存法,而转向使用与 Linux 内核层更加紧密集成的方法。这种方法支持传统的 POSIX (用户空间)编程。

  • developerWorks Linux 专区 找到更多面向 Linux 开发人员的资源,并请浏览 最受欢迎的文章和教程

  • 查看 developerWorks 上所有的 Linux 技巧 Linux 教程

  • 随时关注 developerWorks 技术活动和网络广播


获得产品和技术
  • 定购 SEK for Linux,共含两张 DVD,包含来自 DB2®、 Lotus®、 Rational®、 Tivoli® 和 WebSphere® 的面向 Linux 的最新 IBM 试用软件。

  • 使用 IBM 试用软件 改进您的下一个 Linux 开发项目,可以从 developerWorks 直接下载获得。


讨论


M. Tim Jones

M. Tim Jones 是一名嵌入式软件工程师,他是 GNU/Linux Application ProgrammingAI Application Programming 以及 BSD Sockets Programming from a Multilanguage Perspective 等书的作者。他的工程背景非常广泛,从同步宇宙飞船的内核开发到嵌入式架构设计,再到网络协议的开发。Tim 是位于科罗拉多州 Longmont 的 Emulex Corp. 的一名顾问工程师。

阅读(1444) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~