在 Linux 中暂停 kthread



here https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/#queuing-disciplines 上面写着:

正如您将从上一篇文章中看到的那样,softirq NET_TX_SOFTIRQ 该函数net_tx_action注册到它。这意味着有 执行net_tx_action的内核线程。该线程偶尔是 暂停,raise_softirq_irqoff恢复它。让我们来看看是什么 net_tx_action这样做,我们就可以理解内核是如何处理的 传输请求。

据记载,kthread偶尔会暂停。当kthread暂停时,为什么?

kthread如何知道要执行的工作?它是否轮询队列?

我认为关于暂停线程的说法更像是一种修辞手法。在这种情况下,暂停的不是kthread,线程工作正常。

与softirq相关的工作主体是__do_softirq()函数。

有许多 softirq 类型,每个 softirq 类型都由位掩码中的一个位表示。每当特定类型的 softirq 有工作时,都会在位掩码中引发相应的位。__do_softirq()从最低有效位开始逐位处理此位掩码,并对设置了该位的每个 softirq 类型执行工作。因此,softirq 类型按优先级顺序进行处理,位 0 表示最高优先级。实际上,如果您查看代码,您将看到位掩码已保存(复制(,然后在处理开始之前清除,并且正在处理的是副本。

每次将新的 skb 提交到内核网络堆栈以发送数据时,都会引发NET_TX_SOFTIRQ的位。这会导致__do_softirq()调用net_tx_action()以获取传出数据。如果没有要发送的数据,则不会提高位。从本质上讲,这就是导致内核softirq线程"暂停"的原因,这只是一种外行方式,说它没有工作,所以没有调用net_tx_action()。一旦有更多数据,当数据提交到内核网络堆栈时,该位就会再次引发。__do_softirq()看到了这一点,再次打电话给net_tx_action()

每个 CPU 上都有一个 softirq 线程。当至少有一个挂起的 softirq 类型时,将运行线程。线程在softirq_threads结构中定义,并在spawn_softirqd()函数中启动。

相关内容

  • 没有找到相关文章

最新更新