Netty 的零拷贝与操作系统级别的零拷贝有什么不同吗?



我发现Netty文档说他们在ByteBuffer中的构建中有"透明零拷贝"功能。但在阅读之后,我注意到它没有提到任何内核空间和用户空间切换,只是提到了重用缓冲区。

所以我想知道Netty的"零拷贝"功能与操作系统级别的"零复制"(这意味着减少从用户空间内存到内核空间内存的拷贝)不同吗?

根据维基百科:

Zero Copy描述了CPU不执行将数据从一个内存区域复制到另一个内存区的任务的计算机操作。

操作系统级零拷贝涉及避免在将数据发送到硬件驱动程序(网卡或磁盘驱动器)之前将内存块从一个位置复制到另一个位置(通常从用户空间复制到内核空间),反之亦然。

Netty zero-copy正在讨论在Java级别(仅限用户空间)优化数据操作。它们的ChannelBuffer允许读取多字节缓冲区的内容,而无需实际复制它们的内容。

换句话说,虽然Netty只在用户空间中工作,但将他们的方法称为"零拷贝"仍然有效。然而,如果操作系统不使用或不支持真正的零拷贝,那么当由Netty驱动的程序创建的数据将通过网络发送时,数据仍将从用户空间复制到内核空间,从而无法实现真正的零复制。

Netty还支持使用FileRegion,它允许在不将FileChannel内容复制到用户空间的情况下传输FileChannel内容。

零拷贝在网络世界中有两种方式。

首先,如果您的平台支持零内存复制,则可以将DefaultFileRegion写入Channel、ChannelHandlerControl或ChannelPipeline。

其次,CompositeByteBuf是一个虚拟缓冲区,它将多个缓冲区显示为单个合并缓冲区。因此,您可以将一些字节Buf合成为一个CompositeByteBuf,并且它不需要复制。

相关内容

最新更新