news 2026/6/9 8:24:41

【linux】零拷贝技术

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【linux】零拷贝技术

简单来说,“零拷贝”(Zero-copy)并不是指数据真的物理上一次都不拷贝,而是指消除在内核态(Kernel Space)与用户态(User Space)之间冗余的数据拷贝,以及减少 CPU 参与拷贝的工作。

在传统的 I/O 操作中,数据往往要在内核缓冲区和用户缓冲区之间跳来跳去,这不仅浪费内存带宽,还让 CPU 忙于搬砖。

为了让你看清这些“骚操作”,我们先看传统的 I/O 流程,再逐一拆解零拷贝的各种实现。


1. 传统 I/O 的痛点(Baseline)

传统的read+write操作流程如下:

  1. DMA 拷贝:磁盘 -> 内核缓冲区(Page Cache)。
  2. CPU 拷贝:内核缓冲区 -> 用户缓冲区(应用程序内存)。
  3. CPU 拷贝:用户缓冲区 -> Socket 缓冲区。
  4. DMA 拷贝:Socket 缓冲区 -> 网卡(NIC)。

代价:4 次上下文切换(User/Kernel 切换),4 次数据拷贝(其中 2 次 CPU 亲自下场)。


2. 零拷贝技术全家桶

① mmap + write(内存映射)

这是最早期的改进方案。既然用户空间和内核空间来回拷贝麻烦,那就直接把内核缓冲区映射到用户空间。

  • 原理:使用mmap()系统调用,让用户进程的虚拟地址指向内核空间的 Page Cache 地址。
  • 过程
  1. DMA 拷贝:磁盘 -> 内核缓冲区。
  2. 内核与用户共享:不需要 CPU 拷贝到用户空间。
  3. CPU 拷贝:内核缓冲区 -> Socket 缓冲区。
  4. DMA 拷贝:Socket 缓冲区 -> 网卡。
  • 优点:减少了 1 次 CPU 拷贝。
  • 缺点:依然有 4 次上下文切换,且在大并发下可能触发SIGBUS错误(如果文件被另一个进程截断)。

② sendfile

Linux 2.1 版本引入,这是真正意义上迈向“零”的一大步。

  • 原理:在一个系统调用内完成数据传输,不再经过用户空间。
  • 过程
  1. DMA 拷贝:磁盘 -> 内核缓冲区。
  2. CPU 拷贝:内核缓冲区 -> Socket 缓冲区。
  3. DMA 拷贝:Socket 缓冲区 -> 网卡。
  • 优点:2 次上下文切换(因为是一个接口 少了mmap结束返回用户态,和再调用write进入内核态过程),3 次拷贝(1 次 CPU 拷贝)。

③ sendfile + DMA Gather Copy(真正的零 CPU 拷贝)

这是sendfile的增强版,需要网卡硬件支持。

  • 原理:内核不再把数据拷贝到 Socket 缓冲区,而是只把数据的**内存地址和长度(描述符)**拷贝过去。网卡的 DMA 控制器直接根据这些描述符从内核缓冲区抓取数据。
  • 过程
  1. DMA 拷贝:磁盘 -> 内核缓冲区。
  2. 描述符拷贝:内核将位置信息传给 Socket 缓冲区(极小开销)。
  3. DMA 收集拷贝:网卡直接从内核缓冲区读数据。
  • 优点:2 次上下文切换,2 次拷贝(0 次 CPU 拷贝)。

④ splice

Linux 2.6.17 引入,它不像sendfile只能发文件到 Socket,它更通用。

  • 原理:利用“管道(Pipe)”机制。它在两个文件描述符之间移动数据,而不经过用户空间。
  • 特点:要求传输的两个描述符中至少有一个必须是管道。
  • 效果:实现了内核空间的“原生”数据流转,避免了 CPU 拷贝。

⑤ Direct I/O(直接 I/O)

