← 中文资源

简体中文版本

零拷贝 I/O

零拷贝 I/O 在内核态直接完成文件到套接字的数据搬运,不再复制进用户空间,靠 sendfile、splice 或 mmap 省掉每字节的 CPU 与内存带宽。

阅读英文原文

概念定义

传统发文件要把数据两次穿过用户空间:内核页缓存到用户缓冲、用户缓冲再回套接字缓冲。零拷贝把搬运交给内核——描述符进、字节动——从每次发送里删掉两次复制与两个上下文切换。

工作机制

sendfile 在内核内于输入文件描述符与输出套接字间复制;splice 借管道在两个描述符间移动数据;mmap 把文件页映射进地址空间,应用无需显式复制即可读;kTLS 把密钥装进内核,加密直接作用于内核驻留数据。

使用场景

静态资源分发、日志复制、高吞吐批量传输。用 strace 与 perf 计数度量:每字节复制数下降会表现为 sys 时间骤降。

常见误区

“零拷贝消除一切复制”过头了:它消的是用户空间往返,校验与加密阶段照样碰数据。收益出现在大块顺序发送,小而碎的传输反付调用开销。用户态 TLS 历史上强制复制回用户空间——kTLS 解决了它,但密钥生命周期与密码套件支持各异;压缩管线与零拷贝组合时须实测压缩器是否把复制又加了回来。