什么是零拷贝
零拷贝是一种避免CPU,将数据从一块存储空间拷贝到另一块存储空间的技术。零拷贝技术能够提升应用程序的性能,使得这些应用程序可以更有效的利用系统资源。
零拷贝有什么优点
- 减少CPU拷贝次数,甚至不需要CPU拷贝,从而提升CPU执行效率
- 减少内存的占用
- 减少用户态到核心态之间的上下文切换次数
零拷贝的实现原理
不同的操作系统有不同的实现。这里只介绍Linux系统下的零拷贝实现
- 基于sendfile实现的零拷贝
- 基于mmap实现的零拷贝
基于sendfile实现的零拷贝
- 发出sendfile系统调用,然后用户态切换到内核态(第一次上下文切换);
- 通过DMA将磁盘上的文件拷贝到内核缓冲区(第一次拷贝);
- 然后将数据从内核缓冲区拷贝到socket缓冲区(第二次拷贝)
- sendfile系统调用返回,因此内核态切换回用户态。(第二次上下文切换)通过DMA引擎将内核空间socket缓冲区中的数据传递到协议引擎。(第三次拷贝)
基于sendfile带有DMA收集拷贝功能
- 发出sendfile系统调用,此时用户态切换为内核态(也称为核心态