Copy-on-Write(COW)는 데이터 복사 시 실제 수정이 발생하기 전까지 원본을 공유하다가, 수정 시점에만 새 복사본을 만드는 최적화 기법이다. OS의 fork(), Redis AOF, Git, 파일시스템 등 광범위하게 사용된다.
동작 원리
fork() 호출:
부모: [페이지A] [페이지B] [페이지C]
자식: ↑ ↑ ↑ (같은 물리 페이지 공유)
모든 페이지 → 읽기 전용 표시
자식이 페이지B 수정 시:
→ Page Fault 발생
→ OS: 페이지B 복사 생성
→ 자식: [페이지A↑] [페이지B'] [페이지C↑]
활용 사례
| 분야 | COW 활용 |
|---|
| OS fork() | 자식 프로세스 메모리 지연 복사 |
| 파일시스템 (Btrfs, ZFS) | 블록 수정 시 새 블록 생성 |
| Redis | RDB 스냅샷 생성 시 fork() 활용 |
| Git | 객체 저장소의 불변성 |
| C++ std::string | 구현체에 따라 COW 적용 |
코드 예시 (Python list)
python
# Python의 리스트 슬라이싱은 COW가 아닌 즉시 복사
# Rust의 Cow<T>가 COW 명시적 구현
import os
pid = os.fork()
if pid == 0:
# 자식: 이 시점까지 부모와 메모리 공유
import time; time.sleep(1) # COW 확인 위한 지연
data = list(range(10**6)) # 이때 COW 복사 발생
print(f"자식 PID: {os.getpid()}")
else:
os.wait()
관련 개념