零拷贝(Zero Copy)

一、零拷贝简介

零拷贝指的是,从一个存储区域到另一个存储区域的copy任务没有CPU参与。零拷贝通常用于网络文件传输,以减少CPU消耗和内存带宽占用,减少用户空间(用户可以操作的内存缓存区域)与CPU内核空间(CPU可以操作的内存缓存区域及寄存器)的拷贝过程,减少用户上下文(用户状态环境)与CPU内核上下文(CPU内核状态环境)间的切换,提高系统效率

二、传统拷贝方式

DMA控制器Direct Memory Access,直接内存存取。
ALU算术逻辑运算器

发生4次空间切换(1、4、5、7),发生4次copy(3、4、5、6),其中有2次CPU(4、5)参与。

三、零拷贝方式

Linux系统(CentOS6及其以上版本)对于零拷贝是通过sendfile系统调用实现的

发生2次空间切换(1、6),发生3次copy(3、4、5),其中有0次CPU参与

四、Gather Copy DMA零拷贝方式

由于该拷贝方式是由DMA完成,与系统无关,所以只要保证系统支持sendfile系统调用功能即可。
该方式中没有数据拷贝到socket buffer。取而代之的是只是将kernel buffer中的数据描述信息写到了socket buffer中。数据描述信息包含了两方面的信息:kernel buffer中数据的地址及偏移量

发生2次空间切换(1、6),发生2次copy(3、5),其中有0次CPU参与

五、mmap零拷贝

mmap零拷贝是对零拷贝的改进。当然,若当前主机的DMA支持Gather Copy,mmap同样可以实现Gather Copy DMA的零拷贝。
该方式与零拷贝的唯一区别是,应用程序与内核共享了Kernel buffer。由于是共享,所以应用程序也就可以操作该buffer了。当然,应用程序对于Kernel buffer的操作,就会引发用户空间与内核空间的相互切换

发生4次空间切换(1、6、以及User与Kener共享Kenel buffer这里2次),发生2次copy(3、5),其中有0次CPU参与

猜你喜欢

转载自blog.csdn.net/u012965203/article/details/93378459