前中电技术总监带你了解,什么是零拷贝,Netty是如何实现的?

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 呢作为一个高性能的网络通信框架,被越来越多互联网公司关注和重视。最近,有小伙伴在面试过程中被问到Netty是如何实现零拷贝的问题?,今天,我给大家来聊一聊。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。

呢作为一个高性能的网络通信框架,被越来越多互联网公司关注和重视。最近,有小伙伴在面试过程中被问到Netty是如何实现零拷贝的问题?,今天,我给大家来聊一聊。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。

我们先来看什么是零拷贝?

1、什么零拷贝

在计算机中,完成数据传输,要么是通过网络,要么就是通过本地磁盘。通常完成一次完整I/O交互流程分为两阶段,首先拷贝到系统内核空间,由操作系统来完成;紧接着要拷贝到用户空间,这个由应用程序来完成,具体交互流程如下图所示。

0428b32fba10c3ee079edbd31205fb86.png

那什么是零拷贝呢?顾名思义,零拷贝的意思包括两个部分,“零”和“拷贝”:

61e422b6b2a69ba7f3533d63d9f82a55.png

“拷贝”:就是指数据从一个存储区域转移到另一个存储区域。

“零” :表示次数为0,它表示拷贝数据的次数为0。

合起来“零拷贝”就是不需要将数据从一个存储区域复制到另一个存储区域。

2、为什么要零拷贝

零拷贝主要是指将系统内核空间的内存和用户空间的内存实现直接关联映射,从而省去了数据传输过程中的来回拷贝,也就是说,要完成数据传输数据拷贝次数为0次。

有这么一段代码,主要将服务端主机磁盘中的文件从已连接的socket发出去。关键实现代码如下:

while((n = read(diskfd, buf, BUF_SIZE)) > 0){
    write(sockfd, buf , n);
}

348256e729fbba47893896e35eb021f8.png

以上代码是用传统的IO编写的,它的执行过程大致是这样的:

首先,read()方法,会把数据从磁盘循环读取到内核缓冲区,再拷贝到用户缓冲区。

然后,write()方法先把数据写入到socket缓冲区,最后写入网卡设备。

因为,传统的IO在在数据传输过程中拷贝次数太多,导致性能低下。为了减少拷贝次数,增加系统性能,才有了零拷贝的设计。另外,零拷贝并不是指完全没有文件的拷贝,只是减少了拷贝的次数。

3、零拷贝在Netty中的实现

从流程图可以看出,传统IO的读写流程,包括了4次用户态和内核态的切换,也就是4次上下文切换,4次数据拷贝,其中两次CPU拷贝以及两次的DMA拷贝。关于上下文切换和DMA拷贝,在这里我们就不详细赘述了,以后可以单独拍摄一期视频来详细介绍。想了解的小伙伴可以在评论区回复666.

那在Netty中,是如何实现零拷贝的呢?有以下三种方式

1. 使用堆外内存,也叫直接内存。Netty的接收和发送都采用DIRECT BUFFERS,对应系统底层的mmap机制,直接使用堆外内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。

46583fbe8dcee09b83396b6e51080fea.png

2.     提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户只需要像操作一个Buffer一样方便的对组合Buffer进行操作,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer,不需要做内存拷贝。

0c8362415eaf2301c12d640cba2a981b.png

3.  的文件传输采用了transferTo方法,直接使用了NIO的sendfile机制,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。

b954d09f2fc7c479c44800809f614415.png

我是被编程耽误的文艺Tom,如果我的分享对你有帮助,请动动手指一键三连分享给更多的人。关注我,面试不再难!

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
1月前
|
Java Unix Linux
【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战
当涉及到网络通信和高性能的Java应用程序时,Netty是一个强大的框架。它提供了许多功能和组件,其中之一是JNI传输。JNI传输是Netty的一个特性,它为特定平台提供了高效的网络传输。 在本文中,我们将深入探讨Netty提供的特定平台的JNI传输功能,分析其优势和适用场景。我们将介绍每个特定平台的JNI传输,并讨论其性能、可靠性和可扩展性。通过了解这些特定平台的JNI传输,您将能够更好地选择和配置适合您应用程序需求的网络传输方式,以实现最佳的性能和可靠性。
80 7
【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战
|
13天前
|
消息中间件 存储 Java
美团面试:说说Netty的零拷贝技术?
零拷贝技术(Zero-Copy)是一个大家耳熟能详的技术名词了,它主要用于提升 IO(Input & Output)的传输性能。 那么问题来了,为什么零拷贝技术能提升 IO 性能? ## 1.零拷贝技术和性能 在传统的 IO 操作中,当我们需要读取并传输数据时,我们需要在用户态(用户空间)和内核态(内核空间)中进行数据拷贝,它的执行流程如下: ![](https://cdn.nlark.com/yuque/0/2024/png/92791/1706491312473-52f5904a-2742-4e99-9b78-995e9a8b9696.png?x-oss-process=image%2F
15 0
|
1月前
|
Dubbo Java 应用服务中间件
【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(附通信协议和代码)(上)
今天,我要向大家实现一个基于Netty实现的高性能远程通信框架!这个框架利用了 Netty 的强大功能,提供了快速、可靠的远程通信能力。 无论是构建大规模微服务架构还是实现分布式计算,这个分布式通信框架都是一个不可或缺的利器。
92 2
【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(附通信协议和代码)(上)
|
1月前
|
负载均衡 Java 调度
【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(Dispatcher和EventListener)(下)
经过阅读《【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(附通信协议和代码)(上)》,相信您已经对网络通信框架的网络通信层的实现原理和协议模型有了一定的认识和理解。
48 0
【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(Dispatcher和EventListener)(下)
|
9月前
|
消息中间件 机器学习/深度学习 大数据
阿里技术官发布的Netty速成笔记,堪称“性能猛兽”,真的很强悍
现如今互联网大厂,一面最喜欢考察的就是基础知识,比如本课程要讲解的计算机基础,因为写代码不可避免要跟机器、网络、CPU、磁盘、内存,成天打交道。
100 0
|
11月前
|
存储 消息中间件 缓存
Netty入门到超神系列-零拷贝技术
内存主要作用是在计算机运行时为操作系统和各种程序提供临时储存,操作系统的进程和进程之间是共享CPU和内存资源的。为了防止内存泄露需要一套完善且高效的内存管理机制。因此现代操作系提供了一种基于主内存抽象出来的概念:虚拟内存(Virtual Memory)。 虚拟内存 虚拟内存是计算机系统内存管理的一种技术,主要为每个进程提供私有的地址空间,让每个进程拥有一片连续完整的内存空间。而实际上,虚拟内存通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换,加载到物理内存中来 物理内存 物理内存指通过内存条而获得的内存空间,而虚拟内存则是指将硬盘的一块区域划分来
111 0
|
11月前
|
Java
Netty入门到超神系列-Java NIO零拷贝实战
这一章我们来操作一下NIO的零拷贝,这里我会先写代码样式一下传统IO数据拷贝场景下的耗时,然后再对比NIO场景下的考别耗时,通过耗时差异就能看到NIO零拷贝和传统IO拷贝的区别了。
90 0
|
11月前
|
存储 Java Linux
Netty ByteBuf 的零拷贝(Zero Copy)详解
Netty ByteBuf 的零拷贝(Zero Copy)详解
151 0
|
网络协议 安全 Java
即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期。
199 0
即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
Netty - 探究零拷贝Zero Copy
Netty - 探究零拷贝Zero Copy
38 0