什么是零拷贝
是一种数据传输技术,通过减少CPU和内存之间的数据复制次数来提高数据传输的效率和性能。利用到了PageCache技术
为什么需要零拷贝
在传统方式下,数据的传输方式通常会从磁盘或网络缓冲中读取到内存,再从内存复制到磁盘或网络缓存中。在此期间,会造成大量的CPU开销。
为了避免这些问题,操作系统通过DMA(直接内存访问)功能,可以将数据直接从磁盘或网络缓存传输到对应的磁盘控制器或网卡设备上,避免较频繁的上下文切换和数据复制。
如何实现零拷贝
- mmap + write
- sendfile
mmap + write:
通过虚拟内存将内核空间和用户空间的虚拟地址映射到同一个物理地址,从而减少数据拷贝次数
sendfile
直接在内核中实现数据的拷贝操作,减少了CPU上下文切换的次数
sendfile+DMA scatter/gather 实现的零拷贝
直接把内核缓冲区(PageCache)的数据读取到网卡中!
ps: 零拷贝不适合大文件的传输,使用异步I/O和直接I/O传输!
Java NIO和Netty提供的方法
-
slice:对ByteBuf进行切割,但没有发送内存复制
-
-
duplicate:截取ByteBuf所有内容,共用同一块物理内存
-
CompositeByteBuf:将多个ByteBuf逻辑组成为一个ByteBuf,不发生内存拷贝