kafka 底层采用的零copy技术,前两节是铺垫。
仅实现两次上下文(即内核态和用户态之间的切换),而且只需要两次拷贝即可。是基于sendFile()实现的。
总结:
- 这种零拷贝技术 使用了两次内核态和用户态的之间的切换,依然使用了三次copy。
- 数据不经过用户缓冲区;
从Linux2.4内核开始,对sendFile()进行改进,引入了gather,减少一次CPU的拷贝。
------------------------------------------------------------------------------------------------------------------------------------------
总结:
- 使用了两次 拷贝 一次DMA拷贝,一次DMA Gather copy ;用户态和内核态的切换;
- 数据不经过用户缓冲区;
- 未用到CPU拷贝;Kafka是基于transform函数实现,这个函数的底层就是上述;
原理:
- sendfile 改进之处就是 不需要将数据拷贝到 Socket缓冲区,仅仅将内存地址和内存偏移量拷贝到Socket缓冲区;
- DMA Gather copy 将pageCache数据打包发送到网卡设备上;
- 零拷贝 其实是指没有CPU的拷贝;
- Kafka 使用的是destChannel.transForm(channel,position,count);