zero-copy

引言
C10K problem提到一种zero-copy的技术,可以提高网络的吞吐量,分布式消息队列kafka中在消费者消费消息的时候根据offset进行zero-copy。linux下的zero-copy通过sendfile API实现。

什么是zero-copy
zero-copy在概念上是值操作系统避免了内存之间的来回拷贝开销,从使用角度来看,通常是发送网络文件时,文件加载到内核空间后直接发送到网络,避免了内核空间和用户空间的拷贝开销。

linux下的发送文件至网络的传统方式

 

1.从硬件读取文件到内核缓冲区
2.从内核缓冲区拷贝到用户缓冲区
3.从用户缓冲区拷贝到socket的缓冲区
4.从socket的缓冲区拷贝到网络驱动中发送
这中间有两次不必要的开销,2和3的cpu copy开销。
linux的sendfile

 

1.从硬件读取到内核缓冲区
2.从内核缓冲区拷贝到socket缓冲区
3.从socket缓冲区拷贝到网络驱动发送
与传统方式相比,减少了内核和用户态的来回拷贝,但还是有一个多余的操作,内核缓冲区到socket缓冲区的拷贝。
改进后的sendfile

 

1.从硬件直接拷贝到内核缓冲区
2.socket缓冲区记录待发送的字节和偏移量
3.从内核缓冲区直接拷贝到网卡驱动发送
这个版本改进了内核缓冲区和socket缓冲区的拷贝,socket缓冲区只记录了偏移量和字节,减少了一次cpu拷贝。
end
所谓的零拷贝并不是完全没有拷贝,最后优化的版本还是有两次拷贝,但避免了用户和内核的不必要交互,减少cpu拷贝的直接好处就是提高了cpu的利用率。

转载于:https://www.cnblogs.com/learn-my-life/p/5636397.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值