外观
一句话答案
零拷贝避免 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。