ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Zero Copy 学习总结

Zero Copy 学习总结

原创 Linux操作系统 作者:xz43 时间:2020-01-02 17:30:34 0 删除 编辑

定义

零复制(英语:Zero-copy;也译零拷贝)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。

传统IO读写方式

在读取文件数据,然后发送到网络的这个场景中,传统IO读写方式的过程如下。


由图可知,整个过程总共发生了 4 次拷贝和 4 次用户态和内核态的切换。其中

  1. 把磁盘中文件拷贝到kernel buf

  2. 把kernel buf拷贝到user buf

  3. 把user buf拷贝到socket 中的kernel buf

  4. 把socket buffer 拷贝到网卡设备的buffer

所以说,一共拷贝4次,而且kernel mod和user mod的切换也是4次。用户态和内核态的切换如下。借个网上的图。


zero copy技术

Linux 2.1 内核开始引入了sendfile函数。省去了将操作系统的 read buffer 拷贝到程序的buffer,以及从程序buffer拷贝到socket buffer的步骤,而是直接将kernel buf 拷贝 到 socket buf。 实际上就是把上面的第2,3两个步骤整合了。

减少不必要的内核缓冲区跟用户缓冲区间的拷贝,从而减少CPU的开销和内核态切换开销,达到性能的提升。

transferTo()方法使得磁盘文件的数据,首先被直接拷贝到一个read buffer(kernel buffer)中,然后 kernel buffer 的数据拷贝到 socket buffer 中,最后将 socket buffer 中的数据拷贝到网卡设备(protocol engine)中进行传输。

zero copy下,同样的读取文件然后通过网络发送出去,只需要拷贝 3 次,内核态和用户态的切换从原来的4次减少为2次。


Linux2.4 内核对sendfile做了改进,如图:

改进后,执行步骤如下:

  1. 将文件拷贝到kernel buffer中;
  2. 向socket buf中写入当前要拷贝数据在 kernel buffer 中的位置和偏移量;
  3. 根据socket buffer中的位置和偏移量,直接将kernel buffer的数据拷贝到网卡protocol buffer中。

经过上述过程,数据只经过了2次copy就从磁盘传送出去了。这才是真正的Zero-Copy( 这里的零拷贝是针对kernel来讲的,数据在kernel模式下是Zero-Copy
正是因为 Linux2.4 的内核做了改进,Java中的TransferTo()才实现了真正的 Zero-Copy,如下图:


Zero-Copy技术的使用场景有很多,比如Kafka, 又或者是Netty等,可以大大提升程序的性能。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9399028/viewspace-2671693/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-11-16

  • 博文量
    420
  • 访问量
    1743776