缓冲区的克隆和拷贝

同一个缓冲区需要不同消费者个被处理那些消费者可能修改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->startskb->end区域数据内容可以使用pskb_copy克隆区域认为可能必须连片数据区块内容跟着修改就必须使用skb_copy, pskb_copy skb_copy结果如图2-10所示二十一可以看到skb_shared_info数据结构也可以包括一个sk_buff 结构列表pskb_copyskb_copy处理列表方式frags数组处理方式相同

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

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

相关推荐

  1. 拷贝拷贝(js问题)

    2024-04-09 12:32:01       61 阅读
  2. js中浅拷贝拷贝区别

    2024-04-09 12:32:01       59 阅读
  3. js中浅拷贝拷贝区别

    2024-04-09 12:32:01       61 阅读
  4. 说说Python中拷贝拷贝

    2024-04-09 12:32:01       62 阅读
  5. python中拷贝拷贝

    2024-04-09 12:32:01       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 12:32:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 12:32:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 12:32:01       87 阅读
  4. Python语言-面向对象

    2024-04-09 12:32:01       96 阅读

热门阅读

  1. Ubuntu22.04 安装 Supabase

    2024-04-09 12:32:01       35 阅读
  2. 【力扣】238. 除自身以外数组的乘积

    2024-04-09 12:32:01       42 阅读
  3. npm的一些经常使用的命令

    2024-04-09 12:32:01       38 阅读
  4. CSS变换

    CSS变换

    2024-04-09 12:32:01      33 阅读
  5. 7.网络编程-安全

    2024-04-09 12:32:01       36 阅读
  6. Ubuntu安装Opencv + opencv_contrib(v4.9.0)

    2024-04-09 12:32:01       37 阅读
  7. node.js常用命令

    2024-04-09 12:32:01       28 阅读
  8. 在 Linux 上使用 Git LFS

    2024-04-09 12:32:01       31 阅读