Использование Java для выполнения передачи данных Zero Copy между двумя или более сокетами

Кто-нибудь знает о каких-либо хороших библиотеках / пакетах API Java, которые выполняют нулевую передачу данных между двумя или более сокетами? Я знаю, что NIO API Java может выполнять нулевую передачу данных с диска на сокет и наоборот, используя методы java.nio.channels.FileChannel.transferTo и java.nio.channels.FileChannel.transferFrom соответственно. Однако, по-видимому, не поддерживается java-сокет для передачи с нулевым копированием. Кроме того, любые библиотеки Java /API, которые могут выполнять объединение системных вызовов (которые могут передавать данные из файлового дескриптора в канал и наоборот), будут плюсом, предпочтительно на платформе Linux.

Спасибо за ответ.

Кроме того, я прочитал большинство предыдущих блогов о нулевой копии, а также другие информативные сайты, такие как http://www.ibm.com/developerworks/library/j-zerocopy/; Однако, похоже, что вышеупомянутая проблема не была решена.

1 ответ

Я не знаю много о SocketChannel, но я думаю, ByteBuffer.allocateDirect() хороший выбор для вас.

Просто прочитайте данные сокета А в ByteBuffer.allocateDirect() и пусть сокет B читает из него, просто и легко.

Вот различия:

1. Старый путь

SocketA -> BufferA(пространство ядра) -> BufferB(пространство пользователя)

BufferB (пространство пользователя) -> BufferC(пространство ядра) -> SocketB

2. Нулевой способ копирования

SocketA -> DirectBuffer(может быть доступен из ядра и пространства пользователя)

DirectBuffer -> SocketB

Заметка

ИМХО, я не думаю, что мы можем сделать это напрямую SocketA -> SocketBОС необходимо загрузить данные в физическую память, прежде чем отправлять их.

========= РЕДАКТИРОВАТЬ =========

Согласно статье, на которую вы ссылались, передача FileChannel сделать это так:

введите описание изображения здесь

использование ByteBuffer.allocateDirect() вам не нужно переключать контекст между ядром и пространством пользователя. Единственный буфер сопоставляется с физической памятью, при чтении и отправке используются одни и те же блоки.

Другие вопросы по тегам