直接回答:零拷贝指数据在存储设备与网络之间传输时,避免在用户态和内核态之间来回拷贝,让数据尽量只在内核空间流动,从而减少 CPU 拷贝次数和上下文切换。典型手段:sendfile() 直接把文件内容从内核页缓存送进 socket 缓冲区;mmap() 把文件映射到用户地址空间,读写即读写页缓存;Linux 还有 splice()tee() 等管道式机制。

展开解析:传统 read+write 发送文件需要 4 次拷贝(磁盘→内核缓冲→用户缓冲→socket 缓冲→网卡)和 4 次用户/内核态切换;sendfile 把中间的用户缓冲环节砍掉,配合支持 scatter-gather 的网卡可进一步减少拷贝。零拷贝的收益不仅是少几次 memcpy,还包括 CPU 缓存污染减少、上下文切换开销消失。应用场景:Kafka 用 sendfile 把日志段直接发给消费者,是其高吞吐的关键之一;Nginx 静态文件服务;RocketMQ 等消息中间件用 mmap 写日志。局限:零拷贝路径中应用层摸不到数据,不适合需要加工内容的场景(如加密、压缩,此时考虑 mmap 或正常读)。追问方向:DMA 在拷贝链路中的角色、Java 的 transferTo/DirectByteBuffer 与零拷贝的关系。