一、什么是零拷贝?
零拷贝就是指在操作系统中,通过各种方式来减少数据拷贝的次数或者说,减少cpu参与数据拷贝的次数。
二、常见的零拷贝方法
- DMA
DMA全称Direct Memory Access。顾名思义,DMA的作用就是直接将IO设备的数据拷贝到内核缓冲区中。使用DMA的好处就是从IO设备到内核缓冲区不需要cpu的参与。
- mmap
在正常的read+ write流程中,都会经历至少四次数据拷贝。分别是:
read过程:用户空间到内核空间的拷贝、内核空间到用户空间的拷贝
write过程:用户空间到内核空间的拷贝、内核空间到用户空间的拷贝
mmap就是为了解决内核态到用户态的零拷贝,mmap全称 memory map 内存映射,就是将内核态和用户态的内存映射到一起,避免来回拷贝。使用mmap代替read操作,mmap+ write的方式,内存拷贝的次数变为3次。
- sendfile
如果只是传输数据,并不对数据作任何处理,譬如将服务器存储的静态文件,如htl,js发送到客户端用于浏览器渲染,在这种场景下,如果依然进行这么多数据拷贝和上下文切换,简直就是丧心病狂有木有!所以我们就可以通过sendfile的方式,只做文件传输,而不通过用户态进行干预。