카피 온 라이트

카피 온 라이트(copy-on-write, COW, 쓰기 시 복사) 또는 암시적 공유(implicit sharing), 섀도잉(shadowing)은 공유 데이터를 효율적으로 관리하기 위해 프로그래밍에 사용되는 리소스 관리 기술이다. 여러 프로그램에서 데이터를 사용할 때 바로 복사하는 것이 아니라, 수정을 시도할 때까지 동일한 데이터를 프로그램 간에 공유한다. 변경 사항이 없으면 개인 복사본이 생성되지 않아 리소스가 절약된다. 복사본은 필요한 경우에만 만들어지므로 수정이 발생할 때 각 프로그램이 자체 버전을 갖게 된다. 이 기술은 일반적으로 메모리, 파일 및 데이터 구조에 적용된다.

 가상 메모리 관리에서 
카피 온 라이트는 운영체제에서 주로 사용되며, 여러 프로세스를 실행하는 컴퓨터의 물리 메모리를 공유하고, fork() 시스템 호출을 구현하는 데 사용된다. 일반적으로 새 프로세스는 메모리를 수정하지 않고 즉시 새 프로세스를 실행하여 주소 공간을 완전히 대체한다. 포크 중에 이전 프로세스의 모든 메모리를 복사한 다음 즉시 복사본을 버리는 것은 프로세서 시간과 메모리를 낭비하게 된다.

카피 온 라이트는 페이지 테이블을 사용하여 특정 메모리 페이지를 읽기 전용으로 표시하고 페이지에 대한 참조 횟수를 유지함으로써 효율적으로 구현될 수 있다. 이 페이지에 데이터가 기록될 때, 운영체제 커널은 쓰기 시도를 가로채서 카피 온 라이트 데이터로 초기화된 새 물리 페이지를 할당하지만, 참조가 하나뿐인 경우에는 할당을 건너뛸 수 있다. 그런 다음 커널은 새 (쓰기 가능한) 페이지로 페이지 테이블을 업데이트하고 참조 횟수를 줄인 후 쓰기를 수행한다. 새 할당은 한 프로세스의 메모리 변경이 다른 프로세스에서는 보이지 않도록 보장한다.

카피 온 라이트 기술은 0으로 채워진 물리 메모리 페이지 하나를 유지함으로써 효율적인 메모리 할당을 지원하도록 확장될 수 있다. 메모리가 할당될 때, 반환되는 모든 페이지는 0 페이지를 참조하며 모두 카피 온 라이트로 표시된다. 이런 식으로 데이터가 기록될 때까지 프로세스에 물리 메모리가 할당되지 않아 프로세스가 물리 메모리보다 더 많은 가상 메모리를 예약하고 메모리를 드물게 사용할 수 있지만, 가상 주소 공간이 부족해질 위험이 있다. 이 결합된 알고리즘은 요구 페이징과 유사하다.

카피 온 라이트 페이지는 리눅스 커널의 동일 페이지 병합 기능에도 사용된다.

 소프트웨어에서 

COW는 라이브러리, 응용 소프트웨어, 시스템 소프트웨어 코드에서도 사용된다.

 예시 
C++ 표준 라이브러리에서 제공하는 string 클래스는 초기 C++98 표준에서 카피 온 라이트 구현을 허용하도록 특별히 설계되었지만, 최신 C++11 표준에서는 그렇지 않다:
std::string x("Hello");

std::string y = x;  // x와 y는 동일한 버퍼를 사용한다.

y += ", World!";    // 이제 y는 다른 버퍼를 사용하고; x는 여전히 동일한 이전 버퍼를 사용한다.

PHP 프로그래밍 언어에서는 참조를 제외한 모든 유형이 카피 온 라이트로 구현된다. 예를 들어, 문자열과 배열은 참조로 전달되지만, 수정될 때 참조 횟수가 0이 아니면 복제된다. 이를 통해 할당 시 복사의 성능 문제나 불변성 없이 값 유형처럼 동작할 수 있다.

Qt 프레임워크에서는 많은 유형이 카피 온 라이트(Qt 용어로는 "암시적 공유")이다. Qt는 내부 참조 카운터를 증가시키거나 감소시키기 위해 원자적인 비교 및 스왑 연산을 사용한다. 복사 비용이 저렴하기 때문에 Qt 유형은 여러 스레드에서 뮤텍스와 같은 잠금 메커니즘 없이도 안전하게 사용될 수 있다. 따라서 COW의 이점은 단일 스레드 시스템과 멀티 스레드 시스템 모두에서 유효하다.

 컴퓨터 저장장치에서 
COW는 ZFS, Btrfs, ReFS, Bcachefs와 같은 파일 시스템은 물론, 논리 볼륨 관리 및 Microsoft SQL Server와 같은 데이터베이스 서버에서도 기본 메커니즘으로 사용된다.

기존 파일 시스템에서는 파일을 수정하면 원래 데이터 블록이 그 자리에서 덮어쓰여진다. 카피 온 라이트(COW) 파일 시스템에서는 원본 블록이 변경되지 않은 상태로 유지된다. 파일의 일부가 수정되면 영향을 받는 블록만 새 위치에 기록되고, 메타데이터는 해당 블록을 가리키도록 업데이트되어 원래 버전이 더 이상 필요하지 않을 때까지 보존된다. 이 접근 방식은 스냅샷과 같은 기능을 가능하게 하여 추가 공간을 많이 소비하지 않고 특정 시점의 파일 상태를 캡처할 수 있다. 스냅샷은 일반적으로 수정된 데이터만 저장하며 원본과 가깝게 유지된다. 그러나 스냅샷은 증분 백업의 약한 형태로 간주되며 전체 백업을 대체할 수 없다.

새 컨테이너를 빠르게 생성하고 시작하기 위해,
운영체제 수준 가상화를 수행하는 컨테이너 엔진은
스토리지에서 종종 카피 온 라이트를 수행하는데,
이는 블록 수준 카피 온 라이트(위에서 설명한 대로) 또는 파일 수준 카피 온 라이트이다.

일부 파일 시스템은 유니언 마운트의 일부로 파일 수준 카피 온 라이트를 지원하지만 전부는 아니다.Neil Brown.
"Overlay Filesystem".
여기에는 오버레이FS, Aufs, GlusterFS, UnionFS가 포함된다.

 같이 보기 
 플라이웨이트 패턴
 메모리 관리
 웨어 레벨링

 각주 

분류:기억 장치
분류:소프트웨어 최적화
분류:가상 메모리