缓冲区的克隆和拷贝

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

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

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值