11

有谁知道在两个或多个套接字之间执行零复制数据传输的任何好的 java 库/API 包?我知道 Java 的 NIO API 可以分别使用 java.nio.channels.FileChannel.transferTo 和 java.nio.channels.FileChannel.transferFrom 方法执行从磁盘到套接字的零复制数据传输,反之亦然。但是,似乎不支持 java 套接字到套接字的零拷贝传输。此外,任何可以执行系统调用拼接(可以将数据从文件描述符传输到管道,反之亦然)的 java 库/API 将是一个加号,最好是在 linux 平台上。

感谢您的回复。

此外,我阅读了大部分关于零拷贝的先前博客以及其他信息丰富的站点,例如http://www.ibm.com/developerworks/library/j-zerocopy/;但是,上述问题似乎没有得到解决。

4

1 回答 1

-1

我对SocketChannel了解不多,但我认为对你来说ByteBuffer.allocateDirect()是个不错的选择。

只需将socket A的数据读入ByteBuffer.allocateDirect(),然后让socket B从中读取,简单易行。

以下是不同之处:

1. 老路

SocketA --> BufferA(内核空间) --> BufferB(用户空间)

BufferB(用户空间)--> BufferC(内核空间)--> SocketB

2.零拷贝方式

SocketA --> DirectBuffer(可以从内核和用户空间访问)

DirectBuffer --> SocketB

笔记

恕我直言,我认为我们不能直接制作SocketA -> SocketB,操作系统需要在发送数据之前将数据加载到物理内存中。

========= 编辑 =========

根据你提到的文章,FileChannel 的 transfer 是这样操作的:

在此处输入图像描述

使用ByteBuffer.allocateDirect()您不需要在内核和用户空间之间切换上下文。唯一的缓冲区映射到物理内存,同时读取和发送使用相同的块。

于 2014-01-03T05:54:49.197 回答