Linux实时信号处理优化:多线程进程信号延迟削减新方法
《IEEE Embedded Systems Letters》:Real-Time Signaling in Linux for Multi-Threaded Processes
【字体:
大
中
小
】
时间:2025年12月02日
来源:IEEE Embedded Systems Letters 2
编辑推荐:
为解决Linux系统中非致命信号处理延迟影响实时响应的问题,研究人员开展了“实时信号在多线程进程中的传递优化”主题研究。通过提出非置信信号发送器(Unconfident Signal Sender)和置信信号接收器(Confident Signal Receiver)两种新方法,显著降低了信号处理延迟(Odelay),将延迟从20ms降至37μs以内。该研究通过内核模块和内核补丁实现,有效提升了ARINC-653分区调度精度,对嵌入式实时系统开发具有重要意义。
在当今嵌入式系统领域,Linux凭借其开源特性和可定制性,正逐渐成为实时系统的首选操作系统。然而,当开发者尝试在Linux上构建需要高实时性的应用时,一个隐藏的问题逐渐浮现:信号(Signal)处理可能存在致命延迟。信号作为操作系统通知用户进程各种事件的重要机制,被广泛应用于实时中间件和软件平台中,用于调度(通过SIGSTOP和SIGCONT)、定时(通过SIGALRM)和终止(通过SIGTERM)等关键操作。这些应用场景都预设信号具有低开销和低抖动特性,但实际情况却可能令人担忧。
研究人员在实验中发现,Linux系统中非致命信号的处理可能被延迟超过20毫秒,这对于需要微秒级响应的实时系统来说是致命的。这种延迟会严重影响系统对关键事件的实时响应,导致实时系统性能严重下降。问题的根源在于Linux内核的信号处理机制:对于非致命信号,系统默认只设置主线程(即进程中第一个创建的线程)的TIF_SIGPENDING标志,期望由主线程来处理信号。如果主线程没有在CPU上运行或不能被立即调度,信号处理就会被延迟。
为了量化这一问题,研究人员定义了端到端信号开销公式:Oe2e(S)=Osend(S)+Odelay+Orecv(S)+∑i∈P(S)Ohndl(i)。其中Odelay表示识别信号到达所需的时间,由于信号到达的检查方式是无界的,Odelay无法被确定性约束,可能显著增加最坏情况下的Oe2e。因此,减少Odelay并使其更加可预测成为研究的核心目标。
针对这一问题,研究团队深入分析了Linux现有的信号处理机制,并将其命名为"过度置信信号发送器"(Overconfident Signal Sender)。该机制的核心问题在于它过于自信地认为信号发送方知道接收方处理信号的最佳线程,而实际上这种选择可能不是最优的。现有的算法会遍历目标进程的线程列表,尝试选择一个合适的线程来设置TIF_SIGPENDING标志,但如果选中的线程不能及时被调度,信号处理就会延迟。
研究团队提出了两种创新解决方案。第一种称为"非置信信号发送器"(Unconfident Signal Sender),该方法承认发送方不知道接收方处理信号的最佳线程,因此为所有合适的线程设置TIF_SIGPENDING标志,类似于致命信号的处理方式。这种方法通过内核模块实现,修改了系统调用以调用该内核模块。
第二种方案名为"置信信号接收器"(Confident Signal Receiver),让接收方主动决定由哪个线程处理信号。该方法的基本思想是让最快获得CPU的线程处理信号,这可以在信号接收端完成。研究人员通过扩展Linux的进程控制块(task_struct),添加了rt_signal字段作为选项,决定进程是否使用这一特性。该方法通过内核补丁实现。
在技术方法方面,研究人员主要采用了三种关键技术:一是信号处理机制分析技术,深入剖析了Linux内核中信号标记和处理的全过程;二是内核模块开发技术,实现了非置信信号发送器的功能;三是内核补丁开发技术,对Linux内核进行了针对性修改以支持置信信号接收器功能。实验在NVIDIA Jetson Orin Nano Devkit上进行,该设备配备6核Arm CPU,运行Ubuntu 22.04.5和Linux内核版本5.15.122(带有PREEMPT_RT补丁)。
性能评估结果显示,两种提出的方法都能显著降低信号处理延迟。在周期性SIGSTOP信号测试中,传统方法的延迟高达20.89毫秒,而两种新方法的延迟均低于37微秒。在周期性SIGTERM信号测试中,新方法将延迟从9.3毫秒降低到10微秒以内。
研究还分析了信号发送和接收的开销。随着线程数量的增加,非置信信号发送器的发送开销(Osend)迅速上升,因为它需要遍历整个线程列表并为所有线程设置TIF_SIGPENDING标志。而置信信号接收器的接收开销(Orecv)略高(13.97微秒对比11.31微秒),因为它执行了额外的操作。两种方法的Odelay基本上不受线程数量和CPU核心数的影响。
作为案例研究,研究人员分析了基于信号的ARINC-653实现的调度精度。ARINC-653定义了时间和空间分区,以隔离不同实时应用程序之间的运行时环境。Jo等人提出的用户级实现利用SIGSTOP和SIGCONT等信号来管理分区。研究结果显示,使用传统信号方法的分区调度器经常无法准确挂起Yolo v4分区,从而侵占了后续分配给ArduPilot的时间窗口。而两种新提出的信号方法使分区调度器能够准确切换两个分区的时间窗口,调度误差始终接近0%。
研究结论表明,Linux中的非致命信号可能会被显著延迟,从而损害实时响应。这是因为现有的过度置信信号发送器方法无法选择接收进程中处理信号的最佳线程。通过提出的两种信号处理方法,特别是置信信号接收器,可以显著减少信号延迟,且在发送和接收信号方面的额外开销非常小。这项研究不仅解决了Linux实时系统中的具体技术问题,还为嵌入式实时系统的开发提供了重要参考,特别是在航空电子、机器人操作系统和自动驾驶等对实时性要求极高的领域。
研究的创新点在于首次系统性地分析和解决了Linux多线程进程中信号延迟的问题,并提出了两种切实可行的解决方案。这些方案不仅适用于Linux,其设计思路也可以推广到其他实时操作系统中,如NuttX等。未来工作可以进一步优化算法的效率,特别是在多核环境下的扩展性,以及探索在不同实时应用场景中的适用性。
生物通微信公众号
生物通新浪微博
今日动态 |
人才市场 |
新技术专栏 |
中国科学人 |
云展台 |
BioHot |
云讲堂直播 |
会展中心 |
特价专栏 |
技术快讯 |
免费试用
版权所有 生物通
Copyright© eBiotrade.com, All Rights Reserved
联系信箱:
粤ICP备09063491号