3ee1be128c3e477cb1f761909bdb5fd8
Zero Copy 技术

Zero Copy 技术

考虑一个场景

用户需要读取磁盘文件上的内容然后将其通过网络发送出去,这个过程当中需要几次系统调用?几次用户态和内核态的切换?数据经过几次拷贝?

在这个过程中经历了4次数据copy的过程:

  • 调用read时,文件从磁盘拷贝到了内核缓冲区
  • 数据从内核缓冲区拷贝到用户内存缓冲区
  • 调用write时,先将user模式下的内容copy到kernel模式下的socket的buffer中
  • 最后将kernel模式下的socket buffer的数据copy到网卡设备中传送

问题

从上面的过程可以看出,数据白白从kernel模式到user模式走了一圈,浪费了2次copy(第一次,从kernel模式拷贝到user模式;第二次从user模式再拷贝回kernel模式,即上面4次过程的第2和3步骤。)。而且上面的过程中kernel和user模式的上下文的切换也是4次。

幸运的是,你可以用一种叫做Zero-Copy的技术来去掉这些无谓的copy。应用程序用Zero-Copy来请求kernel直接把disk的data传输给socket,而不是通过应用程序传输。Zero-Copy大大提高了应用程序的性能,并且减少了kernel和user模式上下文的切换。

Zero-Copy技术省去了将操作系统的read buffer拷贝到程序的buffer,以及从程序buffer拷贝到socket buffer的步骤,直接将read buffer拷贝到socket buffer.

概念

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

举例来说,如果要读取一个文件并通过网络发送它,传统方式下每个读/写周期都需要复制两次数据和切换两次上下文,而数据的复制都需要依靠CPU。通过零复制技术完成相同的操作,上下文切换减少到两次,并且不需要CPU复制数据。

零复制协议对于网络链路容量接近或超过CPU处理能力的高速网络尤为重要。在这种网络下,CPU几乎将所有时间都花在复制要传送的数据上,因此将成为使通信速率低于链路容量的瓶颈。

演进

Linux 2.1内核开始引入了sendfile函数,用于将文件通过socket传送

sendfile(socket, file, len);
top Created with Sketch.