wikiwi
🇰🇷
🇺🇸
🇪🇸
🇮🇳
🇯🇵
제로 카피
S4
guest-mxcqo
2026-11-07 09:11:03
# 제로 카피 컴퓨터 과학에서 제로 카피(zero-copy)는 CPU가 데이터를 복사할 필요 없이 메모리 공간 간의 데이터 전송을 가능하게 하는 기술을 말한다. 불필요한 복사를 피함으로써 제로 카피 방식은 CPU 사용량과 메모리 대역폭을 최소화하여 상당한 성능 향상을 이끌어낸다. 이는 네트워크 통신, 파일 I/O, 멀티미디어 처리와 같이 높은 데이터 처리량을 요구하는 응용 프로그램에 매우 중요하다. 제로 카피 프로그래밍 기술은 사용자 공간 프로세스 내에서 데이터를 교환할 때(예: 둘 이상의 스레드 간 등)나, 둘 이상의 프로세스 간에 데이터를 교환할 때(참고: 생산자-소비자 문제), 또는 운영체제의 커널 공간 내에서, 혹은 사용자 공간 프로세스와 커널 공간 사이에서 데이터에 접근/복사/이동해야 할 때 사용할 수 있다. 일반적으로 사용자 공간 프로세스가 고수준 소프트웨어 인터페이스를 통해 장치(예: 디스크, NIC 등)에서 데이터를 읽거나 쓰는 것과 같은 시스템 작업을 실행해야 하거나, 한 장치에서 다른 장치로 데이터를 이동해야 할 때는 운영체제에 의해 커널 공간에서 실행되는 하나 이상의 시스템 호출을 수행해야 한다. 데이터를 원본에서 대상으로 복사하거나 이동해야 하는데 둘 다 커널 공간 내에 위치하는 경우(예: 두 파일, 파일과 네트워크 카드 등), 최신 운영체제에서 제공하는 특수한(제로 카피) 시스템 호출을 사용하면 커널 공간에서 사용자 공간으로, 그리고 다시 사용자 공간에서 커널 공간으로 데이터를 옮기는 불필요한 복사를 피할 수 있다. 장치 드라이버, 파일 시스템, 네트워크 프로토콜 스택과 같은 운영체제 요소의 제로 카피 버전은 특정 응용 프로그램(실행 시 프로세스가 됨)의 성능을 크게 향상시키고 시스템 자원을 보다 효율적으로 활용하게 한다. 데이터 복사나 처리가 기계의 다른 부분에서 병렬로 진행되는 동안 CPU가 다른 작업을 수행할 수 있게 함으로써 성능이 향상된다. 또한, 제로 카피 작업은 사용자 공간과 커널 공간 사이의 시간 소모적인 문맥 교환 횟수를 줄여준다. 비교적 간단한 작업인 데이터 복사 작업을 수행하기 위해 고성능 CPU를 사용하는 것은 다른 단순한 시스템 구성 요소가 복사를 대신할 수 있다면 낭비이므로, 시스템 자원을 더 효율적으로 활용할 수 있게 된다. 예를 들어, 전통적인 방식으로 파일을 읽어 네트워크로 전송하려면 읽기/쓰기 주기마다 2번의 추가 데이터 복사(커널에서 사용자 공간으로 1번 + 사용자 공간에서 커널로 1번)와 4번의 문맥 교환이 필요하다. 이러한 추가 데이터 복사는 CPU를 사용한다. 파일 데이터에 대한 mmap과 쓰기 호출 주기를 사용하여 해당 파일을 전송하면, 쓰기 호출당 문맥 교환이 2번으로 줄고 이전의 2번의 추가 사용자 데이터 복사를 피할 수 있다. 동일한 파일을 제로 카피를 통해 전송하면 문맥 교환이 sendfile 호출당 2번으로 줄어들며 모든 CPU 추가 데이터 복사(사용자 공간 및 커널 공간 모두)를 제거한다. 제로 카피 프로토콜은 네트워크 링크의 용량이 CPU의 처리 용량에 근접하거나 초과하는 초고속 네트워크에서 특히 중요하다. 이러한 경우 CPU는 전송되는 데이터를 복사하는 데 거의 모든 시간을 소비할 수 있으며, 결과적으로 통신 속도를 링크 용량 이하로 제한하는 병목 현상이 발생한다. 업계에서 사용하는 경험 법칙에 따르면, 들어오는 데이터 1비트를 처리하는 데 대략 1개의 CPU 클럭 사이클이 필요하다. 초기 구현 사례 중 하나인 IBM OS/360에서는 프로그램이 채널 서브시스템에 명령하여 한 파일이나 장치의 데이터 블록을 버퍼로 읽어 들이고, 데이터를 이동하지 않고 동일한 버퍼에서 다른 곳으로 기록할 수 있도록 했다. 제로 카피 소프트웨어를 만들기 위한 기술로는 직접 메모리 접근(DMA) 기반 복사와 메모리 관리 장치(MMU)를 통한 메모리 매핑 사용이 있다. 이러한 기능은 특정 하드웨어 지원이 필요하며 일반적으로 특정 메모리 정렬 요구 사항을 수반한다. 이기종 시스템 아키텍처(HSA)에서 사용하는 최신 접근 방식은 CPU와 GPU, 그리고 기타 프로세서 간에 포인터 전달을 용이하게 한다. 이를 위해서는 CPU와 GPU를 위한 통합 주소 공간이 필요하다. 여러 운영체제는 특정 API를 통해 사용자 데이터 및 파일 내용의 제로 카피를 지원한다. 대부분의 대중적인 운영체제에서 사용할 수 있는 잘 알려진 시스템 호출/API 중 일부만 아래에 나열한다. 노벨 넷웨어는 이벤트 제어 블록(ECB)을 통해 제로 카피 형태를 지원한다(참고: NCOPY). 일부 DR-DOS 버전의 내부 COPY 명령어는 1992년부터 COMMAND.COM이 복사할 파일이 넷웨어 파일 서버에 저장되어 있음을 감지하면 이를 수행하며, 그렇지 않으면 일반 파일 복사로 돌아간다. DR DOS 6.0(1991년) 및 MS-DOS 6.0(1993년)부터의 외부 MOVE 명령어는 원본과 대상이 동일한 논리 볼륨에 위치할 경우 내부적으로 RENAME을 수행하여(파일 데이터를 물리적으로 복사하는 대신 파일 시스템의 디렉터리 엔트리만 수정) 처리한다. 리눅스 커널은 다음과 같은 다양한 시스템 호출을 통해 제로 카피를 지원한다. 이들 중 일부는 POSIX에 명시되어 있어 BSD 커널이나 IBM AIX에도 존재하며, 일부는 리눅스 커널 API 고유의 기능이다. FreeBSD, NetBSD, OpenBSD, DragonFly BSD 등은 최소한 다음 시스템 호출을 통해 제로 카피를 지원한다. macOS는 커널의 FreeBSD 부분에서 동일한 시스템 호출을 제공하므로(매뉴얼 페이지에도 여전히 BSD로 태그되어 있음) 제로 카피를 지원해야 한다. 오라클 솔라리스는 최소한 다음 시스템 호출을 통해 제로 카피를 지원한다. 마이크로소프트 윈도우는 최소한 다음 시스템 호출을 통해 제로 카피를 지원한다. 자바 입력 스트림은 기반 운영체제도 제로 카피를 지원하는 경우 java.nio.channels.FileChannel의 transferTo() 메서드를 통해 제로 카피를 지원할 수 있다. RDMA(원격 직접 메모리 접근) 프로토콜은 제로 카피 기술에 깊게 의존한다.
My Wiki Documents
제로 카피