什么是零拷贝
参考链接:https://blog.csdn.net/meser88/article/details/108355541
是什么?
零拷贝是指计算机执行IO操作时,减少上下文切换和CPU的拷贝时间。
传统IO的执行流程,包括read和write两个过程,需要进行4次上下文切换和4次拷贝(两次CPU拷贝+两次DMA拷贝),DMA拷贝指的是硬件到内核空间的内核缓冲区数据拷贝。
如何实现?
主要有三种方式: mmap、sendfile、splice
mmap
将内核中的读缓冲区与用户空间的虚拟地址映射到同一个物理地址,所有的IO都在内核完成。
sendfile
在两个文件描述符之间传输数据,在内核中操作。
splice
类似sendfile,允许任意两个文件互相连接且不需要硬件支持
java提供的零拷贝
1、java的NIO
DirectByteBuffer extends MappedByteBuffer
FileChannel transferFrom() 和 transferTo()
2、Netty
网络传输时,将整条消息分了多个数据包,需要将数据包组成完整的消息才能正确处理。CompositeChannelBuffer主要作用是将多个ChannelBuffer组成一个虚拟的ChannelBuffer,并没有真正组合起来只是保存了引用,避免了数据拷贝。
3、Kafka
索引文件使用了mmap+write方式,数据文件使用sendfile方式。