严格来说,这叫“绕过缓存”,也是零拷贝的一种思路。

  • 原理:应用程序直接访问磁盘,跳过操作系统的 Page Cache(内核缓冲区)。
  • 适用场景:数据库(如 MySQL/Oracle)。它们通常有自己的缓存管理机制,不希望 OS 帮倒忙。
  • 缺点:如果数据不在 App 的缓存里,每次都要读磁盘,性能反而可能下降。

⑥ MSG_ZEROCOPY

Linux 4.14 以后引入的高级特性,主要针对 Socket 发送。

  • 原理:利用写时复制(Copy-on-Write)技术。应用层发送数据时,内核不拷贝数据,而是修改页表引用。
  • 适用场景:超大数据包发送(通常 > 10KB 才有收益,否则页表维护开销可能盖过拷贝开销)。

⑦ RDMA(Remote Direct Memory Access)

这是“终极方案”,属于硬件级别的零拷贝。

  • 原理:通过特定的网卡,让一台机器可以直接读写另一台机器的内存,完全绕过双方的 CPU 和操作系统内核。
  • 适用场景:高性能计算(HPC)、分布式存储(如 NVMe-over-Fabrics)。

3. 技术对比总结

技术方案CPU 拷贝次数上下文切换关键优势
传统 I/O24兼容性最强
mmap14适合多进程共享读取
sendfile12简单高效,静态资源分发首选
DMA Gather02目前主流的高性能方案
splice02灵活,适合代理服务器
RDMA00硬件级,极低延迟

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 8:54:12

【TF-A与u-boot烧录的SD卡的操作流程】

整体背景:TF 卡启动 u-boot 的核心目的当开发板上没有可启动的系统(比如 “变砖”),或者需要调试启动流程时,我们可以通过 TF 卡启动到 u-boot 终端,进行救砖、烧写镜像等操作。整个流程分为 TF 卡分区 和 …

作者头像 李华
网站建设 2026/5/21 18:10:21

ir_cut打开是对应 白色滤光片吗

ir_cut打开是对应 白色滤光片吗 ir_cut打开------>对应白色滤光片ir_cut关闭------>对应红色滤光片

作者头像 李华
网站建设 2026/5/29 4:27:53

Thinkphp和Laravel+vue网约车在线打车拼车管理系统

目录 ThinkPHP 和 Laravel Vue 网约车管理系统摘要技术栈与框架特点核心功能模块技术实现要点优势与适用场景典型代码片段(Laravel Vue)扩展方向 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 ThinkPHP 和 Laravel Vu…

作者头像 李华
网站建设 2026/5/22 4:49:41

Thinkphp和Laravel+vue鞍山市职业技术学院图书借阅推荐系统 提醒 _1o9rw

目录 ThinkPHP与LaravelVue的技术选型对比鞍山市职业技术学院系统功能设计前端Vue集成方案提醒功能实现逻辑性能优化建议部署注意事项 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 ThinkPHP与LaravelVue的技术选型对比 ThinkPHP作为国产PHP框…

作者头像 李华
网站建设 2026/5/7 3:10:00

交换系统评估:支撑IT外包公司为客户交付需求驱动的交换评估方案

评估接入系统路由质量、管理传输需求、审核路由系统配置 摘要 面向设备集成商、IT外包公司、宽带组网运营商及楼宇企服资源方等技术服务伙伴,我们结合可视化运行监控系统,提供系统规划、标准化交付与平台化运维支撑,助力其为客户实现高确定…

作者头像 李华
网站建设 2026/6/3 16:22:43

人工智能数据分析科学家:20个月系统培养大纲 (1.0版)【20260128】002篇

文章目录 AI驱动的数据分析:从理论建模到全栈可视化落地 全栈数据分析师的进阶实战指南 前言(扩容版) 第一部分 基石:AI数据分析与全栈可视化基础 【板块学习目标】 第1章 企业级数据工程与数据治理(扩容10倍版) 1.1 数据采集:从单源到分布式多源采集 1.1.1 入门:基础数…

作者头像 李华