缓冲区的克隆和拷贝

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

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

相关推荐
小辰记事本6 小时前
从零读懂RoCEv2数据包构造:从WQE到线缆上的完整旅程
服务器·网络·网络协议·rdma
小鹏linux7 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
北京耐用通信7 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
在角落发呆7 小时前
Linux转发配置:解锁网络互联的核心密码
linux·运维·网络
齐潇宇8 小时前
Zabbix 7 概述与配置
linux·zabbix·监控告警
江公望9 小时前
Ubuntu htop命令,10分钟讲清楚
linux·服务器
哎呦,帅小伙哦9 小时前
Linux 时间:从原子钟到 clock_gettime 的每一面
linux·运维·服务器
张小姐的猫9 小时前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
YMWM_10 小时前
UDP协议详解:从原理到Python实践
网络·网络协议·udp
pengyi87101510 小时前
共享 IP 与独享 IP 怎么选?被封后升级方案避坑
网络·网络协议·tcp/ip