Netty——零拷贝
文章目录
- 1. 什么是零拷贝?
- 2. 为什么需要零拷贝?
- 2.1 传统 I/O 的拷贝流程
- 2.2 零拷贝的优化
- 2.2.1 通过 sendfile 系统调用
- 2.2.2 通过 mmap (内存映射) 系统调用
- 3. Netty 实现零拷贝的方式
- 3.1 文件传输优化:FileRegion 封装
- 3.2 直接内存 (Direct Memory)
- 3.3 内存映射文件:MappedByteBuffer
- 3.4 复合缓冲区:CompositeByteBuf
- 3.5 切片与包装操作
- 4. 零拷贝的优点
- 5. 总结
1. 什么是零拷贝?
零拷贝 (Zero-Copy) 是一种 通过减少或避免数据在内存之间不必要的拷贝,从而提升系统性能的技术。它主要用于 操作系统内核 与 用户程序 之间的数据传输场景。
2. 为什么需要零拷贝?
2.1 传统 I/O 的拷贝流程
以文件传输为例,传统 I/O 的拷贝流程如下所示:
- 从 磁盘 读取数据到 内核缓冲区:数据从磁盘通过 DMA(直接内存访问)传输到内核空间的缓冲区。

- 将数据从 内核缓冲区 拷贝到 用户空间:用户程序通过系统调用(如
read())将内核缓冲区的数据拷贝到用户空间的缓冲区。

- 将数据从 用户空间 拷贝回 内核 Socket 缓冲区:用户程序通过系统调用(如
write())将数据从用户空间缓冲区拷贝到内核空间的 Socket 缓冲区。

- 将数据从 内核 Socket 缓冲区 发送到 网络:数据通过 DMA 传输到网卡,完成发送。

问题:传统流程需要 4 次拷贝 和 2 次上下文切换(用户态 和 内核态 的相互切换),性能开销大。
2.2 零拷贝的优化
零拷贝主要通过 减少用户空间与内核空间的交互 的方式减少拷贝次数,具体可以使用的特性如下:
2.2.1 通过 sendfile 系统调用
通过 sendfile,直接在内核空间将文件数据传输到 Socket 缓冲区,避免了 2 次上下文切换和 1 次拷贝。步骤如下:



注:第二步文件从内核的 文件缓冲区 拷贝到 Socket 缓冲区 使用的是 DMA 还是 CPU 拷贝需要看硬件是否支持 SG-DMA(分散聚合直接内存访问)。
- 若硬件(如网卡)支持 SG-DMA,数据从 文件缓冲区 到 Socket 缓冲区 的传输由 DMA 完成,无需 CPU 参与拷贝。此时,内核只需告知 DMA 控制器数据位置和长度,DMA 直接在内核空间内搬运数据,完全释放 CPU 资源,实现更高效的零拷贝。
- 若硬件不支持 SG-DMA,内核会通过 CPU 拷贝将数据从 文件缓冲区 复制到 Socket 缓冲区。
2.2.2 通过 mmap (内存映射) 系统调用
mmap 系统调用会将文件映射到进程的虚拟地址空间,使得进程可以直接访问文件内容,而无需将文件内容拷贝到用户空间的缓冲区。过程如下:
- 映射文件到虚拟地址空间:应用程序调用
mmap,操作系统会创建一个虚拟内存区域,并将其与文件的物理地址进行映射。此时,文件内容并没有被实际加载到内存中,只是建立了映射关系。

- 直接访问映射区域:应用程序可以像访问普通内存一样直接访问映射区域。当应用程序访问映射区域中的某个地址时,如果该地址对应的页面尚未加载到内存中,会触发 缺页中断。操作系统会根据映射关系,将文件中的相应数据从 磁盘 读取到 内核空间的文件缓冲区,并将该页面映射到进程的虚拟地址空间。

- 将数据从 文件缓冲区 发送到到 Socket 缓冲区:当需要将文件内容发送到网络时,应用程序可以直接操作映射区域。操作系统会将内核空间的 文件缓冲区 中的数据直接拷贝到 Socket 缓冲区。

- 将数据从 Socket 缓冲区 发送到 网络:将数据从 Socket 缓冲区 发送到 网卡。

