以下内容总结自:

9.1 什么是零拷贝?

一个进程的 I/O 过程

数据主要在 I/O 硬件,内核空间的缓冲区,以及用户空间的缓冲区。

(早期的 DMA 控制器在主板上,目前 DMA 控制器在各个 I/O 设备上)

mmap

将内核空间的缓冲区映射到用户空间(write 时同样需要从输入缓冲区写到输出缓冲区)

sendfile

使用一个系统命令将输入直接输出,进程用户失去了直接接触数据的机会,但是数据也不用进入用户缓冲区。

如果这是输出设备支持(The Scatter-Gather Direct Memory Access)SG-DMA 那么不需要 CPU 再进行拷贝,SG-DMA 直接读取输入内核空间的缓冲区的数据,通过输出设备输出。