13. 제로카피(zero-copy) I/O: read/write 의 복사 경로와 sendfile·mmap·splice·io_uring
문제 13 — 제로카피(zero-copy) I/O: read/write 의 복사 경로와 sendfile·mmap·splice·io_uring
게임 서버가 대용량 데이터(맵 청크·패치 파일·리플레이·대규모 브로드캐스트)를 소켓/디스크로 나를 때, 전통적 read()+write() 경로의 복사·컨텍스트 스위치 비용이 처리량을 깎는다. 다음을 설명하라.
-
전통 경로의 복사·스위치 — 파일을 소켓으로 보낼 때
read(file, buf)→write(socket, buf)가 일으키는 데이터 복사 횟수와 유저↔커널 컨텍스트 스위치 횟수를 단계별로 세어라(디스크 → 페이지 캐시 → 유저 버퍼 → 소켓 버퍼 → NIC). 어디가 낭비인가? -
제로카피의 의미 — "zero-copy" 가 정확히 무엇을 없애는지(유저 공간 왕복 복사, CPU 가 관여하는 복사) 설명하라.
sendfile()이 이 경로를 어떻게 줄이는지, DMA·scatter-gather 로 CPU 복사를 얼마나 제거하는지 논하라. -
mmap 기반 전송 —
mmap+write가 유저 버퍼 복사를 어떻게 페이지 캐시 매핑으로 대체하는지, 그리고 그 대가(페이지 폴트, TLB, 파일이 잘릴 때 SIGBUS, 작은 전송엔 비효율)를 설명하라.mmap은sendfile과 언제 다르게 선택하는가? -
splice / vmsplice / io_uring —
splice()가 파이프를 매개로 커널 내부에서 두 FD 사이를 옮기는 원리, 그리고io_uring이 시스템콜 자체를 배치·비동기화해 스위치를 줄이는(제출/완료 큐) 접근을 설명하라. 이들이 sendfile 로는 안 되는 무엇을 가능케 하는가(소켓→소켓, 변환 삽입 등)? -
게임 서버에서의 적용과 한계 — (a) 정적 패치/맵 파일 배포 vs (b) 실시간 스냅샷 브로드캐스트에서 제로카피가 이득인 경우와 아닌 경우를 구분하라. 데이터를 암호화(TLS)·압축·직렬화 해야 하면 왜 순수 제로카피가 깨지는지(커널 TLS/kTLS 로 일부 회복), 작은 패킷 다수(틱 패킷)에선 왜 이득이 적은지(고정 오버헤드·Nagle·GSO), 그리고 유저공간 버퍼 풀·
writev(scatter-gather)·MSG_ZEROCOPY로 얻는 절충을 논하라.
직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.