sk_buff(SKB)如何拥有多个用户?

时间:2014-05-07 04:06:16

标签: linux tcp linux-kernel

我遇到过skb->用户拥有使用此特定缓冲区的实体数量。

但由于SKB属于特定套接字并且对应于特定进程,它如何拥有多个用户?

2 个答案:

答案 0 :(得分:2)

sk_buffs通常代表网络数据包。它们可以通过特定进程写入特定套接字而生成,但它们也可以以其他方式存在。

例如,当从网络设备接收到数据包时,它将被放置在sk_buff中。当它被传递到堆栈时,它可以由各种模块和层(IP,ARP,UDP / TCP以及诸如“tap”设备之类的东西)处理。其中一些模块可能需要对不是瞬时的数据包执行某些操作(例如:在分接设备上重新传输)。当然,数据包中的数据也可能会传送到从套接字读取的进程。

需要处理数据包数据的组件当然可以简单地创建数据包缓冲区的副本,但如果没有其他组件可以修改它,那将是浪费。因此,增加用户数量允许模块对数据包进行“保持”以使其不被释放 - 因此底层内存不会被重新用于其他目的 - 只要模块仍然需要它。当sk_buff的用户逐个完成使用时,他们会减少用户数量,当它变为零时然后释放内存。

答案 1 :(得分:0)

通常情况下,在单核机器的情况下,您只能拥有一个用户"在任何时候使用网络缓冲区,这个"用户"指的是linux网络基础设施中的不同部分或功能。它们不能同时运行,所以这个"用户"引用计数没用,我猜测没用过。

但是在SMP机器中,不同的CPU可以同时运行内核的不同部分,并同时读取网络缓冲区,这个引用计数变得很重要。当它仍然在使用时,您不希望修改它,而是系统的另一部分,或者将其释放。但是对于只读操作,它可以是并发的,因此该引用计数用于计算" user"的数量。 (或内核中的区域),使用网络缓冲区。