转载自:一文读懂零拷贝技术|splice使用
服务端要向客户端连接发送一个文件,一般过程如下:

  • 服务端首先调用 read() 函数读取文件内容。
  • 服务端通过调用 write()/send() 函数将文件内容发送给客户端连接。

上面过程如下图所示:

从上图可以看出,在发送文件的过程中,首先需要将文件页缓存(Page Cache)从内核态复制到用户态缓存中,然后再从用户态缓存复制到客户端的 Socket 缓冲区中。

其实在上面的过程中,复制文件数据到用户态缓存这个操作是多余的,我们完全可以直接把文件页缓存的数据复制到 Socket 缓冲区即可,这样就可以减少一次拷贝数据的操作。

为了实现这样的功能,内核提供了一个名为 splice()的系统调用,使用 splice()系统调用可以避免从内核态拷贝数据到用户态。

不需要将内核态的数据拷贝到用户态缓存的技术被称为:零拷贝技术


参考资料:

  1. 一文读懂零拷贝技术|splice使用
  2. 一文读懂零拷贝技术|splice原理与实现