进一步分析表明,CPU不参与数据复制,CPU和用户进程都没有数据复制,可以节省CPU的工作量,节省用户层和内核层的切换。通过DMA技术、流水线技术和内存区域映射技术,使CPU不参与数据复制,减少用户层和内核层的切换次数,从而提高程序读写性能。
以上是零拷贝的主流思路,就是尽量减少用户层和核心层的上下文切换,尽量不使用CPU拷贝,不使用用户层缓冲。其实零复制还有另外两个思路。
写时复制方案是多个进程共享一个内存空间中的数据,当一个进程需要修改数据时,将数据复制到自己进程的地址空间中;如果只是读操作,就不需要拷贝数据,也就是零拷贝。
用户层直接I/O是指磁盘数据直接拷贝到用户层缓存,而不需要内核层的数据拷贝。
拷贝方式
是否使用用户层缓存
CPU拷贝
DMA拷贝
上下文切换
系统调用
是否零拷贝
传统方式(读写)
是
2
2
四
读/写
不
存储器映射(mmap写入)
不
一个
2
四
mmap/写
是
发送文件
不
一个
2
2
发送文件
是
发送文件DMAGatherCopy
不
0
2
2
发送文件
是
接合
不
0
2
2
接合
是
传统方式(读写)
存储器映射(mmap写入)
发送文件
发送文件DMAGatherCopy
接合
理解了这些框架和零拷贝的真正含义,遇到任何问题都一定能解决。