简介
上个世纪,研制人员投入了许多精力前进 Linux 实时功用和行为,最著名的是 PREEMPT_RT Linux 实时扩展。最近,研制人员致力于研讨适用于多核设备的 Linux 用户空间处理方案,该处理方案答应从用户空间中直接拜访根底硬件,然后可避免因将 Linux 内核引进用户空间运用而带来的额定体系开支。这些用户空间扩展(有多个)已首先由电信/网络高功用 IP 数据包处理体系进行驱动,以完结所谓的“裸金属”施行,其间,多核设备中的 Linux 用户空间运用能够模仿“无操作体系”处理方案的履行进程,即在每个内核上进行简略“运转到完结”、轮询循环,以便进行数据包处理。在从底子上完结该方针的一起,该处理方案仍可用于十分特别的用例。还有其他需求前进功用的用例无法经过以上处理方案彻底处理吗?假如有的话,请罗列出来,是否可运用更完善的 Linux 实时改善?答案是必定的,选用 Linux 用户空间轻型线程 (light-weight threading, LWT) 即可。咱们来研讨一下实时 Linux,以及轻型线程怎么能成为适用于某些运用的处理方案。研讨的要点受电信、网络或常用通讯运用的影响,Enea 侧重于这些运用中选用的技能。但整体上来说,对轻型线程的要点运用会使多方获益。
实时Linux 及其处理的问题
在曩昔的 10 年中,Linux 已在实时功用和行为方面获得了明显的前进,满意了许多运用的需求。详细归纳如下:
PREEMPT_RT
PREEMPT_RT 或许是 Linux 实时扩展获得的最明显的成果,PREEMPT_RT 数据包处理了多核设备 Linux 中存在的特别扎手的问题,即“中止推迟”问题。将事情/数据传送到实在用户空间运用之前,处理Linux内核中的中止占用的体系开支十分高 – 该体系开支往往会推迟其他中止,然后增大产生中止时测得的中止信息接收方进行处理的整体推迟。相同,Linux 内核中还有许多所谓的“重要部分”,可在其间经过自旋锁禁用中止。规范Linux 内核的整体中止推迟与许多实时运用的最重要的中止推迟要求不符,特别是无线接入网(移动)和移动中心根底设施,这两者要求最差状况下的中止推迟应在 20-30 微秒规模内。这一点也适用于许多其他商场运用。在快速“nutshell”PREEMPT_RT 中,这一问题是经过以下方法处理的:
将悉数设备驱动器中止句柄传递到可调度线程中,这样可最大程度地削减 Linux 内核对中止的处理工作,因而,无需等候前一中止处理完结便可处理新中止。之后,中止处理睬变为受优先级驱动,依据用户需求,会先完结优先级最高的中止处理。
将 Linux 内核中的一切死空间自旋锁传递到互斥量中,然后答应其他内核线程替代内核空间自旋锁运转。
基本上,PREEMPT_RT 已依据十分高功用的实时规范将整体中止推迟成功缩短,这样对许多 Linux 运用都十分有协助。要了解详细运用?请持续往下读。
用户空间 Linux 调整
如上文所述,近年来,研制人员对 Linux 用户空间运用投入了许多精力。意图是避免用户空间运用(Linux 用户对其附加价值投入了许多精力)占用 Linux 内核自身的体系开支来处理某些特定的设备/中止交互。Linux 选用的模型可极大程度地避免用户空间运用遭到内核的影响,在该模型中,一切用户空间操作(包含线程)始终会映射到 Linux 内核,以便处理其 I/O 恳求。这样便使 Linux 具有强壮的行为和特性。可是,关于数据处理功用十分高的运用来说,即便选用 PREEMPT_RT,Linux 也会有短时毛病,这是因为,总是需求进行 Linux 内核上下文切换才干直接拜访硬件。用户空间 Linux 施行答应运用在不触及 Linux 内核的状况下直接拜访硬件和中止,并可极大程度地前进功用。但这种功用进步只能在 I/O 密度极高的环境中完结。大部分 Linux 用户空间调整都侧重于单线程运用(如高功用数据包处理),其间,Linux 下只要一个线程用于模仿多核设备中的“无操作体系”功用。
多线程问题
实时 Linux 处理方案查询中短少的是仔细查看多线程在实时嵌入式运用中的有用性。实践上,早在 20 世纪 80 时代 Linux 呈现之前,人们就提出了需求选用嵌入式实时操作体系 (RTOS) 来完结低推迟、高吞吐量、极具实时特色的运用。操作体系的结构产生了改动,但对这方面的需求却没有改动。此类 RTOS 处理方案所具有的各种功用、行为和特性是曩昔十多年中 Linux 一向测验到达的。这并不意味着倾向于康复运用 RTOS,而是要到达 RTOS 所具有的功用。就便携性、运用的宽广生态体系以及设备支撑和惯例支撑来讲,Linux 在实时嵌入式处理方案中的整体价值是任何 RTOS 都无法比拟的。存在两个实践问题:
多线程为何重要?
假如多线程很重要,那么咱们应怎么将 RTOS 多线程功用、行为和特性添加到 Linux 中,以便获得更大的成功?要害问题是了解 Linux 多线程施行与 RTOS,然后考虑能够进行哪些改善。
多线程为何重要?
30 多年前,当核算机处理方案软件规划人员碰到单线程处理方案无法处理的杂乱问题时,便已提出了对多线程实时性方面的需求。所需处理方案要求单个运用具有多个使命,或许一些是核算使命,一些是受 I/O 驱动的使命,可是,就使命的整体履行而言,一切使命均密切相关。但多个使命密切相关意味着这些使命应同享一部分 CPU 时刻才干到达 CPU 的有用整体运用率。在许多此类运用中,有必要制止履行某些操作、等候某些 I/O 事情或另一运用宣布的其他通讯。因而呈现了简略的可履行程序,这些可履行程序能够处理多个线程,一起可禁用线程,并可在各线程之间进行低推迟通讯。
并非一切实时运用都需求支撑重要的多线程处理功用。本文并未对相关运用进行分类。但很显然,需求运用多线程处理功用的运用是那些需求在协议中设定“等候状况”的任何类型的杂乱协议,即等候答应运用持续进行的呼应或事情。之后,运用应抛弃对 CPU 的操控权,答应运转其他相似的线程,来替代该呼应或事情。
或许上述教程关于许多人来说很简略。请注意,许多移动根底设施和中心网络设备供货商得出的定论是,尽管 Linux 是当时或未来体系的首选,但现在构建的 Linux 还不足以满意业界的悉数要求。原因是什么?
选用 PTHREADS 的 Linux 多线程
Pthreads 是由 IEEE 规划的可移植操作体系接口 (POSIX) 创立的,意图是为了处理 Unix 中存在的高功用、多线程问题,之后被 Linux 用在最早的版别中,用于为企业施行可移植 Unix,现在用于嵌入式运用中。
创立 pthreads 模型是为了处理原始 Unix Fork/Join 模型创立 Unix“子”进程时呈现的问题。因为该模型触及到创立(还或许触及删去)整个受内存维护的环境及履行形式,因而Unix 进程模型十分巨大。需求在 Unix 下选用适用于多线程的较轻型模型,因而pthreads应运而生。
但 Unix(也包含 Linux)模型是专为将内核与用户空间运用彻底别离而规划的,其优势之一在于供给的维护、安全性和可靠性远胜于其他施行方案(包含曩昔 10 几年间运用的 RTOS)。实质上,这意味着 Linux 用户空间中的每个 pthread 都会由 Linux 内核线程表明,因而,悉数或大部分 Linux 体系调用(特别是设备驱动器)均可经过用户空间进行拜访。可是,因为 OEM 制作的产品并不具有 GPL,因而用户空间中实践存储了一切嵌入式 Linux 实时运用。因而,在每种状况下,运用 pthreads 都触及到调用 Linux 内核,然后为本能够在本地施行的运用带来了额定的体系开支。
但请您稍稍考虑一下。选用上文说到的 Linux 实时扩展怎么样?是的,PREEMPT_RT 能够处理 Linux 内核中存在的许多关于呼应性的问题,但不能真实处理多线程问题。施行用户空间 Linux 可处理设备驱动器/中止功用问题,但并不能真实处理多线程问题。Linux 实时容器可处理部分问题,但实时容器仅仅一种根据规范 Linux 的用户空间 Linux 可视化技能,并不能真实处理底子的多线程问题。
轻型线程 (LWT) – 杂乱 Linux 运用的真实处理方案
之前针对 Linux 提出了多种轻型线程模型的主张,但没有一种模型能够真实处理问题。原因安在?因为大多数模型的功用都不是很强壮。触及杂乱多线程运用的下一代 Linux 处理方案真实需求的是适用于用户空间 Linux 运用的全新 Linux 模型。下文归纳介绍了这种名为Linux轻型线程 (LWT) 的处理方案。将高功用、低体系开支、多线程调度器植入 Linux 用户空间,来替代独自的 pthread。原因安在?
Pthread 体系开支
进程和 pthreads 是 Linux 了解的仅有调度实体。
LWT pthread 仅仅一个 Linux 编码履行布景,可用于永久运转 pthread。因为用户空间调度器始终保持操控,因而 pthread 绝不会被挂起 – 省电形式在外。这种状况不在本文的评论规模。
该用户空间调度器的运转和操作方法与某些传统 RTOS 高功用、低推迟施行彻底相同,但不会触及到 Linux 内核。
施行进程运用新用户空间 Linux 施行进程来直接拜访硬件。相同也不触及 Linux 内核。
上述 LWT 处理方案可在任何 Linux 实时运用中完结动态功用的进步。Enea 已规划出上述 LWT 的一些原型,事实证明,与 Linux pthreads 在调度器体系开支、特别是上下文切换和线程间音讯发送/通讯推迟方面的功用比较,LWT 功用可前进 10 倍。
可是除了调度功用和线程间通讯功用之外,LWT 处理方案还应带来什么?LWT 概念除了在功用方面胜过 Linux pthreads 之外,还有更多优势。处理方案稳健性的概念怎么?与历史悠久的 RTOS 实时处理方案相同,LWT 也需求具有以下额定 Linux 特性:
决定性调度
调度体系开支低 – 上下文切换成本低
线程间信号体系开支低
线程创立成本低
多核设备中 Linux 轻型线程模型的结构图
LWT 施行方案的结构图如下。触及整个同享内存空间的 Linux 进程或许跨多核设备的多个内核。为了到达最高功率,LWT 模型需求将 Linux 进程中的单个 pthread 确定至某一个内核,但并不特别要求这样做。LWT 确定至 pthread 之后,便可迁移到 Linux SMP 需求的任何内核中。
图 1:多核设备中 Linux 轻型线程模型的结构图
定论
高效轻型线程 (LWT) 将成为下一个 Linux 实时功用和行为问题。需求着重的是,并非一切实时运用都需求运用功用强壮的相似 LWT 的处理方案。可是一些实时运用,尤其是电信/网络中的运用以及无线接入网、移动根底设施中心/边际中的那些需求运用某些杂乱网络协议的运用、或任何具有相似实时需求的其他体系均可获益于 Linux 轻型线程 – 下一代 Linux 实时扩展。一起,实时嵌入式 Linux 的整个发展进程证明了 Linux 的运转效果与传统 RTOS 处理方案相同优异。Linux 已获得了一些发展,可是作者以为,最重要的电信/网络运用中运用的 Linux 没有到达预期的要求。但或许经过 Linux 轻型线程,咱们能够更挨近这一方针。总的来说,Linux 实时嵌入式职业的一个侧要点是研制出可用于要求最高的实时运用的处理方案。下图中描绘了该方针:
图 2:轻型线程和 Linux 概念 – Linux 和 RTOS 最重要的概念