20 年!PREEMPT_RT 最终合并入 Linux 内核
20 年!PREEMPT_RT 最终合并入 Linux 内核
本文翻译自 https://www.zdnet.com/article/20-years-later-real-time-linux-makes-it-to-the-kernel-really/
实时 Linux 资深开发者 Steven Rostedt 和笔者 Steven Vaughan-Nichols 在维也纳的 Linux 欧洲峰会。
经过 20 年,实时 Linux (PREEMPT_RT) 终于 —— 终于 —— 进入主线内核。Linus Torvalds 在 开源峰会欧洲 上批准了这段代码。这有什么重要意义呢?让我们从解释什么是实时操作系统 (RTOS) 以及它的用途开始。
什么是 RTOS?
RTOS(实时操作系统)是一种专门的操作系统,设计用于以精确和可靠的方式处理时间关键任务。与通用操作系统(如 Windows 或 macOS)不同,RTOS 构建用于在严格的时间约束内响应事件并处理数据,通常以毫秒或微秒为单位。实时 Linux 开发者和 Google 工程师 Steven Rostedt 表示:“实时性是最坏情况下最快的。”
他的意思是,RTOS 的基本特征在于它的确定性行为。RTOS 保证关键任务将在指定的期限内完成。许多人认为 RTOS 是为快速处理而设计的。其实并非如此。RTOS 的关键不在于速度,而在于可靠性。这种可预测性在时间至关重要的应用中至关重要,例如工业控制系统、医疗设备和航空航天设备。
当今使用的实时操作系统的一个例子是 VxWorks,该系统用于 NASA 的火星探测车引导它们,并在波音 787 梦幻客机中控制航空电子系统,确保飞行控制的实时响应。另一个例子是 QNX Neutrino,它广泛应用于汽车的娱乐信息系统和高级驾驶辅助系统(如防抱死制动系统)。
实时 Linux 的历史
实时 Linux 代码现在已经集成到所有 Linux 发行版中,并将在即将发布的 Linux 6.12 内核中正式发布。这意味着 Linux 将很快出现在更多关键任务设备和工业硬件中。然而,这个过程花了很长时间才实现。
实时 Linux 的故事可以追溯到 1990 年代末,当时对 Linux 支持实时应用程序的需求日益增长。最初的努力集中在创建独立的实时内核,这些内核与 Linux 内核并行运行。这包括一些学术项目,如堪萨斯大学的 KURT、米兰大学的 RTAI 以及新墨西哥矿业技术学院的 RTLinux。
2004 年,资深 Linux 内核开发者 Ingo Molnar 开始收集和重塑这些技术的部分成果,为实时抢占补丁集 PREEMPT_RT 打下基础。
这种方法不同于早期的实时 Linux 解决方案,因为它修改了现有的 Linux 内核,而不是创建一个单独的实时内核。到 2006 年,它已经获得了足够的关注,Linus Torvalds 曾说过:“用 Linux 控制激光是疯狂的,但这里的每个人都有自己疯狂的一面。如果你想用 Linux 控制工业焊接激光器,我对你使用 PREEMPT_RT 没有任何意见。”
到 2009 年,一小群内核开发者,包括 Thomas Gleixner、Peter Zijlstra 和 Rostedt,已经完成了将之前的原型开发整合为一个独立的补丁集。从那时起,许多公司开始使用这一补丁集构建需要毫秒级精度的硬实时系统。
随着项目的推进,其许多元素被逐步引入了内核中。Rostedt 告诉我,说实时功能“现在才进入 Linux”其实并不完全准确。多年来,许多特性已经被引入到主流 Linux 中,其中一些甚至是你每天使用的 Linux 的关键组成部分。
例如,你可能从未听说过 “NO_HZ”——它可以减少空闲系统的功耗。NO_HZ 使 Linux 能够高效地运行在拥有数千个 CPU 的机器上。Rostedt 强调:“你可能没有意识到 Linux 因为实时补丁而获得了多大的改进。Linux 能在今天的数据中心中运行,完全是因为我们做的工作。”
没有 NO_HZ,Linux 就不可能运行几乎所有的数据中心。这也解释了为什么 Linux 能够支撑起云计算。我无法确切知道没有这些实时贡献的世界会是什么样子,但它绝对不会像现在这样。
实时 Linux 还在一些最初从未预想到的领域中发挥了作用。Rostedt 回忆道:“2005 年,我收到一个实时的 bug 报告,我发了一个补丁,并说,‘嘿,这是修复。你能应用它吗?’ 结果对方说,‘我不知道自己在做什么。’我问,‘你不是内核开发者吗?’对方回答,‘我是一个吉他手。’”
原来,他使用了早期的实时补丁,因为他在使用 JACK,一个用于低延迟音频连接的声音服务器。他使用它是因为像大多数音乐家一样,他买不起高端设备,于是,Rostedt 继续说,“他买了一台便宜的笔记本电脑,装了 Linux 和 JACK,因为有了实时补丁,它可以进行高质量录音,而不会在硬盘写入时产生跳帧。”
事实证明,许多音乐家都是早期的实时 Linux 用户,因为它让他们能够廉价地制作高质量录音。谁能想到呢?此外,还有一些实时 Linux 特性已经逐步进入主线内核,其中包括:
为什么实时 Linux 花了这么久?
那么,为什么实时 Linux 直到现在才完全被内核所接纳呢?Rostedt 解释道:“我们实际上不会推送任何我们认为还没有准备好的东西。”几乎每个东西都被重写了至少三次,才会进入主线,因为我们对进入主线的代码有很高的标准。
此外,进入主线的过程不仅仅是技术挑战,还有政治和认知上的问题。Rostedt 回忆道:“一开始,我们甚至不敢提实时,大家都会说,‘哦,我们不关心实时。’”
另一个问题是资金。多年来,实时 Linux 的资金支持一直断断续续。直到 2015 年,Linux 基金会成立了实时 Linux (RTL) 协作项目,旨在协调将 PREEMPT_RT 合并到主线内核的工作。
最后的障碍是重新设计内核的 print_k 函数,这是一个关键的调试工具,最早可追溯到 1991 年。Torvalds 对 printk 特别保护,因为他编写了原始代码,并且至今仍在使用它进行调试。然而,printk 会在 Linux 程序每次调用时引入一个硬性的延迟,而在实时系统中,这种延迟是无法接受的。
Rostedt 解释道:“printk 有成千上万的 hack 处理成千上万种不同的情况。每当我们修改 printk 以执行某些操作时,它都会打破其中的一种情况。printk 的一个伟大之处在于,调试时你可以确切知道一个进程在崩溃时的具体位置。当我对系统进行非常强烈的压力测试时,延迟大约是 30 微秒左右,但突然它会跳到 5 毫秒。”这种延迟就是 printk 消息造成的。
经过大量的工作、许多激烈的讨论以及几次被拒的提案,今年早些时候达成了一个折中方案。Torvalds 很满意,实时 Linux 开发者很满意,printk 的用户也很满意,最终,实时 Linux 成为现实。
经过 20 多年的开发,Linux 的实时补丁终于合并到了主线内核中。这一里程碑标志着内核开发者多年来致力于为 Linux 带来确定性、低延迟性能的工作的顶峰。
随着这一补丁的合并,Linux 内核现在是完全可抢占的,这使得它能够在微秒级别响应事件。这种能力对于需要精确时间控制的应用至关重要,如工业控制系统、机器人和音频制作。
随着实时补丁的合并,Linux 现在准备成为实时操作系统 (RTOS) 领域的重要玩家。这不仅仅是实时制造商的胜利,也是所有 Linux 用户的胜利。