在这个过程中,数据不需要经过用户空间的缓冲区,避免了 1 次数据拷贝。
注意:看似 用户空间 中好像有也一块内存,与 文件缓冲区 一样,但其实 用户空间 用 页表 来映射 文件缓冲区 中内存。
3. Netty 实现零拷贝的方式
3.1 文件传输优化:FileRegion 封装
Netty 通过 FileRegion 类封装了 NIO 的 FileChannel 类的 transferTo() 方法,避免数据 在 内核空间 与 用户空间 的拷贝 和 上下文切换。在 Linux 操作系统中,transferTo() 底层使用 sendfile 的系统调用实现 零拷贝。
3.2 直接内存 (Direct Memory)
Netty 使用 直接内存 (Direct Memory) 来减少数据在 用户空间 和 内核空间 之间的拷贝。直接内存由操作系统直接管理,避免了在 用户空间 的中转。
- 对于文件操作,使用
mmap进行优化。 - 对于网络传输,使用
sendfile进行优化。
从而避免将内核空间中 文件缓冲区 的数据拷贝到 用户空间 和 2 次上下文切换。
3.3 内存映射文件:MappedByteBuffer
通过 FileChannel.map() 将文件映射到虚拟内存,直接通过内存地址操作文件数据。底层使用了 mmap 技术,避免了 内核空间 与 用户空间 之间的 数据拷贝 和 线程切换。
3.4 复合缓冲区:CompositeByteBuf
CompositeByteBuf 将多个 ByteBuf 组合成一个逻辑上的整体,无需物理合并数据,减少内存复制。
3.5 切片与包装操作
通过 ByteBuf 对象的 slice()、duplicate() 或 Unpooled.wrappedBuffer() 共享数据,而非复制数据,使用这些方法生成的 ByteBuf 与原始 ByteBuf 共用底层内存数据。
ByteBuf 除了 slice()、duplicate() 方法之外,还有 retainedSlice()、retainedDuplicate() 方法,这两个方法也可以实现零拷贝,而且还 增加了引用计数,避免在原始 ByteBuf 释放时意外释放共享的内存,所以更推荐调用这两个方法。
4. 零拷贝的优点
- 降低 CPU 利用率,减少内存带宽消耗。
- 提升 I/O 密集型任务的性能。
5. 总结
零拷贝并非一次拷贝都没有,它指的是尽量减少拷贝的数量,从而提升程序的性能。可优化的地方在于避免 数据在 内核空间 和 用户空间 的拷贝 和 内核态 与 用户态 之间的上下文切换,在操作系统层面使用 sendfile 或 mmap 就可以做到。在 Netty 中,实现零拷贝的方式有很多种,可以通过以下方式:
FileRegion对象的transfterTo()方法- 直接内存
MappedByteBufferCompositeByteBuf- 切片和包装
相关文章:
Netty——零拷贝
文章目录 1. 什么是零拷贝?2. 为什么需要零拷贝?2.1 传统 I/O 的拷贝流程2.2 零拷贝的优化2.2.1 通过 sendfile 系统调用2.2.2 通过 mmap (内存映射) 系统调用 3. Netty 实现零拷贝的方式3.1 文件传输优化:FileRegion 封装3.2 直接内存 (Dire…...
Java制作简单的聊天室(复习)
设计的知识点:几乎包含java基础的全部知识点(java基础语法,java基础进阶:双列集合,io流,多线程,网络编程等) 代码如下 客户端: 服务器采用的时多线程的循环多线程的方式…...
ES 字段的映射定义了字段的类型及其行为
在 Elasticsearch 中,字段的映射定义了字段的类型及其行为。你提供的 content_answer 字段映射如下: Json 深色版本 "content_answer": { "type": "text", "fields": { "keyword": { …...
Android开发点击字符串web链接跳到系统浏览器上
Android开发点击字符串web链接跳到系统浏览器上 直接上代码:用到你就拿去用 public static void performItemUrlClick(View view, String contentUrl) {if (!TextUtils.isEmpty(contentUrl)) {Intent intent new Intent();if (!contentUrl.startsWith("http…...
运维规则之总结(Summary of Operation and Maintenance Rules)
运维规则之总结 在运维领域,经验和流程往往决定了系统的稳定性与可靠性。一个运维人,总结出了以下10条运维规则,涵盖了从基础管理到高级策略的全面内容,旨在帮助运维人员更好地应对各种挑战,确保系统的平稳运行。 1.…...
智能家居赋能宠物经济:未来宠物行业的另一片蓝海
一、引言:宠物经济的范式转移 随着城市化进程的加速,宠物在现代家庭中的地位日益重要,宠物经济蓬勃发展。近年来,智能家居技术的兴起为宠物行业带来了新的变革,从传统的情感消费模式向技术赋能的精细化养宠模式转变。…...
C++Primer学习(13.6 对象移动)
13.6 对象移动 新标准的一个最主要的特性是可以移动而非拷贝对象的能力。如我们在13.1.1节(第440页)中所见,很多情况下都会发生对象拷贝。在其中某些情况下,对象拷贝后就立即被销毁了。在这些情况下,移动而非拷贝对象会大幅度提升性能。 如我…...
RHCE工程师特训指南
RHCE(红帽认证工程师)是Linux领域极具含金量的认证之一,其考试以实操为主,注重系统管理、网络服务配置及自动化运维能力。以下内容可帮助对RHCE考生高效规划学习路径。 一、RHCE认证概述 认证结构 RHCE认证分为两部分ÿ…...
内核、进程和线程---操作系统
操作系统 操作系统位于用户程序和硬件之间,通过系统调用提供接口可以让应用程序去使用硬件,但是硬件资源的管理和安全控制由操作系统负责。 用户空间和内存空间 在计算机系统中,内存可以分为两大区域:内核空间(Ker…...
如何在 Postman 中上传图片并在请求中正确引用?
Postman 是一款常用的 API 测试工具,它不仅可以测试 API 的请求和响应,还支持多种数据格式包括图片。如何在 Postman 中传输图片? Postman 如何上传图片并在请求中使用教程...
平板实现 adb connect 连接的步骤
1. 检查设备的开发者选项 确保平板设备已开启开发者模式,并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络,确认设备的 IP 地址是否正确。 通过 ping 命令测试: ping 192.168.3.243. 通过USB线进行初…...
安全+低碳+高效:Acrel-3000助力企业打造未来型电能管理体系-安科瑞黄安南
一 背景 电能因为方便传输、易于转换、便于控制等特性,成为广大企事业单位生产、办公最主要的能量来源。双碳背景下,由于电能清洁、高效、零排放的特点,能源消费侧将逐步以电代煤、以电代油、以电代气,形成以电为中心的能源消费体…...
专注自习室:番茄工作法实践
专注自习室:番茄工作法实践 我需要一个任务管理工具,但在网上找了很多都找不到合适的工具。市面上的大多数产品过于强调任务完成性,给我带来了很强的心理压力,这种压力最终反而降低了我的工作效率。于是我决定自己动手࿰…...
docker save如何迁移镜像更节省空间?
文章目录 方法一:使用docker save命令方法二:直接保存多个镜像到一个tar文件哪个方法更节省磁盘空间?空间效率对比实际测试示例其他优势结论 如何用脚本迁移加载镜像 迁移镜像时候,往往会碰到基础镜像相同的很多镜像需要迁移&…...
LeetCode算法题(Go语言实现)_16
题目 给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数 。 一、代码实现 func longestOnes(nums []int, k int) int {left, zeroCnt, maxLen : 0, 0, 0for right : 0; right < len(nums); …...
CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案
计算机该如何求解三角函数?或许你的第一印象是采用泰勒展开,或者采用多项式进行逼近。对于前者,来回的迭代计算开销成本很大;对于后者,多项式式逼近在较窄的范围內比较接近,超过一定范围后,就变…...
JVM 面经
1、什么是 JVM? JVM 就是 Java 虚拟机,它是 Java 实现跨平台的基石。程序运行之前,需要先通过编译器将 Java 源代码文件编译成 Java 字节码文件;程序运行时,JVM 会对字节码文件进行逐行解释,翻译成机器码指令&#x…...
SEO(搜索引擎优化)详解
SEO(搜索引擎优化)详解 SEO是Search Engine Optimization的缩写,中文称为"搜索引擎优化"。它是指通过一系列技术和方法,提高网站在搜索引擎自然(非付费)搜索结果中的排名,从而获得更…...
Ubuntu平台下安装Node相关环境
说明:在进行VUE、TS等开发需要用到NodeJS相关环境,不同的项目有时候需要不同的Node版本支撑。本文将详细讲解NVM、Node、Yarn、PM2等环境安装的实施步骤。 测试服务器环境:22.04 LTS。 1. NVM 定义:Node Version Manager&#x…...
deepseek大模型一体机与deepseek的关系
deepseek大模型一体机与deepseek的关系 一、deepseek大模型一体机是什么 DeepSeek大模型一体机是由深度求索(DeepSeek)公司推出的软硬件一体化AI解决方案,旨在为企业提供高效、便捷的大模型部署和应用能力。 二、deepseek大模型一体机与de…...
Windows Server 2025 使用 IIS 搭建 ASP.NET 3.5 网站
开启远程桌面 参考文章Windows server开启远程桌面教程打开服务管理器。ECS 配置安全组,开启 3389Telnet 验证网络联通性 telnet x.x.x.x 338安装 Windows App,登录验证 安装 ASP.NET 3.5 1.参考文章Windows Server 2012安装 .NET Framework 3.5和 Wi…...
高等数学-第七版-上册 选做记录 习题7-2
1. 2....
基于Promise链式调用的多层级请求性能优化
代码优化-循环嵌套关联请求 1. 背景 在实际开发中,我们经常会遇到需要嵌套关联请求的场景,比如: 获取项目列表获取项目详情获取项目进度 2. 问题 在这种场景下,我们可能会遇到以下问题: 串行请求瀑布流ÿ…...
【强化学习】基于深度强化学习的微能源网能量管理与优化策略研究【Python】
目录 主要内容 程序要点 2.1 微能源网系统组成 2.2 强化学习及Q学习算法 部分代码 运行结果 下载链接 主要内容 该程序借助深度 Q 网络(DQN),学习预测负荷、风 / 光可再生能源功率输出及分时电价等环境信息,运用…...
楼宇自控借何种技术,驱动建筑迈向高效绿色
在全球积极倡导可持续发展的大背景下,建筑行业作为能源消耗和碳排放的大户,实现高效绿色发展迫在眉睫。楼宇自控系统凭借其先进的技术手段,成为推动建筑向高效绿色转型的关键力量。那么,楼宇自控究竟借助哪些技术,让建…...
监控易一体化运维:监控易机房管理,打造高效智能机房
在数字化浪潮中,企业对数据中心和机房的依赖程度与日俱增,机房的稳定运行成为业务持续开展的关键支撑。信息化的变迁,见证了机房管理从传统模式向智能化、精细化转变的过程。今天,就为大家深度剖析监控易在机房管理方面的卓越表现…...
简记_FPGA 硬件最小系统设计
一、FPGA板级设计的五要素 1.1、电源电路 核心电压:一般为固定值 IO电压:FPGA的IO分为多个bank,同一个bank的不同IO引脚电压相同,不同bank的电压可以不同 辅助电压:除了核心电压和IO电压,FPGA工作所需的…...
1.1-站点差异\源码差异\数据存储差异\MVC模型
1、有哪几种站点 分主站、分站、端口站、子站、目录站 2、有哪几种源码语言框架差异 开源-如Zblog 闭源-内部开发 加密-如通达OA 3、网站数据存储有哪几个方式 本地数据库:本地服务器搭建 分离数据库:另外的服务器搭建 云数据库:RDS…...
PHP安装HTML转图片的扩展GD库的使用
修改你的PHP.ini文件,找到以下位置 ;extensionphp_gd2.dll 把前面的;去掉…...
清华大学第10讲:迈向未来的AI教学实验396页PPT 探索未来教育的无限可能|附PPT下载方法
导 读INTRODUCTION 今天跟大家分享的是清华大学新闻与传播学院、人工智能学院双聘教授沈阳教授团队出品的《迈向未来的AI教学实验》课程作业集,随着人工智能技术的飞速发展,教育领域也迎来了前所未有的变革。该报告为沈阳教授与学生们在“迈向未来的AI教…...
