공룡호가 사는 세상 이야기

zero copy 기법을 이용하면 리눅스나 유닉스에서 실행되는 I/O 위주의 자바 애플리케이션의 성능을 향상시킬 수 있다. zero copy 기법은 중간 버퍼 간의 불필요한 데이터 복사를 피하게 해 주고, 사용자와 커널 사이의 context switching을 효과적으로 줄여줄 수 있다.
데이터를 소켓을 이용하여 전송하려 할 때, 기존 방식은 디스크에서 해당 데이터를 읽어 커널-사용자 간 경계를 넘어 애플리케이션 단계로 밀어 올리고, 그 것을 다시 소켓에 쓰는 과정에서 커널-사용자 경계를 다시 넘는다. 결국 데이터를 가져왔다가 바로 보낼 건데, 비 효율적으로 중계자를 두고 있다. 이 차이는 매우 적지만, 전송해야 할 데이터 양이 많아질 수록 그 차이는 현격하게 차이나기 시작한다.

자바 클래스 라이브러리에서는 리눅스와 유닉스 시스템에서 java.nio.channels.FileChannel 클래스의 transferTo() 메소드를 통해 zero copy를 지원한다. 이 방법이 왜, 그리고 얼마나 효율적인지 알아보자.

기존 방식의 context switching
기존 방식에서의 맥락 전환


개선된 방식을 사용할 때의 context switching
transferTo()를 사용할 때의 맥락 전환

궁금하지 않은가? 그리고 얼마나 효율적일지도.

원문 : http://www.ibm.com/developerworks/kr/library/j-zerocopy/