我发现Netty documentation表示他们的内置版ByteBuffer
中有“透明零拷贝”功能。但在阅读之后,我注意到它没有提到任何内核空间和用户空间切换,只是重用缓冲区。
所以我想知道Netty的“零拷贝”功能与操作系统级别“零拷贝”不同(这意味着将副本从用户空间内存减少到内核空间内存)?
答案 0 :(得分:3)
Netty还支持使用FileRegion,它允许传输FileChannel内容而不将其复制到用户空间。
答案 1 :(得分:2)
零拷贝在netty的世界中有两种方式。
首先,如果您的平台支持零内存复制,您可以将DefaultFileRegion写入Channel,ChannelHandlerContrext或ChannelPipeline。
其次,CompositeByteBuf是一个虚拟缓冲区,它将多个缓冲区显示为单个合并缓冲区。因此,您可以将一些byteBuf复合到一个CompositeByteBuf中,并且它不需要复制。
答案 2 :(得分:0)
根据Wikipedia:
零拷贝描述了CPU不执行将数据从一个存储区复制到另一个存储区的任务的计算机操作。
操作系统级零拷贝涉及在将数据发送到硬件驱动程序(网卡或磁盘驱动器)之前避免将内存块从一个位置复制到另一个位置(通常从用户空间到内核空间),反之亦然。
Netty零拷贝正在谈论优化Java级别的数据操作(仅限用户空间)。他们的ChannelBuffer
允许读取多字节缓冲区的内容而不实际复制其内容。
换句话说,虽然Netty仅在用户空间中工作,但将其方法称为“零拷贝”仍然有效。但是,如果操作系统不使用或支持真正的零拷贝,那么当Netty驱动的程序创建的数据将通过网络发送时,数据仍然可以从用户空间复制到内核空间,因此真正的零拷贝不会实现。