总结来说,DMA 确实减轻了 CPU 在数据传输中的负担,让数据从硬盘传输到内核缓冲区和内核缓冲区到网卡时几乎无需 CPU 的参与。然而,DMA 无法彻底办理数据在内核和用户空间之间的拷贝问题。CPU 依然需要进行两次数据搬运,特别是在高并发和大文件传输场景下,这个限制变得尤为突出。
3、零拷贝:让数据“直达”
因此,为了进一步淘汰 CPU 的参与,提升传输效率,Linux 推出了 零拷贝 技术。这项技术的核心目的是:让数据在内核空间内直接流转,避免在用户空间的冗余拷贝,从而最大限度淘汰 CPU 的内存拷贝操作,提高系统性能。
接下来,我们来具体看看 Linux 中的几种主要零拷贝实现方式:
注意:Linux 中零拷贝技术的实现需要硬件支持 DMA。
3.1 sendfile:最早的零拷贝方式
sendfile 是最早在 Linux 中引入的零拷贝方式,专为文件传输计划。
3.2 sendfile 的工作流程
DMA(直接内存访问)直接将文件数据加载到内核缓冲区。
数据从内核缓冲区直接进入网络协议栈中的 socket 内核缓冲区。
数据通过网络协议栈处理后,通过网卡直接发往网络。
通过 sendfile,整个传输过程 CPU 只需要一次数据拷贝,淘汰了 CPU 的使用。
3.3 简单图解:
sendfile 图讲授明:
从硬盘读取数据:文件数据通过 DMA 从硬盘读取,直接加载到内核缓冲区,这个过程不需要 CPU 的参与。