什么是零拷贝
零拷贝技术是一种思想,指的是计算机操作时,CPU不需要先将数据从某处内存复制从某处内存复制到另一个特定区域。
零拷贝字面上的意思包括两个,“零”和“拷贝”。
“零” :表示次数为0,它表示拷贝数据的次数为0。
“拷贝”:就是指数据从一个存储区域,转移到另一个存储区域。
合起来那零拷贝就是:不需要将数据从一个存储区域复制到另一个存储区域咯。
为什么需要零拷贝
零拷贝技术的引入,主要是为了解决传统数据传输中涉及的数据复制操作,所带来的性能和资源消耗问题。
比如:没有引入零拷贝,传统的IO流程,如下图所示:
从流程图可以看出,主要包含:read和write的过程。
传统IO的读写流程,包括了:4次上下文切换,也就是4次用户态和内核态的切换。
也及4次数据拷贝,两次CPU拷贝和两次的DMA拷贝,这些多次拷贝会极大降低性能。
所以,后面就引入了零拷贝,可以极大的降低数据复制操作,从而提升了性能。
零拷贝实现方式
零拷贝一般有这三种实现方式,主要包含:mmap、sendfile、带有DMA收集拷贝功能的sendfile。
1.mmap
read() 系统调用的过程中,CPU会把内核缓冲区的数据拷贝到用户的缓冲区里,这里会涉及一次拷贝。
为了减少这次拷贝,我们可以用 mmap() 替换 read() 系统调用函数。
mmap的系统调用作用是将内核空间地址映射为用户空间地址映射,这样CPU就不用将数据从内核态拷贝到用户态了。
如下图所示:
mmap就是一种内存映射文件的方法,Java中的实现是MappedByteBuffer,通过channel#map方法得到。
通过内存映射,IO流程就变成了这样
- 应用程序调用mmap函数,IO开始,进行上下文切换,从用户态切换到内核态。
- DMA控制器将磁盘中的数据拷贝到OS缓冲区
- mmap函数建立内存映射完毕,进行上下文切换,从内核态切换到用户态。
- 应用程序调用write函数通过内存映射往Socket中写数据,进行上下文切换,从用户态切换到内核态。
- CPU将OS缓冲区的数据,拷贝到Socket缓冲区。
- DMA控制器,将Socket缓冲区中的数据拷贝到网卡中完成数据发送
- 进行上下文切换,从内核态切换到用户态,一次数据发送流程结束。
关键就在于3,4,5三步, mmap无需像传统IO一样操作数据需要通过CPU拷贝将OS缓冲区的数据拷贝到用户缓冲区,因此在第3步和第4步也就无需进行CPU的数据拷贝。
2.sendfile
sendfile 是一种零拷贝技术,用于在文件描述符之间直接传输数据而无需在用户空间和内核空间之间进行额外的数据复制。
主要用于高效地将文件内容发送到网络套接字,通常在网络编程中发挥作用。
sendfile流程,如下图所示:
主要包含如下步骤:
- 应用程序调用sendFile函数指出源描述符和目标描述符,IO开始进行上下文切换,从用户态切换到内核态。
- DMA控制器将磁盘中的数据,拷贝到OS缓冲区。
- CPU将OS缓冲区(源描述符)的数据拷,贝到Socket缓冲区(目标描述符)。
- DMA控制器将Socket缓冲区中的数据拷贝到网卡中完成数据发送。
- 进行上下文切换,从内核态切换到用户态,一次数据发送流程结束。
可以发现,sendfile实现的零拷贝仅仅发生了2次上下文切换以及3次拷贝(2次DMA拷贝 1次CPU拷贝)。
3.splice
splice 是一种零拷贝技术,用于在两个文件描述符之间直接传输数据而无需在用户空间和内核空间之间进行额外的数据复制。
splice 避免了传统数据传输中需要中间缓冲区的情况,直接将数据从源文件描述符传输到目标文件描述符。
splice 主要用于在文件描述符之间传输数据,通常在网络编程中发挥作用,将数据从一个套接字传输到另一个套接字。
零拷贝应用场景
零拷贝技术在许多应用场景中发挥着重要作用,特别是在需要高性能、低延迟的场景。
1.网络通信
在网络通信中,零拷贝技术可以用于将数据从应用程序传输到网络套接字,或者从网络套接字接收数据到应用程序,提高网络传输性能。
这对于高吞吐量、低延迟的网络应用非常重要,如网络服务器、实时音视频传输等。
2.文件传输和复制
在文件传输和复制操作中,零拷贝技术可以用于将文件内容从一个文件复制到另一个文件,避免了在用户空间和内核空间之间的数据复制,提高了文件操作的效率。
3.数据库系统
数据库系统中的存储引擎和日志系统通常使用零拷贝技术,以实现对数据的高效读写,这对于提高数据库性能和响应速度非常重要。
4.高性能计算:
在科学计算和高性能计算中,大规模数据集的读写和处理可以通过零拷贝技术来提高效率,减少数据传输的开销。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》