通常文件从磁盘中读出来到发送出去经历了以下几个步骤
用户发出读文件请求--》磁盘中的文件--》pageCache--》用户缓存区--》Socket缓冲区--》网卡其中要经历4次上下文切换和4次内存拷贝。
下图是零拷贝步骤图
注意到零拷贝直接将pagecache中的内容传输到网卡上。
1.上下文切换次数的减少,以及数据拷贝次数的减少
假设我们正在拷贝一个32Mb大小的文件,一次拷贝32kb一共需要拷贝1000次。这里有个问题是为什么是32kb而不是1Mb 2Mb呢?这是因为Socket缓冲区使用滑动窗口来发送文件,滑动窗口受接收方接受速度和本机内存的限制。1000*4次上下文切换总共就要进行4000次上下文切换时间和2000次DMA拷贝和2000次CPU拷贝时间。而使用了零拷贝后只需要2000次上下文切换和2000次DMA拷贝。
2空闲出更多的CPU时间
普通的I/O 的操作,都是由 CPU 发出对应的指令,然后等待 I/O 设备完成操作之后返回,那 CPU 有大量的时间其实都是在等待 I/O 设备完成操作。从上图可以看到零拷贝借助于DMA技术节省了大量CPU等待时间,让cpu空闲出来做更多的事情。DMA相关技术可以看这篇文章https://binaryterms.com/di