我发现Netty 文档说他们的内置ByteBuffer中有“透明零拷贝”功能。但是在阅读之后,我注意到它没有提到任何内核空间和用户空间切换,只提到了对缓冲区的重用。
所以我想知道Netty的“零拷贝”特性与OS级别的“零拷贝”(这意味着将用户空间内存的拷贝减少到内核空间内存)不同吗?
发布于 2013-12-22 08:57:27
根据维基百科
零拷贝描述计算机操作,其中CPU不执行将数据从一个内存区域复制到另一个内存区域的任务。
OS级零拷贝包括避免将内存块从一个位置复制到另一个位置(通常从用户空间复制到内核空间),然后再将数据发送到硬件驱动程序(网卡或磁盘驱动器),反之亦然。
Netty零拷贝是关于在Java级别优化数据操作(仅限于用户空间)。它们的ChannelBuffer允许读取多字节缓冲区的内容,而无需实际复制它们的内容。
换句话说,虽然Netty只在用户空间工作,但是将其方法称为“零复制”仍然是有效的。然而,如果OS不使用或支持真正的零拷贝,那么当由Netty驱动的程序创建的数据通过网络发送时,数据仍然会从用户空间复制到内核空间,从而无法实现真正的零拷贝。
发布于 2013-12-22 09:35:25
Netty还支持使用FileRegion,它允许在不将FileChannel内容复制到用户空间的情况下传输它。
发布于 2014-08-13 06:16:35
零拷贝在网络世界中有两种方式。
首先,如果您的平台支持零内存复制,则可以将DefaultFileRegion写入通道、ChannelHandlerContrext或ChannelPipeline。
其次,CompositeByteBuf是一个虚拟缓冲区,它将多个缓冲区显示为单个合并缓冲区。所以您可以将一些byteBufs组合成一个CompositeByteBuf,并且它不需要复制。
https://stackoverflow.com/questions/20727615
复制相似问题