缓冲区的克隆和拷贝

当同一个缓冲区需要由不同的消费者个被处理时,那些消费者可能修改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所有细节,到了本书以后的章节,特别是读第五部分之后,一切都会更有意义。

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

相关推荐
网硕互联的小客服21 分钟前
如何解决 Linux 文件系统挂载失败的问题?
linux·服务器·前端·网络·chrome
门思科技27 分钟前
主流 LoRaWAN 网络服务器深度对比:ThinkLink、TTS、ChirpStack、Loriot 与 Actility 选型指南
运维·服务器·网络
网安小白的进阶之路4 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-6
网络·安全·web安全
大聪明-PLUS6 小时前
如何使用 Docker 打包一个简单的应用程序:简易指南
linux·嵌入式·arm·smarc
深耕AI7 小时前
【完整教程】宝塔面板FTP配置与FileZilla连接服务器
运维·服务器
serve the people8 小时前
Prompts for Chat Models in LangChain
java·linux·langchain
李昊哲小课8 小时前
Ubuntu 24.04 MariaDB 完整安装与配置文档
linux·ubuntu·mariadb
无聊的小坏坏9 小时前
从单 Reactor 线程池到 OneThreadOneLoop:高性能网络模型的演进
服务器·网络·一个线程一个事件循环
AI智域边界 - Alvin Cho9 小时前
Bloomberg、LSEG 与 MCP 缺口:为什么尚未发布完整的 MCP 服务器,以及多智能体系统如何解決这问题
运维·服务器
还下着雨ZG9 小时前
TCP/IP协议族详细介绍
网络·网络协议·tcp/ip·计算机网络