零拷贝
什么是零拷贝
零拷贝指的是,从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底层是
通过DMA总线技术实现的。零拷贝与具体的编程语言无关,完全依赖于OS,OS支持就可使用,不支持
设置了也不起作用。
DMA(Direct Memory Access,直接内存访问)是一种计算机系统内部的数据传输技术,需要DMA总
线(硬件的体系结构)的硬件支持。其整个数据传输过程是在DMA控制器下完成的。
零拷贝在计算机内部数据拷贝及网络传输中都大量使用,用于减少CPU消耗和内存带宽占用,减少用户
空间与内核空间的拷贝过程,减少用户态与内核态间的切换次数,提高系统效率,提升系统性能。例如
远程服务器处理客户端浏览器的主页打开请求过程,就是一个零拷贝在网络传输中的典型应用。下面全
部以该场景为例进行分析。
传统拷贝方式
站在服务器角度,服务器操作系统经历了以下过程
该拷贝方式共进行了16次用户空间与内核空间的上下文切换,以及4次数据拷贝,其中两次拷贝存在
CPU参与。
零拷贝方式
该拷贝方式共进行了14次用户空间与内核空间的上下文切换,以及3次数据拷贝,但整个拷贝过程均没
有CPU的参与,这就是零拷贝。
Gather Copy零拷贝
该拷贝方式是由DMA完成,当然,需要当前主机的DMA支持Gather Copy方式。
该方式中没有数据拷贝到socket buffer。取而代之的是只是将kernel buffer中的数据描述信息写到了socket buffer中。数据描述信息包含了两方面的信息:kernel buffer中数据的地址及偏移量。该拷贝方式共进行了14次用户空间与内核空间的上下文切换,以及2次数据拷贝,并且整个拷贝过程均没有CPU的参与。
mmap零拷贝
mmap,Memory Map,存储映射。mmap零拷贝是对零拷贝的改进。当然,若当前主机的DMA支持
Gather Copy,mmap同样可以实现Gather Copy DMA的零拷贝。
该方式与普通零拷贝的唯一区别是,应用程序与内核共享了Kernel buffer。由于是共享,所以应用程序
也就可以操作该buffer了。当然,应用程序对于Kernel buffer的操作,就会引发用户空间与内核空间的
相互切换。