2013-12-22 53 views
2

我发现Netty documentation表示他们在内置的ByteBuffer中有“透明零拷贝”功能。但是在阅读之后,我注意到它没有提到任何内核空间和用户空间切换,只是重用缓冲区。Netty的零拷贝是否与操作系统级零拷贝不同?

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

回答

0

根据Wikipedia

零拷贝描述了CPU不会从一个内存区域执行数据复制任务到另一台计算机的操作。

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

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

换句话说,虽然Netty只能在用户空间中工作,但将其方法称为“零复制”仍然有效。但是,如果操作系统不使用或支持真正的零复制,则有可能在Netty-powered程序创建的数据将通过网络发送时,数据仍然会从用户空间复制到内核空间,从而实现真正的零复制将无法实现。

+0

据我所知。所有操作系统都不支持真正的零拷贝功能。 –

3

Netty还支持使用FileRegion,该FileRegion允许传输FileChannel内容而不将其复制到用户空间。

+0

据我所知。它取决于Netty工作的操作系统。如果该功能不受OS支持。它是非零拷贝。 –

2

Zero-Copy在netty的世界中有两种方法。首先,如果您的平台支持零存储器复制,则可以将一个DefaultFileRegion写入Channel,ChannelHandlerContrext或ChannelPipeline。

其次,CompositeByteBuf是一个虚拟缓冲区,它将多个缓冲区显示为一个合并缓冲区。所以你可以将一些byteBufs复合到一个CompositeByteBuf中,而不需要复制。