关于零拷贝技术你了解多少(零拷贝到底是什么)
关于零拷贝技术你了解多少(零拷贝到底是什么)CPU拷贝是否使用用户层缓存用户层直接I/O,就是磁盘数据直接拷贝到用户层缓存,不用内核层的数据拷贝。零拷贝在数据由磁盘向网卡或其他设备流动,或者从网卡或其他设备向磁盘流动,数据要经过多次的拷贝,以及用户态和核心态上下文多次切换的应用场景中才能够发挥作用。拷贝方式
以名解意零拷贝,从字面意思理解,就是零次拷贝,没有数据拷贝。进一步去分析,是什么没有数据拷贝,是用户层进程没有拷贝,这种零拷贝不算是真正的零拷贝。
进一步分析,CPU也不参与数据拷贝,CPU和用户进程都没有数据拷贝,就能够节省CPU的工作量,节省用户层与内核层之间的切换,通过DMA技术、管道技术、内存区域映射技术等实现CPU不参与数据拷贝和减少用户层和内核层的切换次数,以提高程序读写性能的方式。
以上就是主流零拷贝的思路,就是尽量减少用户层和核心层的上下文切换、尽量不用CPU拷贝,不用用户层缓存区,其实除此之外还有两种零拷贝的思路。
写时复制方案,就是多个进程共享一个内存空间的数据,当一个进程需要修改数据的时候,将数据拷贝到自己进程的地址空间;如果只是读取操作,则不需要拷贝数据,也就是零拷贝。
用户层直接I/O,就是磁盘数据直接拷贝到用户层缓存,不用内核层的数据拷贝。
应用场景零拷贝在数据由磁盘向网卡或其他设备流动,或者从网卡或其他设备向磁盘流动,数据要经过多次的拷贝,以及用户态和核心态上下文多次切换的应用场景中才能够发挥作用。
核心逻辑拷贝方式
拷贝方式 |
是否使用用户层缓存 |
CPU拷贝 |
DMA拷贝 |
上下文切换 |
系统调用 |
是否零拷贝 |
传统方式(read write) |
是 |
2 |
2 |
4 |
read/write |
否 |
内存映射(mmap write) |
否 |
1 |
2 |
4 |
mmap/write |
是 |
sendfile |
否 |
1 |
2 |
2 |
sendfile |
是 |
sendfile DMA Gather Copy |
否 |
0 |
2 |
2 |
sendfile |
是 |
splice |
否 |
0 |
2 |
2 |
splice |
是 |
传统方式(read write)
内存映射(mmap write)内存映射(mmap write)
SendfileSendfile
sendfile DMA Gather Copysendfile DMA Gather Copy
splicesplice
总结理解零拷贝,关键的是理解什么是零拷贝,涉及到硬件设备、内核层、用户层缓存数据区之间数据的拷贝,以及它们之间数据拷贝采用的技术,有CPU拷贝、DMA拷贝、内存区域映射免拷贝等。
理解了这些框架,明白了零拷贝的真正含义,遇到任何的问题就能够迎刃而解。