返回

Linux preempt_rt补丁如何影响软中断处理?

Linux

Linux 内核抢占式实时补丁下 Softirq 处理机制探究

在研究 Linux 内核 preempt_rt 补丁时,我遇到一个有趣的现象:irq_forced_thread_fn 函数竟然被执行了。以网卡为例,我观察到它调用了网卡驱动注册的中断处理函数,最终依次执行了 napi_schedule___napi_schedule。奇怪的是,在这个过程中,我并没有找到软中断被执行的时机。深入代码后发现,____napi_schedule 仅使用了 __raise_softirq_irqoff 来标记软中断,似乎并没有真正执行软中断处理函数。

这引发了我的思考:软中断究竟是在何时何地被执行的呢?一些书籍提到 ksoftirqd 线程负责处理软中断,但这些书籍的内核并没有打上 preempt_rt 补丁。难道 preempt_rt 补丁对软中断的处理机制进行了改动?

preempt_rt 补丁对软中断的影响

为了解开这些谜团,我们需要深入分析 preempt_rt 补丁对 Linux 内核的影响。

preempt_rt 补丁的目标是提高 Linux 内核的实时性,其核心是降低中断延迟。它对中断处理机制进行了重大调整,将传统的中断处理函数转变为可抢占的线程。

在未打补丁的内核中,软中断通常在硬中断处理函数返回之前被执行。preempt_rt 补丁改变了这一行为。由于硬中断处理函数变成了可抢占的线程,为了避免线程切换开销,软中断的执行被延迟到硬中断线程退出后。

ksoftirqd 线程与软中断处理

延迟执行的软中断是如何被处理的呢?答案就在 ksoftirqd 线程。

ksoftirqd 线程是一个特殊的内核线程,专门负责执行软中断处理函数。当硬中断线程退出后,内核会唤醒 ksoftirqd 线程,使其开始执行被标记的软中断。

ksoftirqd 线程以循环的方式工作:它会检查是否有需要处理的软中断,如果有,则调用相应的软中断处理函数进行处理;如果没有,则进入睡眠状态,等待被唤醒。

软中断执行流程解析

结合以上分析,我们可以梳理出 preempt_rt 补丁下软中断的执行流程:

  1. 硬件设备触发中断请求。
  2. 内核将中断请求转换为硬中断线程。
  3. 硬中断线程执行中断处理函数。
  4. 中断处理函数调用 __raise_softirq_irqoff 标记软中断。
  5. 硬中断线程退出,唤醒 ksoftirqd 线程。
  6. ksoftirqd 线程检查到被标记的软中断。
  7. ksoftirqd 线程执行相应的软中断处理函数。

总结

preempt_rt 补丁通过将硬中断处理函数转化为线程,并延迟执行软中断,有效降低了中断延迟,提高了内核的实时性。ksoftirqd 线程作为软中断处理的核心机制,在保证系统实时性的同时,也兼顾了性能和效率。

常见问题

  1. 为什么 preempt_rt 补丁要将硬中断处理函数转化为线程?

    将硬中断处理函数转化为线程可以使其被抢占,从而避免高优先级任务被低优先级中断阻塞,进而降低中断延迟,提高系统实时性。

  2. 为什么 preempt_rt 补丁下软中断的执行会被延迟?

    在硬中断处理函数中执行软中断会导致线程切换开销,降低系统性能。preempt_rt 补丁将软中断延迟到硬中断线程退出后执行,可以减少线程切换次数,提高系统效率。

  3. ksoftirqd 线程是如何被唤醒的?

    当有软中断需要处理时,内核会使用 wake_up_process 函数唤醒 ksoftirqd 线程。

  4. ksoftirqd 线程的优先级是怎样的?

    ksoftirqd 线程的优先级高于普通线程,但低于硬中断线程。

  5. preempt_rt 补丁对系统性能有什么影响?

    preempt_rt 补丁在提高系统实时性的同时,也会带来一定的性能损耗。这是因为线程切换和同步机制会增加系统开销。