Notes about 零拷贝技术splice
转载自:一文读懂零拷贝技术|splice使用。
服务端要向客户端连接发送一个文件,一般过程如下:
- 服务端首先调用
read()
函数读取文件内容。 - 服务端通过调用
write()
/send()
函数将文件内容发送给客户端连接。
上面过程如下图所示:
从上图可以看出,在发送文件的过程中,首先需要将文件页缓存(Page Cache)从内核态复制到用户态缓存中,然后再从用户态缓存复制到客户端的 Socket 缓冲区中。
其实在上面的过程中,复制文件数据到用户态缓存这个操作是多余的,我们完全可以直接把文件页缓存的数据复制到 Socket 缓冲区即可,这样就可以减少一次拷贝数据的操作。
为了实现这样的功能,内核提供了一个名为 splice()
的系统调用,使用 splice()
系统调用可以避免从内核态拷贝数据到用户态。
不需要将内核态的数据拷贝到用户态缓存的技术被称为:
零拷贝技术
。
参考资料: