zero-copy 基本思想:
数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现CPU的零参与,彻底消除CPU在这方面的负载。实现零拷贝用到的最主要技术是DMA数据传输技术和内存区域映射技术。
传统的网络数据报处理,需要经过网络设备到操作系统内存空间,系统内存空间到用户应用程序空间这两次拷贝,同时还需要经历用户向系统发出的系统调用。而零拷贝技术则首先利用DMA技术将网络数据报直接传递到系统内核预先分配的地址空间中,避免CPU的参与;同时,将系统内核中存储数据报的内存区域映射到检测程序的应用程序空间,检测程序直接对这块内存进行访问,从而减少了系统内核向用户空间的内存拷贝,同时减少了系统调用的开销,实现了真正的“零拷贝”。
还有一种方式是在用户空间建立一缓存,并将其映射到内核空间,类似于linux系统下的kiobuf技术。
ZMQ zero-copy:
ZMQ 的API可以让你直接发送和接收消息,不用考虑缓存的问题。 消息是由ZMQ在后台收发的,所以使用零拷贝需要一些额外的工作。
做零拷贝时,使用zmq_msg_init_data()函数创建一条消息,其内容指向某个已经分配好的内存区域,然后将该消息传递给zmq_send()函数。创建消息时,你还需要提供一个用于释放消息内容的函数,ZMQ会在消息发送完毕时调用。
在接收消息的时候无法使用零拷贝:ZMQ会将收到的消息放入一块内存区域供你读取,但不会将消息写入程序指定的内存区域。
ZMQ的多段消息很好地支持零拷贝。在传统消息系统中,你需要将不同缓存中的内容保存到同一个缓存中,然后才能发送。ZMQ会将来自不同内存区域的内容作为消息的一个帧进行发送。而且在ZMQ内部,一条消息会作为一个整体进行收发,因而非常高效。