我发现 Netty文档说他们的内置文件中有“透明零拷贝”功能ByteBuffer
。但是在阅读之后,我注意到它没有提到任何内核空间和用户空间切换,只是关于重用缓冲区。
所以我想知道 Netty 的“零复制”功能是否不同于操作系统级别的“零复制”(这意味着减少从用户空间内存到内核空间内存的复制)?
根据维基百科:
零复制描述了 CPU 不执行将数据从一个内存区域复制到另一个内存区域的任务的计算机操作。
操作系统级别的零拷贝涉及避免在将数据发送到硬件驱动程序(网卡或磁盘驱动器)之前将内存块从一个位置复制到另一个位置(通常是从用户空间到内核空间),反之亦然。
Netty 零拷贝正在讨论在 Java 级别(仅限用户空间)优化数据操作。它们ChannelBuffer
允许读取多个字节缓冲区的内容,而无需实际复制其内容。
换句话说,虽然 Netty 只在用户空间工作,但称他们的方法为“零拷贝”仍然有效。但是,如果操作系统不使用或不支持真正的零拷贝,那么当由 Netty 驱动的程序创建的数据通过网络发送时,数据仍然会从用户空间复制到内核空间,从而实现真正的零拷贝将无法实现。
Netty 还支持使用 FileRegion,它允许传输 FileChannel 内容而不将其复制到用户空间。
Zero-Copy has two means in the netty's world.
First,if your platform support zero-memory-copy,you can write a DefaultFileRegion to the Channel, ChannelHandlerContrext, or ChannelPipeline.
Second, CompositeByteBuf is a virtual buffer which shows multiple buffers as a single merged buffer. So you can composite some byteBufs to one CompositeByteBuf, and it doesn't need copy.