개요

제로카피란 컴퓨터 시스템에서 CPU의 개입을 받지 않고 한 메모리의 영역에서 다른 메모리의 영역으로 데이터를 카피하는 작업을 말한다. 이는 CPU 사이클을 절약하여서 네트워크나 SSD와 같이 빠른 데이터가 필요한 시스템에서 유용하게 이용된다.

원리

제로 카피는 디바이스 드라이버, 파일 시스템, 네트워크 스택과 같은 빠른 메모리/ 하드웨어 접근을 필요로 하는 곳에서 사용하여 write/ read시간을 극적으로 줄인다. 또한 제로 카피는 user space와 kernel space의 문맥교환도 줄임과 동시에 복사나 읽기에 소요되는 CPU 시간도 줄여서 시스템의 전반적인 성능향상도 도모할 수 있다. 한 예로, 파일을 네트워크에 보이는 전통적인 방식은 각각의 패킷마다 CPU의 문맥전환과 메모리 접근을 수반하여야 했지만, 제로 카피를 이용하여 이러한 시스템의 불필요한 자원소모를 줄일 수 있었다.

하드웨어 구현

초창기 제로카피는 채널을 이용하여 버퍼에 쓰고 지우는 방식으로 구현되었다. 제로카피를 구현하는 방식으로는 DMA(직접 메모리 접근)방식이나 MMU(메모리 관리 장치)와 같은것이 포함된다. 이러한 장치의 동기화에 CPU를 소모하지않고 지정된 메모리 영역을 바로 카피하게 함으로써 소요 시간을 줄일 수 있었다. 또한 이러한 작업은 메모리 정렬이나 커럽션 판단과 같은 기본적인 하드웨어 체킹또한 자동적으로 수행할 수 있다.

소프트웨어적 구현

일부 운영체제들은 제로카피를 API단에서 제공하여 사용자가 제로카피를 할 수 있도록 하였다. 리눅스에서는 다양한 시스템 콜을 이용하여 이러한 제로카피를 구현하였다. 이러한 제로카피를 위한 시스템콜은 POSIX규격에도 병시되어 있으며, 적절한 시스템 콜을 호출하여 제로카피를 수행할 수 있다. RDMA는 이러한 제로카피를 네트워크단까지 확장하여 NIC의 불필요한 CPU자원을 줄이고자한 방식이다. RDMA는 DMA와 Zero-copy에 개념적으로 의존한다.