硬盘上的数据,在发往网络之前,需要经过多次缓冲区的拷贝,以及用户空间和内核空间的多次切换。如果能减少一些拷贝的过程,效率就能提升,所以零拷贝应运而生。
零拷贝是一种非常重要的性能优化手段,比如常见的 Kafka、Nginx 等,就使用了这种技术。我们来看一下有无零拷贝之间的区别。
(1)没有采取零拷贝手段
如下图所示,传统方式中要想将一个文件的内容通过 Socket 发送出去,则需要经过以下步骤:
- 将文件内容拷贝到内核空间;
- 将内核空间内存的内容,拷贝到用户空间内存,比如 Java 应用读取 zip 文件;
- 用户空间将内容写入到内核空间的缓存中;
- Socket 读取内核缓存中的内容,发送出去。
没有采取零拷贝手段的图
(2)采取了零拷贝手段
零拷贝有多种模式,我们用 sendfile 来举例。如下图所示,在内核的支持下,零拷贝少了一个步骤,那就是内核缓存向用户空间的拷贝,这样既节省了内存,也节省了 CPU 的调度时间,让效率更高。
采取了零拷贝手段的图
标签:缓存,---,内核,手段,空间,拷贝,内存 From: https://blog.csdn.net/2401_86608186/article/details/141816965