Прямой доступ к памяти сетевой карты в Java - PullRequest
4 голосов
/ 28 октября 2009

Некоторые современные сетевые карты поддерживают прямой доступ к памяти для повышения производительности. Как я могу использовать эту функцию из Java?

Обеспечивает ли JVM это автоматически, или мне нужно сделать allocateDirect для ByteBuffers, которые я использую для связи с этим NIC?

У кого-нибудь есть документация, в которой это обсуждается?

Ответы [ 5 ]

2 голосов
/ 28 октября 2009

Задача операционной системы - использовать функцию DMA сетевой карты. JVM не особо заботится о том, как это делает ОС, а просто использует функции операционной системы для связи с «сетевыми интерфейсами».

1 голос
/ 28 октября 2009

Вы не можете сделать это изнутри Java в типичных JVM для настольных компьютеров и серверов, поскольку это область операционной системы, которая требует от вас доступа к C-коду. Посмотрите на JNI или JNA, чтобы увидеть, как это сделать. Обратите внимание, что это может сделать ваше приложение хрупким, если вы не поняли это правильно.

0 голосов
/ 29 октября 2009

Если вы не получаете необходимую пропускную способность сети в Java, то вам нужно написать обертку C для доступа к ней.

Проверяли ли вы свой код, чтобы определить, где действительно проблемы с производительностью? Если вы сообщите нам, что мы можем помочь вам, не прибегая к JNI.

0 голосов
/ 28 октября 2009

Хотя ...

вы могли бы иметь возможность создавать экземпляр объекта в Java, который имеет доступ к аппаратному обеспечению (например, к одному из этих элементов управления ActiveX или к некоторой библиотеке DLL), которую вам тоже придется написать ).

Проблема, которую я вижу, заключается в пропускной способности. С картами 100 МБ или 1000 МБ будет ли JVM (помните, это виртуальная машина, работающая в ОС, так что вы удалите несколько уровней из аппаратного обеспечения) иметь скорость, чтобы справиться с тем, что происходит под нагрузкой? Хотели бы вы, чтобы программа Java удерживала данные в вашей сетевой карте, пока она с ними работает (подумайте о влиянии на остальную часть системы)?

На данный момент вам, вероятно, лучше написать трудолюбивые интуиции вашего решения на C. И, если вам все еще нужна Java для работы с этими данными, поместите их в место, где Java сможет получить к ним доступ.

0 голосов
/ 28 октября 2009

Да, ответ Анкона правильный. Java работает в «песочнице» - виртуальной машине (отсюда «VM» в JVM; Sun фактически создала ОДНУ физическую версию - она ​​где-то отображается).
Java никогда не была разработана (намеренно) для того, чтобы выходить за пределы песочницы, в отличие от ActiveX, который может работать практически в любом месте на ПК.

Подумайте обо всех плохих вещах, которые ActiveX совершал в течение многих лет через браузер. Вы бы не хотели, чтобы это случилось с Java, не так ли?

...