2009-10-28 3 views
4

일부 최신 네트워크 카드는 직접 메모리 액세스를 지원하여 성능을 향상시킵니다. Java에서이 기능을 어떻게 활용할 수 있습니까?Java의 네트워크 카드에 대한 직접 메모리 액세스

JVM이이를 자동으로 제공합니까, 아니면 해당 NIC와 통신하기 위해 사용하고있는 ByteBuffers에 대해 allocateDirect를 수행해야합니까?

누구에게이 문제를 설명하는 문서가 있습니까?

+0

나는 allocateDirect가 특별히이 경우에 해당한다고 생각했습니다. C 또는 JNI 사용을 계획하지 않습니다. 향상된 대기 시간을 위해 10 기가의 NIC에서 DMA를 사용하고 싶습니다. –

+0

대기 시간을 줄이기위한 지속적인 노력 중 일부입니까? 여기에 얼마나 많은 시간을 보내고 있는지에 대한 경험적 증거가 있습니까? –

답변

1

일반적인 데스크탑/서버 JVM에서는 자바 내부에서이를 수행 할 수 없습니다. 운영체제 영역은 C 코드를 사용해야하기 때문입니다. JNI 또는 JNA에서이 작업을 수행하는 방법을 살펴보십시오. 이것이 정확하게 맞지 않으면 응용 프로그램이 약해질 수 있습니다.

2

네트워크 카드의 DMA 기능을 사용하는 것은 운영 체제 작업입니다. JVM은 운영체제가 실제로 어떻게되는지 신경 쓰지 않고 단순히 "네트워크 인터페이스"와 통신하기 위해 운영체제의 기능을 사용합니다.

0

예 - ankon의 답변이 맞습니다. Java는 가상 머신입니다 (따라서 JVM의 "VM", 실제로 Sun은 하나의 물리적 버전을 구축했습니다 - 어딘가에 표시됩니다).
Java는 PC의 어디에서나 사용할 수있는 ActiveX와는 달리 샌드 박스 외부에 도달하도록 설계된 적이 없었습니다.

ActiveX가 지난 몇 년간 브라우저를 통해 수행 한 모든 나쁜 점을 생각해보십시오. 자바에서 그런 일이 일어나기를 원하지 않을 것입니다. 비록

+0

Java 애플릿 (브라우저의 샌드 박스에서 실행)과 Java 응용 프로그램 (보안 제한 없음)간에 다소 혼란 스럽습니다. – Pool

+0

샌드 박스 모델은 애플릿에만 적용됩니다. 자바 애플리케이션은 잠재적으로 다른 것보다 많은 피해를 줄 수 있습니다. 예를 들어, 시스템 파일을 삭제합니다. 그러나 사실입니다. JNI를 사용하지 않으면 하드웨어에 직접 액세스 할 수 없습니다. – jassuncao

0

... 예를 들어, 그 ActiveX 컨트롤, 또는 DLL의 같은 하드웨어 (에 대한 액세스 권한을 가지고 자바 객체를 인스턴스화 할 수있을

당신이 - 당신은 좋겠 쓰기도해야합니다).

처리량이 문제입니다. 100MB 또는 1000MB 카드의 경우 JVM (OS에서 실행되는 VM이므로 하드웨어에서 제거 된 두 레이어 임)은로드시 처리 할 속도가 있습니까? Java 프로그램이 NIC에서 데이터를 유지하면서 (시스템의 나머지 부분에 대한 영향을 생각해보십시오.)

이 시점에서, 당신은 아마도 당신의 솔루션에 대한 열심히 노력하는 용기를 C로 작성하는 것이 더 나을 것입니다. 자바로 그 데이터를 가지고 놀 필요가 있다면, Java가 접근 할 수있는 장소 .

0

Java에서 필요한 네트워크 처리량을 얻지 못한다면 액세스하려면 C 래퍼를 작성해야합니다.

코드를 벤치마킹하여 성능 문제가 실제로 어디에 있는지 찾아 냈습니까? 우리가 JNI에 의지하지 않고 당신을 도울 가능성이 있음을 알려 주시면

관련 문제