零拷贝技术概述
- 定义:一种减少数据拷贝和上下文切换的技术,用于提升IO传输性能。
- 原因:传统IO操作需要在用户态和内核态之间多次拷贝数据和切换上下文,这增加了时间成本。
用户态与内核态
- 用户态:应用程序运行环境,只能访问受限资源。
- 内核态:操作系统内核运行环境,具有高权限,能直接访问硬件和底层资源。
DMA技术
- 定义:直接内存访问,允许内存和外设之间直接传输数据,减少CPU参与。
Linux零拷贝技术
- MMap:将文件映射到进程地址空间,减少数据拷贝次数。
- sendFile:将文件数据直接从内核空间传输到网络套接字,减少CPU上下文切换和内存复制。
Netty零拷贝技术
- 实现方式:通过优化用户态操作提升IO执行速度。
- 技术手段:
- 堆外内存:避免JVM堆内存与堆外内存之间的数据拷贝。
- CompositeByteBuf:合并多个Buffer对象,避免内存拷贝。
- Unpooled.wrappedBuffer:将不同数据源包装成ByteBuf,无数据拷贝。
- ByteBuf.slice:将ByteBuf切分为共享底层存储的多个对象,避免拷贝。
- FileRegion:封装FileChannel#transferTo(),实现操作系统级别的零拷贝。
Netty零拷贝技术具体实现
- 堆外内存:使用堆外内存避免JVM内存拷贝。
- CompositeByteBuf:通过addComponents()方法合并ByteBuf,复用底层byte数组。
- Unpooled.wrappedBuffer:包装不同数据源为共享底层byte数组的ByteBuf。
- ByteBuf.slice:切分ByteBuf,共享底层存储,避免数据拷贝。
- FileRegion:使用DefaultFileRegion实现文件传输,避免数据拷贝。
使用案例
- DefaultFileRegion:通过Netty的ChannelHandlerContext直接写入文件内容到NioSocketChannel,实现零拷贝文件传输。