데이터 복사를 지연시키고, 수정이 필요한 시점에만 복사를 발생시킨다.
1. 초기상태
- 두 개체(프로세스나 데이터 객체 등)는 동일한 데이터를 공유한다.
- 복사본을 만들지 않고, 동일한 메모리 영역 또는 데이터 블록을 참조한다.
- 예시: 두 프로세스가 같은 파일을 열거나 같은 메모리 페이지를 참조하는 상태
2. 데이터 수정 시점
-
수정하려는 시점에만 복사본을 만든다.
-
하나의 프로세스나 데이터 객체가 데이터를 수정하려 할 때, 해당 데이터를 새로운 메모리 영역에 복사하고, 수정된 데이터를 그 복사본에 적용한다.
-
원본 데이터는 변경되지 않는다.
- 원본은 여전히 다른 프로세스나 객체가 참조할 수 있도록 유지된다.
-
프로세스가 공유 메모리에서 데이터를 수정하려 할 때,
새로운 메모리 페이지를 할당하고 그 페이지에서 수정이 이루어진다. 원본 메모리는 그대로 두어 다른 프로세스가 계속 사용할 수 있다.
3. 복사본 사용
- 수정된 데이터는 이제 복사본에서만 존재하며, 해당 데이터를 수정한 객체는 새로운 데이터를 참조한다.
- 다른 객체나 프로세스는 여전히 원본 데이터를 참조하고 있다.
- 즉, 수정이 필요한 객체만 변경된 데이터를 사용한다.
ex) 자식 프로세스가 부모 프로세스의 메모리를 복사하여 사용하고, 자식 프로세스가 그 데이터를 수정한 경우, 자식 프로세스만 수정된 데이터를 사용한다.
4. 변경 없는 상태에서는 복사 없음
- 데이터가 수정되지 않으면 복사본이 생성되지 않고, 두 객체는 같은 데이터를 계속 참조한다.
- 복사본이 생성되는 시점은 수정이 필요할 때만 발생
장점
- 메모리 절약: 데이터가 수정되지 않으면 복사본을 만들지 않는다.
- 빠른 복사: 실제 데이터 복사는 필요할 때만 이루어진다.
- 성능 향상: 복사본을 만드는 시점을 지연시키기 때문에, 여러 프로세스가 데이터를 동시에 사용할 때 성능이 향상된다.
COW는 주로 가상화, 파일 시스템(ex: ZFS, Btrfs), 메모리 관리(ex: Linux의 fork()), 데이터베이스 등에서 효율적인 리소스 관리와 성능 최적화를 위해 사용된다.