[译] http://en.wikipedia.org/wiki/Zero-copy
"Zero-copy" 用来描述主机的CPU不执行将数据从一个存储区复制到另一个的任务。这经常是在网络分发文件的时候用来节省电力和内存。[1]
Principle
各种操作系统上的Zero-copy方式例如设备驱动程序,文件系统,网络协议栈,大大提高了某些应用程序的性能和系统资源利用率。在数据拷贝过到另外一个机器的过程中,允许CPU并行去处理另外的一个任务,性能可以有效地提高。此外, zero-copy 操作减少了用户空间和内核空间的切换时间。让一个cpu去处理大量的数据拷贝,数据拷贝本身是一个简单任务,这是一种极大浪费,如果有其他更简单的系统组件能够代为处理,将能够有效地提高资源利用率。
举个例子,读取一个文件,然后通过网络发送。如果文件足够小,并适合放在文件缓存中,传统的方式需要4个数据副本和4个cpu的上下文切换。两个数据拷贝需要用到CPU。如果通过“zero-copy”来发送,cpu上下文切换能减少到2次,CPU的数据拷贝能够减少一半,甚至不用。[1]
Zero-copy 对于网络链路的容量接近或者已经超过了CPU的处理能力的高速网络尤其重要。在这种情况下,CPU几乎全花费在了拷贝要传输的数据上,这是个瓶颈,限制了通信的速率只能低于链路容量。行业内的经验,大约一个CPU时钟周期,需要处理一个传入的数据位。
附磁盘I/O示例:
Implementation
zero-copy 技术需要使用基于DMA的复制和通过MMU的内存映射。这些功能需要特定的硬件支持,通常对于内存也有特定的要求。
Programmatic access
一些操作系统是通过特定的API来支持zero-copy的。
Linux 通过系统调用,比如sys/socket.h 中的sendfile,sendfile64来支持zero-copy。
Windows 通过TransmitFile API来支持zero-copy。
Java input streams 通过 java.nio.channels.FileChannel's transferTo() 方法来支持zero-copy,但是必须是底层操作系统能够支持zero-copy的前提下。[1]
RDMA (Remote Direct Memory Access) 协议强依赖于zero-copy技术。
See also
References
1、^ a b c Efficient data transfer through zero copy by Sathish K. Palaniappan and Pramod B. Nagaraja. September 2008
相关推荐
英文论文LyraNET: A Zero-Copy TCP/IP Protocol Stack for Embedded Operating Systems的中文翻译
两万字长文从虚拟内存、I/O 缓冲区,用户态&内核态以及 I/O 模式等等知识点全面而又详尽地剖析 Linux 系统的 I/O 底层原理,分析了 Linux 传统的 I/O 模式的弊端,进而引入 Linux Zero-copy 零拷贝技术的介绍和原理...
[done]Zero-copy Receive for vhost.pdf
Design_and_implementation_of_zero-copy_data_path_for_efficient_file_transmission
java与零拷贝技术原理的一篇英文文档,图文并茂的讲解了zero 技术与java中的实现。一篇短文,值得一看
ROS2 的零拷贝技术。不可多得的学习资料。
2. 之后,CPU控制将kernel模式数据copy到user模式下 4. 最后将kernel模式下的socket buffer的数据copy到卡设备中传送 1
indices[componentId]计算出它在这个Buffer中的第个字节,然后返回结果。下再来看下componentId(int index)的实现:pr
JAVA实现的零拷贝源代码,采用SOCKET编程举例,对比了传统的SOCKET编程和实现零拷贝的SOCKET编程
在我的 4 核 8 线程 3.5Ghz i7-3770K 上测试 ASIO 最大化 UDP 发送和接收的能力。 首先,iperf 是这样运行的: A: iperf -s -u -l 65507 B: iperf -c 127.0.0.1 -u -l 65507 -b 1000G Linux 报告最大 UDP 环回吞吐...
使用pom.xml中指定的spring boot maven插件,创建Spring Boot可执行jar很简单./mvnw清洁包它会在目标文件夹(target / zerocopy-0.0.1-SNAPSHOT.jar)下生成一个重新打包的jar(可执行jar)。建立docker映像在构建...
protobuf 零拷贝网络流样本 这是使用预分配缓冲区处理流式套接字的 ZeroCopyInputStream 和 ZeroCopyOutputStream 的示例。 如果您有缓冲池或希望使用堆栈缓冲区,这将很有用。 笔记 记录代码被注释掉。...
The Need for Aynchronous, ZeroCopy Network I/OUlrich DrepperRed Hat, Inc.The ProblemNetwork hardware changed but the socket API stayed the same Transfer rates bigger (esp ...
零拷贝 零拷贝可让您避免中间缓冲区之间的冗余数据拷贝,并减少用户空间和内核空间之间的上下文切换次数。 当您的硬件(磁盘驱动器、网卡、显卡、声卡)支持DMA (直接内存访问)时,理想的零拷贝(零 CPU 拷贝)是...
BlueskyFRC是一款使用顯示卡的運算把一般24/30fps的影片轉換到60fps流暢播放既影像濾鏡,它主要支援AMD GCN1.0架構以後的顯示卡包括APU...Zero-Copy模式,配合播放器的EVR渲染器也可以把24->60fps加幀時的gpu負荷降低。
本人用的平台是xilinx, zynqMP,提供的资源是参考的源码,可以实现在一块板子上面自动播放视频。 HDMI v4l2进, HDMI DRM出 刚好在做音视频相关的工作,其他资源会在这段时间上传吧。赚点资源分去下载其他人资源。...
Efficient data transfer through zero copy 1、The read() call causes a context switch (see Figure 2) from user mode to kernel mode. Internally a sys_read() (or equivalent) is issued to read the data ...
ZSocket是Linux Zero-copy sockets的一个Golang封装库
综合分析了现有的多种零拷贝平台的实现机制及优缺点,实现了一种具有普适意义的零拷贝捕包平台(packet capture platform based on universal zero-copy,PCPUZ)。通过直接对Linux内核中套接字缓冲区的内存分配和释放...
回 0、基于 block 的传输比基于流的传输更高效、更高级的 IO 函数 zero-copy、IO 多路复用 大大提高了 Java 网络应用的可伸缩性和实用性。基于 Reactor 线程模型。 在 Reactor 模式中,事件分发器等待某个事件或者可...