Netty零拷贝分别用到了
- 直接内存
- Linux零拷贝
- Netty内部CompositeByteBuf
三个技术点,本篇文章分别介绍这三种实现方案。
1 直接内存
同行靠衬托,同样都是通过Socket发送数据,先看下Java BIO在网络编程方面,数据的复制情况。
1.1 Java BIO
先看下流程图
1.2 Netty NIO
1.3 对比
通过对比可看出,Netty NIO相比于Java BIO,减少了一次从【JVM堆内存】到【直接内存】的拷贝,这就是零拷贝的一种实现方式。
1.4 为什么要使用直接内存
看一下周志明老师的解释
【直接内存】属于内核态,可以直接向同属于内核态的Socket buffer中写入数据。
2 Linux零拷贝
正常情况下,一个应用程序想要发送本地数据到网络中的流程如下
但是应用程序在以上的过程中,并不需要再对数据进行修改,那么将数据从read buffer拷贝到用户态内存这一步,其实只是在白白的浪费CPU和内存空间。
所以为了解决这种浪费的情况,Linux提出了零拷贝的改进方案,当不需要对数据进行修改时,直接在内核态完成数据传输到硬件buffer的工作
Netty 文件传输 DefaultFileRegion 通过 transferTo 方法将文件发送到目标 Channel ,此方法的原理就是此模型。
3 使用CompositeByteBuf
CompositeByteBuf将多个ByteBuf进行逻辑上的拼接,避免了物理空间上的复制,节省了复制带来的性能损耗。
看下其中增加一个ByteBuf的逻辑