缓冲区的克隆和拷贝

当同一个缓冲区需要由不同的消费者个被处理时,那些消费者可能修改sk_buff喵舒服的内容,但是内核不需要完全拷贝sk_buff结构和相关联的数据缓冲区。相反,为了提高效率,内核可以克隆原始值,也就是只拷贝sk_buff 结构,然后使用引用计数,以免过早释放共享的数据块,缓冲区的克隆由skb_clone 函数实现。

使用克隆的情况的一个例子就是,当一个输入封包需要传递给多个接收者时,如协议处理例程和一个或者多个网络分流器。

sk_buff 的克隆没有链接到任何表,而且也没有引用套接字的拥有者,skb->cloned 字段在科隆和原油的缓冲区内都置为1,而克隆的skb->users 也置为1.使得第一次尝试删除就能成功,但是,对包含数据的缓冲区的引用书目则会递增,图2-9所示是克隆缓冲区的是一个实例。

skb->

head 头空间

data 数据

tail 尾空间

end

struct sk_buff sk_shinfo

struct skb_shared_info

图2-9 skb_clone函数

skb_clone 函数可以用于检查一个skb缓冲区的克隆状态。

图2-9所示为片段缓冲区的一个实例--也就是说,这个缓冲区有一些数据是存储在一些frags 数组链接起来的数据片段,第二十一章会说明片段缓冲区的用法,目前我们先不理会这些细节。

当一个缓冲区被克隆时,数据区块的内容不能修改,意味着访问该数据的代码不需要上锁机制,然而,当函数不仅需要修改sk_buff结构的内容,而且也需要修改数据时,就必须连数据区块一起克隆,在这种情况下,程序员有两种选择,程序员有两种选择,当他知道只需要修改介于skb->start和skb->end的区域的数据内容时,可以使用pskb_copy只克隆该区域,当他认为可能必须连片段数据区块的内容也跟着修改时,就必须使用skb_copy, pskb_copy 和skb_copy的结果如图2-10所示,在第二十一章可以看到,skb_shared_info数据结构也可以包括一个sk_buff 结构列表,pskb_copy和skb_copy处理该列表的方式和frags数组的处理方式相同。

此时,可能还无法理解图2-9和图2-10所有细节,到了本书以后的章节,特别是读第五部分之后,一切都会更有意义。

讨论本书的各项主题时,有些时候我会强调给定的函数必须克隆或者拷贝一个缓冲区。决定做一个缓冲区的克隆或者拷贝时,每个子系统的程序员无法预测其他内核组建是否需要该缓冲区内的原有数据,内核是非常模块化的,而且以非常动态而无法预测的方式改变,所以,每个子系统对其他子系统会对一个缓冲区做些什么都是未知的,因此,每个子系统的程序员只需要记录其对该缓冲区所做的任何修改,而且在修改任何东西前先做个拷贝,以免内核其他部分需要原有的信息。

相关推荐
光电的一只菜鸡3 小时前
ubuntu之坑(二十)——VMware虚拟机系统无法正常进入如何处理
linux·运维·ubuntu
MC皮蛋侠客3 小时前
DNP3 系列(十二):测试与工具链——模拟器、Wireshark 与一致性测试
网络·wireshark·dnp3
你住过的屋檐5 小时前
【Nginx】linux上安装nginx
linux·运维·nginx
宵时待雨5 小时前
linux笔记归纳17:传输层协议UDP
linux·笔记·udp
观测云5 小时前
Fastjson 高危 RCE(CVE-2026-16723):如何用观测云快速发现并完成修复
网络·安全·可观测性·观测云
大模型码小白5 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
晓晓_za8986686 小时前
开源 GEO 优化源码二次开发:贴牌改造与业务模块扩展实践
java·运维·服务器·开发语言·性能优化·开源
SCandL1526 小时前
k8s service
linux·容器·kubernetes
楷哥爱开发7 小时前
TikTok Shop新加坡本土店入驻:如何选择新加坡本土住宅IP?
网络·网络协议·tcp/ip
云贝教育-郑老师7 小时前
【麒麟服务器系统交付:一个DBA的六年信创实战笔记】
服务器·笔记·dba