从套接字到套接字的零分配复制
zero allocation copy from socket to socket
鉴于我们有一个接受消息的套接字连接(我们称之为 c1
),
并且我们有 N 个其他套接字连接,我们将要写入完全相同的消息,
要确定我们希望它写入哪个连接,我们只需要从 c1
中读取前几个字节,但套接字上的其余字节不需要加载到 java 堆中,只是为了写入 c2
...
简而言之,我们要做的是。
我们得到了我们有字节要读取的事件 c1
我们读取前几个字节并确定我们知道我们想要将其重定向到 c2
。
我们将已经从 c1
中获取的前几个字节写入 c2
,现在我们想告诉系统直接将接下来的 N 个字节从 c1
写入 c2
(而不是 c1 -> java 堆 -> c2).
在java中有什么方法可以做到这一点吗?
更新:
虽然答案很重要,但如果您正在构建这样的东西(甚至不仅用于多路复用,还用于一些小的业务逻辑),我强烈建议您使用 ZeroMQ。
Say we are doing C++ is there a way to tell the OS to pass data from buffer to buffer without loading into application memory?
So basically the question is does Linux allow to pass N bytes from socket buffer A to socket buffer B (we can safely assume that we are on linux, and that no one else is reading or writing to A and B)
可以使用 Linux“sendfile”系统调用来做到这一点。
参考:
但是,Java I/O class 库不支持此功能。
UPDATE - 显然是支持的;请参阅 FileChannel::transferTo
方法。请参阅 的答案以获取显示此与套接字一起使用的示例。不过不清楚是否可以用于套接字到套接字的拷贝。
更新 2 - 根据 Using Java to perform Zero Copy data transfers between two or more sockets 的答案,我认为答案可能是:“不,它不能”。然而
更新 3 - 这是 RFE - https://bugs.openjdk.java.net/browse/JDK-6653061
鉴于我们有一个接受消息的套接字连接(我们称之为 c1
),
并且我们有 N 个其他套接字连接,我们将要写入完全相同的消息,
要确定我们希望它写入哪个连接,我们只需要从 c1
中读取前几个字节,但套接字上的其余字节不需要加载到 java 堆中,只是为了写入 c2
...
简而言之,我们要做的是。
我们得到了我们有字节要读取的事件 c1
我们读取前几个字节并确定我们知道我们想要将其重定向到 c2
。
我们将已经从 c1
中获取的前几个字节写入 c2
,现在我们想告诉系统直接将接下来的 N 个字节从 c1
写入 c2
(而不是 c1 -> java 堆 -> c2).
在java中有什么方法可以做到这一点吗?
更新:
虽然答案很重要,但如果您正在构建这样的东西(甚至不仅用于多路复用,还用于一些小的业务逻辑),我强烈建议您使用 ZeroMQ。
Say we are doing C++ is there a way to tell the OS to pass data from buffer to buffer without loading into application memory?
So basically the question is does Linux allow to pass N bytes from socket buffer A to socket buffer B (we can safely assume that we are on linux, and that no one else is reading or writing to A and B)
可以使用 Linux“sendfile”系统调用来做到这一点。
参考:
但是,Java I/O class 库不支持此功能。
UPDATE - 显然是支持的;请参阅 FileChannel::transferTo
方法。请参阅
更新 2 - 根据 Using Java to perform Zero Copy data transfers between two or more sockets 的答案,我认为答案可能是:“不,它不能”。然而
更新 3 - 这是 RFE - https://bugs.openjdk.java.net/browse/JDK-6653061