2013-12-22 5 views
2

찾았습니다. documentation은 빌드에 "투명 0 복사"기능이 있다고합니다. 그러나 읽은 후에는 커널 공간과 사용자 공간을 바꾸지 않고 버퍼를 재사용하는 것에 대해서만 언급합니다.Netty의 Zero Copy는 OS 레벨 Zero Copy와 다른가요?

그래서 Netty의 "Zero Copy"기능은 OS 레벨 "Zero Copy"(사용자 공간 메모리에서 커널 공간 메모리로 복사본을 줄이는 것을 의미합니다)와는 다릅니다. Wikipedia에 따르면

답변

0

:

제로 복사 CPU가 다른 하나 개의 메모리 영역에서 데이터를 복사하는 작업을 수행하지 않는 컴퓨터 작업을 설명합니다.

OS 레벨의 제로 카피 반대로 하드웨어 드라이버 (네트워크 카드 또는 디스크 드라이브) 또는 데이터를 전송하기 전에 (공간 커널 통상적으로 사용자 공간에서) 한 위치에서 다른 위치로 복사하는 메모리 블록을 피하는 것을 포함한다.

Netty zero copy는 Java 레벨 (사용자 영역 전용)에서 데이터 조작을 최적화하는 것을 말합니다. 그들의 ChannelBuffer은 실제로 내용을 복사하지 않고 여러 바이트 버퍼의 내용을 읽을 수 있습니다.

즉, Netty는 사용자 공간에서만 작동하지만 접근 방식을 "제로 사본"이라고 부르는 것은 유효합니다. 그러나 OS가 true zero copy를 사용하지 않거나 지원하지 않는다면, Netty-powered 프로그램에 의해 생성 된 데이터가 네트워크를 통해 전송 될 때 데이터는 사용자 공간에서 커널 공간으로 계속 복사 될 수 있으므로 사실상 zero-copy 성취되지 않을 것이다.

+0

내가 아는 바로는. 진정한 zero-copy 기능은 모든 OS에서 지원되지 않습니다. –

3

Netty는 FileChange 콘텐츠를 사용자 공간에 복사하지 않고 전송할 수있는 FileRegion의 사용도 지원합니다.

+0

내가 아는 한. Netty가 작동하는 OS에 따라 다릅니다. OS가 지원하지 않는 기능. 0이 아닌 복사입니다. –

2

제로 카피는 netty의 세계에서 두 가지 수단을 가지고 있습니다.

먼저 플랫폼이 메모리 복사를 지원하면 Channel, ChannelHandlerContrext 또는 ChannelPipeline에 DefaultFileRegion을 쓸 수 있습니다.

두 번째로, CompositeByteBuf는 여러 버퍼를 단일 병합 버퍼로 표시하는 가상 버퍼입니다. 따라서 일부 byteBufs를 하나의 CompositeByteBuf로 합성 할 수 있으며 복사 할 필요가 없습니다.