Netty零拷贝

Netty零拷贝分别用到了

  1. 直接内存
  2. Linux零拷贝
  3. Netty内部CompositeByteBuf

三个技术点,本篇文章分别介绍这三种实现方案。

1 直接内存

同行靠衬托,同样都是通过Socket发送数据,先看下Java BIO在网络编程方面,数据的复制情况。

1.1 Java BIO

先看下流程图


Netty零拷贝_第1张图片
java BIO

1.2 Netty NIO

Netty零拷贝_第2张图片
Netty NIO

1.3 对比

通过对比可看出,Netty NIO相比于Java BIO,减少了一次从【JVM堆内存】到【直接内存】的拷贝,这就是零拷贝的一种实现方式。

1.4 为什么要使用直接内存

看一下周志明老师的解释


【直接内存】属于内核态,可以直接向同属于内核态的Socket buffer中写入数据

2 Linux零拷贝

正常情况下,一个应用程序想要发送本地数据到网络中的流程如下


Netty零拷贝_第3张图片

但是应用程序在以上的过程中,并不需要再对数据进行修改,那么将数据从read buffer拷贝到用户态内存这一步,其实只是在白白的浪费CPU和内存空间
所以为了解决这种浪费的情况,Linux提出了零拷贝的改进方案,当不需要对数据进行修改时,直接在内核态完成数据传输到硬件buffer的工作

Netty零拷贝_第4张图片

Netty 文件传输 DefaultFileRegion 通过 transferTo 方法将文件发送到目标 Channel ,此方法的原理就是此模型。

3 使用CompositeByteBuf

CompositeByteBuf将多个ByteBuf进行逻辑上的拼接,避免了物理空间上的复制,节省了复制带来的性能损耗。
看下其中增加一个ByteBuf的逻辑


Netty零拷贝_第5张图片
插入逻辑

参考

JVM源码分析之堆外内存(直接内存)
Linux 中的零拷贝技术-IBM
Netty中的零拷贝

你可能感兴趣的:(Netty零拷贝)