Skip to content

Send file

一、典型的zero copy

developer.51cto 高性能开发的“十大武器”,爱了爱了!# I/O优化:零拷贝技术

在阅读 developer.51cto 高性能开发的“十大武器”,爱了爱了!# I/O优化:零拷贝技术 时,其中介绍了 man 2 sendfile :

I/O 优化:零拷贝技术

上面的工作线程,从磁盘读文件、再通过网络发送数据,数据从磁盘到网络,兜兜转转需要拷贝四次,其中 CPU 亲自搬运都需要两次。

img

零拷贝技术,解放 CPU,文件数据直接从内核发送出去,无需再拷贝到应用程序缓冲区,白白浪费资源。

img

Linux API:

ssize_t sendfile(   int out_fd,    int in_fd,    off_t *offset,    size_t count   ); 

函数名字已经把函数的功能解释的很明显了:发送文件。指定要发送的文件描述符和网络套接字描述符,一个函数搞定!

man 2 sendfile(2)

sendfile() copies data between one file descriptor and another. Because this copying is done within the kernel, sendfile() is more efficient than the combination of read(2) and write(2) , which would require transferring data to and from user space.

NOTE:上面章节已经详细介绍了这样做的原因。