是什么让softirq如此特别,以至于我们将其用于高频用途。,比如网络驱动程序和块驱动程序。
SoftIrqs通常用于从已处理的中断中完成排队工作,因为它们非常适合这一需求-它们以第二高优先级运行,但仍然在启用硬件中断的情况下运行。
处理硬件中断是最优先的,因为如果不快速处理它们,那么要么会引入过高的延迟并影响用户体验,要么硬件缓冲区会在中断为设备提供服务之前填满,数据会丢失。网络适配器的维修速度不够快吗?它会覆盖fifo中的数据,你会丢失数据包。硬盘的维修速度不够快?硬盘驱动器暂停排队的读取请求,因为它无处放置结果。
SoftIrqs允许服务硬件中断的关键部分尽可能短;不必当场处理整个hw中断,而是将重要数据从设备中读取到RAM或其他存储器中,然后启动SoftIrq来完成工作。这样可以在最短的时间内禁用硬件中断,同时仍然以高优先级完成工作。
这篇文章是关于这个问题的一个不错的参考:https://lwn.net/Articles/520076/
问题编辑:
SoftIrq是可重新进入的-它们可以在任何cpu上处理。从我链接的文章:
软件中断有两个地方可以"激发"和抢占当前线程。其中一个正在处理硬件中断;中断处理程序通常会引发softirqs,因此(对于延迟和最佳缓存使用)一旦硬件中断可以重新启用,就立即处理它们
添加了强调。它们可以内联处理——我相信这意味着它们可以在不引起上下文切换的情况下进行处理,这意味着一旦启用硬件中断,我们就可以直接跳到SoftIrq,尽可能少地滥用CPU缓存。所有这些都有助于SoftIrqs重量轻但灵活,这使它们成为高频处理的理想选择。
- 如果需要,可以将它们推送到另一个CPU,从而提高吞吐量
- 它们可以在当前上下文中启用hwint后立即进行处理,尽可能地保持处理器状态,提高延迟
- 它们允许硬件中断继续处理,因为这是我们最重要的目标
- 如果负载太高,并且我们需要从正常用户进程中抽出时间,则可以将它们重新安排到ksoftirqd进程