• 作者:老汪软件技巧
  • 发表时间:2024-09-08 15:02
  • 浏览量:

零拷贝是一种数据传输的技术,也称为零拷贝IO(Input/Output)。在零拷贝技术中,数据可以直接从一个存储设备传输到另一个存储设备,而无需在中间进行任何数据复制或拷贝操作。

基本概念介绍IO实现方式普通IO

程序进行一次文件读取与发送的整体动作如下所示:

用户会对内核发送read()和wirte()两个指令,这会带来4次内核态与用户态之间的切换以及2次CPU的拷贝。

mmap

mmap技术是常见的NIO技术之一,RocketMQ底层使用的就是mmap。与前面提到的read()和wirte()相比,mmap使用mmap()指令替代了read(),mmap的好处是使用内存地址的映射代替了文件从内核缓冲区到用户态的CPU复制,一定程度上提升了效率。

mmap会带来4次内核态与用户态之间的切换以及1次CPU的拷贝。

sendfile

我们可以看到,mmap技术还是会带来多次的CPU复制与上下文切换,如果我们仅仅是从磁盘中读取文件,之后原封不动的输出,那么有没有更便捷高效的方式呢?sendfile就可以满足这种诉求。

sendfile只会有一次sendfile()指令的调用,Kafka采用的就是这种方式,有2次内核态与用户态之间的切换以及1次CPU的拷贝。

splice

还有一种NIO的实现方式为splice,splice 系统调用在内核缓冲区和 socket 缓冲区之间建立管道来传输数据,避免了两者之间的 CPU 拷贝操作。

小结

总结几种IO方式如下:

IO方式CPU拷贝次数上下文切换次数

传统IO

mmap

sendfile

splice