为什么softirq用于高线程和高频率的应用?

是什么使得softirq如此特别,以至于我们将它用于高频率使用,就像networking驱动程序和块驱动程序一样。

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

处理hw中断是最重要的,因为如果处理不快,则会引入过高的延迟,并且用户体验受到影响,或者在中断服务设备之前硬件缓冲区将填满,数据丢失。 不要服务一个网络适配器足够快? 它会覆盖FIFO中的数据,你会丢失数据包。 不要足够快地服务硬盘? 硬盘驱动器阻止排队的读取请求,因为它没有任何结果。

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

这篇文章是关于这个问题的一个体面的参考: https : //lwn.net/Articles/520076/

编辑问题:

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

软件中断有两个地方可以“触发”并抢占当前线程。 其中之一是处理硬件中断的最后阶段; 中断处理程序通常会调用softirqs,因此, 只要硬件中断可以重新启用 ,就有必要对其进行处理(对于延迟和最佳缓存使用)

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

  • 如果需要,可以将它们推送到另一个CPU,从而提高吞吐量。
  • 可以在当前上下文中正确启用hwint后立即对其进行处理,尽可能地保持处理器状态,缩短延迟时间
  • 它们允许硬件中断继续处理,因为这是我们最重要的目标
  • 如果负载过高,他们可以重新安排到ksoftirqd进程,我们需要从正常的用户进程中花费时间。