我正在阅读Linux内核的源代码,试图弄清楚Linux内核如何发送网络数据包,经过几个小时,我只能看到网络数据包流经TCP层,IP层,最后是数据链路层,我可以'找出哪些线程在做这些工作 .
我的问题是哪些内核线程负责发送网络数据包,它们在哪里? (因为我们可以将套接字设置为非阻塞并让用户应用程序尽可能快地发送网络数据包,所以当网络繁忙时,必须有一些队列来缓冲这些数据包,并且必须有一些内核线程在某个地方运行发送这些数据包 . )
默认情况下,内核不使用线程来发送网络数据包 .
良好的网络芯片管理硬件中的数据包队列 . 更便宜的芯片具有固定长度的队列或根本没有队列,并且在发送分组时引发中断;然后,内核将中断处理程序从其自己的队列中排队或提交下一个数据包 .
对此的softirq称为 NET_TX_SOFTIRQ (参见 net/core/dev.c ) . 如果内核负载过重或配置为将工作移出中断, ksoftirq/* 线程将处理softirqs .
NET_TX_SOFTIRQ
net/core/dev.c
ksoftirq/*
1 回答
默认情况下,内核不使用线程来发送网络数据包 .
良好的网络芯片管理硬件中的数据包队列 . 更便宜的芯片具有固定长度的队列或根本没有队列,并且在发送分组时引发中断;然后,内核将中断处理程序从其自己的队列中排队或提交下一个数据包 .
对此的softirq称为
NET_TX_SOFTIRQ
(参见net/core/dev.c
) . 如果内核负载过重或配置为将工作移出中断,ksoftirq/*
线程将处理softirqs .