资讯

零拷贝是什么?减少数据在内存中来回复制以提高效率

2026-11-053 分钟阅读百科
TL;DR零拷贝(Zero-copy)是一类减少或避免数据在内存不同区域之间、在操作系统内核与用户程序之间重复复制的技术,可以降低 CPU 开销和延迟、提升吞吐量,常用于网络传输、文件服务、消息队列,以及 GPU 和 AI 训练中的数据传输。

零拷贝(Zero-copy)是一类旨在减少或消除数据在内存中不必要复制的技术。在计算机中,数据从一个地方传送到另一个地方时,常常要在不同的内存区域之间被复制好几次,每一次复制都要消耗处理器的时间和内存带宽。零拷贝技术通过让数据少“搬家”甚至不“搬家”,提高数据传输的效率。需要说明的是,“零拷贝”并不总是指完全没有复制,而是指避免那些由处理器参与的、多余的复制。

传统的数据传输有多少次复制

以一个常见的场景为例:网站服务器要把硬盘上的一个文件发送给用户。在传统的方式下,程序会先调用“读”操作,再调用“写”操作,数据要经历好几次复制:首先,数据从硬盘被复制到操作系统内核的缓冲区;然后,处理器把数据从内核缓冲区复制到应用程序自己的内存中;接着,处理器又把数据从应用程序的内存复制到内核中与网络相关的缓冲区;最后,数据从这个缓冲区被复制到网卡,发送出去。在这个过程中,数据被复制了四次,其中有两次需要处理器亲自参与,而且程序还要在用户态和内核态之间来回切换多次。但实际上,应用程序在这里并不需要修改数据,只是把它原样转发,中间那两次经过应用程序内存的复制完全是多余的。

零拷贝怎么做

零拷贝的思路是让数据直接在内核中,甚至直接在硬件之间传输,而不经过应用程序的内存。常见的实现方式包括:Linux 中的 sendfile 系统调用,可以直接让内核把文件数据发送到网络,数据不再进入应用程序的内存;内存映射,把文件直接映射到程序的内存地址空间,程序和内核共享同一块内存,不需要额外复制;以及借助直接内存访问(DMA)技术,让硬盘、网卡等设备直接读写内存,而不需要处理器逐字节地搬运数据。很多高性能的软件都利用了零拷贝技术,比如 Nginx 等网页服务器,以及 Kafka 等消息队列系统,大幅提升了数据传输的吞吐量。

在 AI 和高性能计算中

在 AI 训练和推理中,大量的数据需要在硬盘、内存、GPU 显存之间,以及不同的服务器之间传输,零拷贝的思想同样非常重要。比如远程直接内存访问(RDMA)技术,允许一台服务器直接读写另一台服务器的内存,绕过双方的操作系统和处理器,大大降低了跨节点通信的延迟,广泛用于大模型的分布式训练;英伟达的 GPUDirect 技术,让 GPU 能够直接与网卡、存储设备交换数据,而不必先经过 CPU 的内存中转。在数据处理领域,Apache Arrow 等内存数据格式,让不同的程序和系统可以直接共享同一份内存中的数据,而不必在每次交换时都进行格式转换和复制。