Send file
一、典型的zero copy
developer.51cto 高性能开发的“十大武器”,爱了爱了!# I/O优化:零拷贝技术
在阅读 developer.51cto 高性能开发的“十大武器”,爱了爱了!# I/O优化:零拷贝技术 时,其中介绍了 man 2 sendfile :
I/O 优化:零拷贝技术
上面的工作线程,从磁盘读文件、再通过网络发送数据,数据从磁盘到网络,兜兜转转需要拷贝四次,其中 CPU 亲自搬运都需要两次。
零拷贝技术,解放 CPU,文件数据直接从内核发送出去,无需再拷贝到应用程序缓冲区,白白浪费资源。
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:上面章节已经详细介绍了这样做的原因。