14

是什么让 softirq 如此特别,以至于我们将它用于高频用途,例如在网络驱动程序和块驱动程序中。

4

1 回答 1

23

SoftIrqs 通常用于从已处理的中断中完成排队工作,因为它们非常适合这种需求——它们以第二高的优先级运行,但仍然在启用硬件中断的情况下运行。

处理硬件中断是重中之重,因为如果处理不快,要么会引入太高的延迟,影响用户体验,要么在中断服务设备之前硬件缓冲区会填满,导致数据丢失。服务网络适配器的速度不够快?它会覆盖fifo中的数据,你会丢失数据包。维修硬盘的速度不够快?硬盘驱动器停止排队的读取请求,因为它无处放置结果。

SoftIrqs 允许服务硬件中断的关键部分尽可能短;不必在现场处理整个硬件中断,而是将重要数据从设备读取到 RAM 或其他位置,然后启动 SoftIrq 以完成工作。这可以在最短的时间内保持禁用硬件中断,同时仍以高优先级完成工作。

这篇文章是关于此事的不错参考: https ://lwn.net/Articles/520076/

问题编辑:

SoftIrq 是可重入的——它们可以在任何 CPU 上处理。从我链接的文章中:

有两个地方软件中断可以“触发”并抢占当前线程。其中之一是在硬件中断处理结束时;中断处理程序引发软中断是很常见的,因此一旦可以重新启用硬件中断,就立即处理它们是有意义的(对于延迟和优化缓存使用)

重点补充。它们可以内联处理——我相信这意味着它们可以在不引起上下文切换的情况下进行处理,这意味着一旦启用硬件中断,我们就可以直接跳转到我们所在的 SoftIrq,尽可能少地滥用 CPU 缓存。所有这些都有助于 SoftIrqs 轻巧但灵活,这使其成为高频处理的理想选择。

  • 如果需要,可以将它们推送到另一个 CPU,从而提高吞吐量。
  • 可以在当前上下文中启用 hwint 后立即处理它们,尽可能保留处理器状态,改善延迟
  • 它们允许硬件中断继续处理,因为这是我们最重要的目标
  • 如果负载太高,我们可以将它们重新调度到 ksoftirqd 进程,我们需要从正常的用户进程中抽出时间。
于 2014-01-02T17:23:42.813 回答