LWN:实时抢占真的快要完工了!

关注了就能看到更多这么棒的文章哦~

The real realtime preemption end game

By Jonathan Corbet
November 16, 2023
LPC
ChatGPT translation
https://lwn.net/Articles/951337/

Linux 实时性支持的加入是一个漫长的故事;它首次在 2004 年的 LWN 文章中亮相。在很长一段时间里,似乎只需一点努力就能达到终点线;因此,我们在 2009 年的标题中使用了“实时抢占的最终目标”。在 2023 年的 Linux Plumbers Conference 上,Thomas Gleixner 告诉与会者,如今,终点确实近在咫尺。只是在此之前还有一个大问题需要解决,然后所有这项工作才能融入主干。

实时抢占(realtime preemption)的目的是确保最高优先级的进程始终能够以最小(且可预测的)延迟来运行。为此,它使内核在尽可能多的情况下可抢占,只有在特定情况下才例外。这项工作的基本机制早已确立,但在这个过程中仍有许多细节需要解决。多年来,实时抢占的工作导致了核心内核代码的大规模重写,其好处远远超出了实时性应用的范畴。

6da666741844faedcea171232e5670f1.png

Gleixner 开场时指出,尽管实时抢占项目已经进行了近 20 年,但对他来说实际上已接近 25 年——他于 1999 年开始为 Linux 开发实时支持。等到完成的时候,他表示会举办一场 "盛大的派对"。现在是时候了吗?他的回答是 "是的——在某种程度上"。只有一个最后的问题需要解决:printk()。

每当内核中的代码需要向系统控制台和日志发送信息时,它都会调用 printk()或基于它的众多函数。也许有人认为打印一条消息不是一项具有挑战性的任务,但事实并非如此。printk()的调用可以来自任何上下文,包括不可屏蔽中断处理程序或其他 printk()调用。由于打印的信息可能至关重要,尤其是在系统崩溃的情况下,因此 printk()调用必须在任何上下文中都能正常工作。因此,存在许多并发和锁互斥问题,以及许多跟驱动程序相关的复杂性。

Gleixner 表示,在当前内核中,printk()是完全同步的;对它的调用在消息被发送到所有配置的目的地之前都不会返回。这是 "愚蠢的";大部分打印的内容只是噪音,尤其是在引导过程中,等待所有内容都被发送出去是没有意义的。除了毫无意义之外,等待还会引入延迟,与实时工作的目标相悖,因此实时开发人员早就将 printk()输出移入了单独的线程,使其异步化。然而,这段代码只是一堆 hack 而不是真正的解决方案。必须更好地解决这个问题,以使这项工作对内核的其余部分更有用。

自 2018 年以来,printk() 问题一直受到认真对待,引出了约 300 个相关补丁,这些补丁要么已经进入上游,要么正在等待进入 linux-next;有时已经在 LWN 报道过。他表示,目前有三个最终的补丁系列正在进行中,以完成这项工作。一些棘手的细节仍在处理中。其中之一是移交(handover)机制;如果内核有一条紧急消息要发布(例如,它要 crash 了),它可能需要控制当前正在打印较低优先级消息的控制台。如何在任何上下文中都能确保执行这个操作,这并不容易。

另一个正在进行的任务是把那些在某些上下文中不能安全使用的控制台驱动程序给标记出来;例如,在不可屏蔽中断期间输出消息时如果需要进行视频模式(video-mode)设置,这完全是不合理的。

Gleixner 在他的演讲准备部分结束时表示,尽管已经非常接近完工了,但不要问他具体什么时候能完成。printk() 是不可预测的,他甚至不再愿意尝试去解决这个问题。尽管如此,他对其余的实时抢占代码在 2024 年末的 20 周年纪念日之前合入主线还是抱有希望的。

347a64d8ded413cf4d514a31ffcaa10c.png

John Ogness

一个观众问,在过去的一年中 printk()代码是否有任何有趣的变化;Gleixner 回答说没有根本性概念上的变化。大部分 printk()工作都由 John Ogness 完成,他表示移交代码已经减少了一些,但仍需努力;内核中有 76 个控制台驱动程序需要修复,可能需要一些时间才能全部完成。移交代码已经更改成允许逐个去更新驱动程序,而不是要求一次完成所有工作。 (有关最近 printk()工作的更多讨论,请参见相关文章)。

Masami Hiramatsu 问哪些内核消息需要采用同步方式打印输出;Gleixner 回答几乎所有东西都应该异步进行。除了减少与 printk()调用相关的延迟之外,异步输出还可以为每个控制台创建单独的内核线程,让更快的控制台以全速运行,而不必等待最慢的控制台。他还说,代码已更改成可以确保在第一行输出之前将重要消息完全复制到消息缓冲区,以防一个有问题的控制台驱动程序使得整个系统崩溃。通过首先写入已知安全的控制台,可以提高可靠性。例如,如果有可持久化存储(persistent-memory store)可供使用的话,那么久在发送到物理设备之前先将消息放在那里,这样就能在有问题的驱动程序导致系统崩溃之前多一个输出备份。

随着会议的结束,Clark Williams 问,一旦 printk()补丁推到上游之后,Gleixner 是否会尝试在同一合并窗口中推送其余的实时代码(在本次会议中未讨论)。回答是有条件的 "是";如果所有代码都在 linux-next 中分阶段准备就绪,他可能会尝试推送其余的实时代码。

[感谢 Linux Foundation,LWN 的旅行赞助商,支持我们参加此次活动。]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值