零拷贝
"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when transmitting a file over a network.[1]
零拷贝(Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。零拷贝技术可以减少数据拷贝和共享总线操作的次数,
消除传输数据在存储器之间不必要的中间拷贝次数,同时尽可能的减少不必要的内核态以及用户态之间的上下文切换 ,从而有效地提高数据传输效率。
linux中常用的数据传输系统调用(图片引用:https://www.jianshu.com/p/275602182f39)
整个数据传输过程如图,首先通过dma将文件数据读取至内核一块缓冲区中,读取过程中发送一次数据copy
内核缓冲区的数据拷贝到用户缓冲区,发生了一次用内核态到用户态的上下文切换。
写过程中,系统调用将用户缓冲区的数据拷贝到 Socket 缓冲区。过程中又发生了一次上下文切换。
数据异步的从 Socket 缓冲区,使用 DMA 引擎拷贝到网络协议引擎
mmap
mmap原理是通过内存映射,相比拷贝数据到缓冲区,只是将文件映射到内核缓冲区,减少一次拷贝操作,在对外写数据过程中,数据直接从内核缓冲区拷贝至sokcet缓冲区,同时减少一次上下文切换
sendfile
相比mmap,sendfile再次减少的数据拷贝次数和上线文切换次数,直接从内核缓冲区进入到 Socket Buffer,由socket缓冲区通过dma同步至协议引擎
优化后sendfile