쓰기 시 복사 (copy-on-write)
한 줄 정의: 복사본을 즉시 만들지 않고 공유하다가 수정이 일어날 때 비로소 실제로 복제하는 기법입니다.
쉽게 풀면
똑같은 내용을 복사할 때 처음부터 데이터를 전부 베끼면 시간과 메모리가 낭비됩니다. 그래서 일단은 같은 실물을 함께 가리키게 해 두고 읽기만 하는 동안은 그대로 씁니다. 누군가 값을 고치려는 순간에만 그 부분을 진짜로 복사해 자기 것으로 만듭니다. 대부분의 복사본이 수정되지 않는다는 점을 노린 게으른 전략입니다.
왜 중요한가
프로세스 생성 시 부모의 메모리를 전부 복사하지 않고도 독립성을 보장할 수 있어 운영체제의 기본 기법이 되었습니다. 파일 시스템의 스냅숏, 컨테이너 이미지의 계층, 함수형 언어의 불변 자료구조 구현 등 여러 분야에서 같은 원리가 쓰입니다. 자원을 아끼면서도 의미상으로는 완전한 복사본을 제공한다는 점이 핵심 가치입니다.
논문에서는 이렇게 쓰입니다
"쓰기 시 복사 덕분에 프로세스 분기 직후에는 물리 메모리 사용량이 거의 증가하지 않았다."
자식 프로세스를 만들어도 실제로 메모리를 따로 쓰기 전까지는 복사가 일어나지 않았다는 뜻입니다.
조금 더 깊게 보면
메모리에서는 공유 페이지를 읽기 전용으로 표시해 두었다가 쓰기 시도가 페이지 폴트를 일으키면 커널이 그 페이지만 복제하고 권한을 되돌립니다. 파일 시스템에서는 블록을 제자리에서 고치지 않고 새 블록에 쓴 뒤 참조를 바꾸는 방식으로 구현되어, 스냅숏과 원자적 갱신을 자연스럽게 얻습니다. 어느 경우든 참조 개수를 관리해 마지막 참조가 사라질 때 자원을 회수해야 합니다.
주의할 점
얕은 복사와 깊은 복사 구분에서, 쓰기 시 복사는 겉보기에는 깊은 복사처럼 동작하면서 실제 복제를 미루는 절충안입니다. 복사 자체는 빠르지만 첫 쓰기 시점에 지연이 몰려 실시간성이 중요한 환경에서는 예측 가능성이 떨어질 수 있습니다.