谈谈linux零拷贝机制
2020-01-29 本文已影响0人
this_is_for_u
什么是零拷贝
零拷贝指的是数据从一个存储区域到另一个存储区域的过程中不需要cpu参与执行拷贝的动作,通常用于网络传输文件时减少cpu的负载,解放cpu去提升系统整体性能。
谈到零拷贝我们还需要了解到DMA是什么:
DMA(Direct Memory Access)是指在现代计算机系统上,外接设备可以不用CPU干预,直接把数据传输到内存的技术。正常情况下,CPU全权负责内存的读写操作,而DMA技术可以把CPU解放出来,这将使计算机性能得到显著改善。
如果做到零拷贝
普通的文件传输伪代码如下:
while(read(buffer)) {
write(fd, buffer);
}
拷贝动作如图
zero_copy0.png
从图中可以看到,cpu参与了两次拷贝动作,从内核态拷贝到用户态,再从用户态拷贝到内核态,而且cpu的下文切换也是有消耗的,我们致力于减少cpu的上下文切换以及这两次cpu的拷贝操作。
linux有一个系统调用sendfile可以避免cpu的上下文切换,使得拷贝操作全部在内核态执行,拷贝操作如图:
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
zero_copy1.png
如图,使用sendfile系统调用避免了cpu的上下文切换,同时cpu的拷贝动作也减少了一次,其实上面的sendfile是老版本的内核实现,最新版本的内核带有gather功能的sendfile就已经完全避免了cpu的拷贝操作,如图:
zero_copy2.png
这就是cpu的零拷贝。
参考链接
linux sendfile
浅谈 Linux下的零拷贝机制
DMA简介
Linux 中的零拷贝技术,第 1 部分
Linux 中的零拷贝技术,第 2 部分