학습자료/네트워크 2013. 2. 27. 14:55

디스크 <-> 커널 메모리 <-> 유저 메모리 <-> NIC 사이에는 많은 데이타 copy와 context switching(커널 <-> 유저)이 발생한다. 이러한 문제를 해결하고자 나온것이 바로 zero-copy 개념이며, zero-copy를 구현한 것이 바로 sendfile() 이라는 함수라고 할 수 있겠다.

그렇다면 얼마나 많은 copy와 context switching이 발생하길래...zero-copy라는 개념이 등장했는지...

example 1) file에서 data를 read하고, network세상으로 write하는 과정을 아래에서 확인해 보자.

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

( Zero Copy I: User-Mode Perspective By Dragan Stancevic 에서 가져옴 )

4번의 context switching이 발생하고, 4번의 data copy(디스크->커널메모리->유저메모리->커널메모리->NIC)가 발생한다.

그렇다면, zero-copy를 구현해놨다는 sendfile()을 호출할 경우에는 몇번의 context switching과 copy가 발생할까?

example 2) file에서 data를 read하고, network세상으로 write하는 과정을 아래에서 확인해 보자.

sendfile(socket, file, len);


( Zero Copy I: User-Mode Perspective By Dragan Stancevic 에서 가져옴 )

2번의 context switching과 2번의 data copy(디스크->커널메모리->NIC)가 발생함을 확인할 수 있다.

단, zero-copy를 사용하기 위해서는 NIC에 특별한 하드웨어 기능(scatter-gather DMA)이 지원되어야만 동작할 수 있다는 것을 기억하도록 하자.

이외에 "Zero Copy I: User-Mode Perspective By Dragan Stancevic"의 글에서는 mmap을 이용하여 context switching과 data copy의 횟수를 줄이는 방법도 소개하고있다. (시그널 처리에 대한 것도 눈여겨 보고 기억해두어야 할 것!!)

zero-copy에 대해서 짧게 정리해 보았다. 개인적으로 나와 같은 개발자는 이정도만 알아 두어도 어디가서 창피당하지는 않을듯하다..^^

그렇다면 모 회사에 면접을 보러갔을때 나의 상황에 맞추어 다시 한번 생각해보면...

기본적으로 zero-copy는 file - to - file 또는 file - to - socket 사이의 data 전송을 위해 만들어 졌으므로 내가 개발했던 게이트웨이 데몬 처럼 socket - to - socket 사이의 data 전송을 주로 사용하는 환경에서 zero-copy기능은 의미가 없을것으로 판단된다.

고로 면접관의 생각 역시 오류가 있었다고 판단된다.

그렇다면 나의 답변은...

나는 커널레벨에서 데몬을 작성하여 read 또는 write 할 경우 유저 레벨에서 동작하는 데몬보다는 copy가 덜 발생 할 것이라고 생각했다.

즉, socket buffer <-> 커널 메모리 ("123456789" 라는 data를 socket buffer에서 -> 커널로 read)

그러나 유저 레벨에서는 socket buffer <-> 커널 메모리 <-> 유저 메모리("123456789"라는 data를 socket buffer에서 -> 커널로 , 그리고 다시 유저로)

하지만... 커널에서 역시 read 또는 write를 호출하며, 유저에서 호출하는 read 또는 write와 동일한 것으로(유저의 read를 추적해 보면 마지막에는 결국 커널에서 호출하는 read와 동일 함)보이며,

이것은 read하여 data를 저장하는 영역(유저 메모리 공간인지 커널 메모리 공간인지의 차이) 차이만이 두개 사이에 존재(커널데몬<->유저데몬)할 지도 모른다는 생각이며, 성능향상은 매우 적을 것(오히려 더 안좋아 질 수도 있다는..)이라고 판단 된다.

T-T 추측성 발언....

PS: 위 사진과 내용은 http://www.linuxjournal.com/article/6345에서 가져왔음을 다시 한번 알려드립니다.

 


무복사 기법을 통한 효율적인 데이터 전송 -

http://www.ibm.com/developerworks/kr/library/j-zerocopy/index.html

 

자바(java)와 리눅스(linux)의 zero copy 기법 - http://knight76.tistory.com/1417

'학습자료 > 네트워크' 카테고리의 다른 글

vlan 설정(ubuntu)  (0) 2013.11.06
MTU, MSS [펌]  (0) 2013.06.17
netstat 명령어 사용법 - 펌  (0) 2013.02.13
zero configuration networking  (1) 2013.02.12
네트워크 클래스 서브넷 마스크  (0) 2012.01.17
posted by cozyboy
: