面试里有个很常见的套路:先问你“Kafka 为什么快”“RocketMQ 为什么扛得住堆积”,等你答出顺序写、Page Cache、零拷贝之后,面试官顺势往下挖:“零拷贝具体省掉了哪几次拷贝?”“mmap 和 sendfile 有什么区别?”“splice 又是干嘛的?”
到这一步,很多人就开始打太极了。能背出“零拷贝就是不经过用户态”的不少,能把四次拷贝、两次 DMA、几次上下文切换的账算清楚的不多。
Guide 这篇就把这本账捋一遍:传统 I/O 到底拷了几次,零拷贝的“零”到底零在哪,mmap、sendfile、splice 三条路线各自省了什么、又各自有什么代价。
