Skip to content
极高困难

一句话答案

零拷贝避免 CPU 参与用户/内核缓冲区间的数据复制,sendfile 省两次拷贝,Kafka/Nginx 用它提升吞吐。

核心要点

传统IO(4次拷贝): 磁盘→内核缓冲→用户缓冲→Socket缓冲→网卡

sendfile(2次): 磁盘→内核缓冲→网卡(CPU不参与拷贝)

mmap(3次): 内核缓冲直接映射到用户空间,省一次拷贝

应用: Kafka(sendfile高吞吐) / RocketMQ(mmap) / Nginx

追问与易错

追问方向:

  • sendfile 和 mmap+write 区别?
  • DMA 在零拷贝中的作用?
  • Java 怎么用零拷贝?

易错点:

  • ❌ 零拷贝就是零次拷贝——仍有 DMA 拷贝
  • ❌ 所有场景都该用零拷贝——需要修改数据时不能用

💡 记忆锚点

传统IO像快递过四手:磁盘→内核缓冲→用户缓冲→Socket缓冲→网卡,CPU当搬运工累得要死。sendfile让快递直接从仓库(内核缓冲)发到网卡,CPU不用搬(DMA搞定),省两次拷贝。mmap是在仓库开了个窗口让你直接看货(映射),省一次。Kafka用sendfile,RocketMQ用mmap。