Использование 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()
вам не нужно переключать контекст между ядром и пространством пользователя. Единственный буфер сопоставляется с физической памятью, при чтении и отправке используются одни и те же блоки.