您的位置首页>企业动态>

你了解Linux实时架构?

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解你了解Linux实时架构?问题。Linux的速度或效率很好,但在某些情况下,这种速度不能

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解你了解Linux实时架构?问题。

Linux的速度或效率很好,但在某些情况下,这种速度不能满足需求。我们需要的是在特定的容差范围内确定性地满足计划截止日期的能力。本文将揭示实现实时Linux的各种选项以及它们是如何实现实时的——从模仿虚拟化解决方案的早期体系结构到今天标准2.6内核中可用的选项。

本文探讨了一些支持实时特性的Linux体系结构,并讨论了实时体系结构的含义。有许多解决方案赋予了Linux实时能力。本文将考察瘦内核(或微内核)方法、超微内核方法和资源内核方法。最后,它描述了标准2.6内核的实时功能,并向您展示了如何启用和使用该功能。

实时的定义和要求。

以下对实时的定义为探索实时Linux体系结构提供了基础。定义是由姜懿翔吉利斯在实时计算常见问题中提出的。

实时系统是指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果不满足系统的时间限制,则认为系统无效。

上下文开关程序

上下文切换是在中断后分配新任务的过程中隐含的。该进程存储中断时的CPU当前状态,然后恢复给定任务的状态。上下文切换取决于操作系统和底层处理器架构。

换句话说,当系统面临变化的负载(从最小到最差)时,它必须满足时间要求。请注意,上面的定义没有提到性能,因为实时与速度关系不大:它与可预测性有关。例如,当使用快速现代处理器时,Linux可以提供20 微秒的典型中断响应,但有时响应会变得非常长。这是一个基本问题:不是因为Linux不够快或者不够高效,而是因为它无法提供确定性。

一些例子将说明所有这些内容的意义。图1显示了中断延迟指示器。当中断到达时(事件),中央处理器被中断并转向中断处理。做一些工作来确定发生了什么,然后做一些必要的任务来处理这个事件(上下文切换)。中断和分配必要任务之间的时间(假设分配了优先级最高的任务)称为响应时间。对于实时需求,应确定响应时间,并应在已知的最坏情况时间内完成。

图1。中断延迟和响应时间。

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

除了为中断处理提供确定性,实时处理还需要支持定期的任务调度。考虑图2。此图展示了周期性任务调度。大量控制系统需要定期采样和处理。必须根据固定周期(p)执行特定任务,以确保系统的稳定性。以汽车的防抱死制动系统(ABS)为例。该系统对车辆每个车轮的转速进行采样(最高每秒20次),并控制每个制动器的压力(以防止其锁定)。为了保持控制系统的正常运行,传感器的采样和控制必须按照一定的周期间隔进行。这意味着必须抢占其他处理,以便可以根据预期周期执行ABS任务。

图2。周期性任务调度。

软硬实时系统。

一个能够在指定的时间限制内(即使在最差的处理负载下)完成实时任务的操作系统被称为硬实时系统。但是硬实时支持并不总是需要的。如果操作系统平均能够支持任务的执行截止时间,则称之为软实时系统。硬系统是指超过期限后会造成灾难性后果的系统(如安全气囊展开过晚或制动压力导致的滑行距离过长)。当实时系统的截止时间超过时,不会造成系统的整体故障(如视频中丢失一帧)。

现在您已经对实时需求有了一些深入的了解,让我们看看一些实时Linux体系结构支持哪种级别的实时,以及如何实现这一点。

薄核方法

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

图 3. 硬实时的瘦内核方法

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

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

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

超微内核方法

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

图 4. 对硬件进行抽象的超微内核法

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

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

资源内核法

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

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

图 5. 实现资源预留的资源内核法

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

标准 2.6 内核中的实时

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

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

图 6 允许抢占的标准 2.6 Linux 内核

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

新的 O(1) 调度程序

2.6 内核中新的 O(1) 调度程序对性能有很大的提升,即使存在很多任务的情况下也是如此。不管需要运行的任务有多少个,新的调度程序都会在有限的时间内运行。

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

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

结束语

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

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

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。