一文读懂计算机内核态、用户态和零拷贝技术( 三 )


sendfileLinux 内核版本 2.1 提供了一个专门发送文件的系统调用函数 sendfile(),函数形式如下:
#include <sys/socket.h>ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);参数说明:

  • 前2个参数分别是目的端和源端的文件描述符,
  • 后2个参数是源端的偏移量和复制数据的长度,返回值是实际复制数据的长度 。
首先,使用sendfile()可以替代前面的 read() 和 write() 这两个系统调用,减少一次系统调用和 2 次上下文切换 。
其次,sendfile可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态,优化后只有 2 次上下文切换,和 3 次数据拷贝 。如下图:
一文读懂计算机内核态、用户态和零拷贝技术

文章插图
 
尽管如此,我们还是又数据拷贝,这不符合我们的标题目标 。如果网卡支持 SG-DMA(


推荐阅读