Zero copy란?

이선협
Sunhyoup’s Story
Published in
3 min readAug 26, 2014

--

무복사 기법이라고도 불리는 Zero copy에 대해서 알아봅시다.

주로 웹 어플리케이션을 제작할 때 가장 중요한 부분 중 하나가 정적 파일입니다. 이러한 정적 파일을 통해서 페이지를 좀 더 아름답고, 동적이게 만들 수 있습니다. (물론 API만으로 이뤄진 웹 어플리케이션을 제외합니다) Zero copy는 이러한 정적 파일을 전송할 때 주로 쓰입니다.

그러면 이제 Zero copy를 사용하지 않고 평범하게 정적 파일을 전송할 경우의 문제점에 대해서 알아봅시다. 별다른 처리를 하지 않고 웹 어플리케이션에서 정적 파일을 제공할 경우 단순하게 디스크에서 파일을 읽어 소켓에 담은 뒤 응답을 합니다. 이러한 처리는 단순해서 더 손댈 필요도 없어 보입니다.

정적 파일을 전송하기 위해 서버가 하는 일을 나타낸 그림입니다.

조악한 그림이지만 위 그림을 보시면 서버가 정적 파일을 클라이언트에 전송하기 위해 하는 일을 알 수 있습니다. 일어나는 큰 사건을 순서대로 정리해봅시다.

1. 클라이언트가 서버에게 정적 파일을 요청
2. 서버의 웹 어플리케이션이 요청을 받음
3. 웹 어플리케이션(유저 영역)이 디스크에서 파일 데이터를 읽기 위해서 커널(커널 영역)이 파일 데이터를 읽도록 요청
4. 파일을 다 읽은 후 커널(커널 영역)이 다시 웹 어플리케이션(유저 영역)으로 데이터를 반환
5. 하지만 웹 어플리케이션(유저 영역)은 클라이언트에 반환하기 위해서 소켓에 파일 데이터를 넣어야 하므로 다시 커널(커널 영역)에 요청
6. 커널(커널 영역)은 소켓을 처리

정적 파일 데이터가 커널 / 유저 영역 사이를 넘나들 때에는 매번 복사가 일어납니다. 위 4, 5번 항목을 보면 불필요한 Context Switching으로 CPU와 메모리를 소모하고 있습니다.

Zero copy는 이러한 문제점을 해결하는 방법입니다. 커널 영역에서 파일 데이터를 읽은 후 웹 어플리케이션으로 되돌아가지 않고 바로 소켓에 데이터를 담아 전합니다. 말 그대로 Zero copy(무복사) 입니다.

Reference

1. http://www.kodb.or.kr/info/info_06.php?field=&keyword=&type=techreport&page=151&dbnum=128046&mode=detail&type=techreport2. http://en.wikipedia.org/wiki/Zero-copy

--

--