Copy On Write (COW) 란?
1
2
3
4
5
6
|
std::string x("Hello");
std::string y = x; // x and y use the same buffer
y += " World!"; // now y uses a different buffer
// x still uses the same old buffer
|
cs |
위와 같은 코드가 있다고 하자. ( C++ 98에서의 동작이다. C++ 11 이상에서는 동작하지 않음 )
x라는 buffer에 "Hello" 라는 string을 넣고, y라는 복사본을 만든다고 하자. 이때 x와 y는 같은 buffer를 가리키게 된다.
하지만 이때 복사본인 y를 변경하면 아래와 같이 된다.
더이상 y는 같은 buffer를 가리키지 않고, 새로운 buffer를 생성해 가리키게 된다. x가 가리키던 원래 데이터는 여전히 변질되지 않고 잘 보존되어 있다.
이처럼 Copy On Write는 리소스가 복제되었지만 수정되지 않은 경우에 새 리소스를 만들 필요 없이 복사본과 원본이 리소스를 공유하고, 복사본이 수정되었을 때만 새 리소스를 만드는 리소스 관리 기법을 말한다.
OS의 Copy On Write
OS에서의 COW는 fork() 기능과 관련이 깊다. fork()를 수행하면 자식 프로세스가 부모프로세스의 복사본이 된다. 그런데 이때 대부분 fork() 이후 exec()를 수행해 새로운 프로세스를 overwrite하게 된다. 즉, 복사를 하고 바로 exec()를 통해 새로운 프로세스를 만들게 된다. 이것은 overhead가 발생하게 되므로 비효율적이다.
따라서 COW를 이용해 자식 프로세스가 같은 페이지를 공유하게 하면 된다. 만약 자식 프로세스에 수정이 일어난다면 그때 Copy를 수행하면 된다. 위와 같은 상황에서 만약 page C가 변경된다면, 아래와 같이 된다.
page C의 복사본을 할당하고, 이를 가리키게 하면 된다.
이런식으로 내용이 바뀌지 않을 때까지는 페이지를 공유하고, 내용이 변경된다면 새로운 page를 할당해서 복사를 해주어 복사에 드는 비용(overhead)를 감소시킬 수 있다.
대부분의 OS에서 COW 방식을 채택한다.
'Computer Science > [운영체제]' 카테고리의 다른 글
[운영체제] 페이지 교체 알고리즘 (FIFO/OPT/LRU/LFU/MFU) (2) | 2021.12.28 |
---|---|
[운영체제] 가상메모리(Virtual Memory)와 요구 페이징(Demand Paging), Valid-Invalid Bit, 페이지 부재(Page Fault)과정 (2) | 2021.12.27 |
[운영체제] 세그멘테이션(Segmentation)이란?, 세그멘테이션 vs 페이징 (2) | 2021.12.12 |
[운영체제] 페이지 테이블 구조 (Hierarchical Page Table, 2-level Page Table, Hashed Page Table, Inverted Page Table) (0) | 2021.12.11 |
[운영체제] 페이징(Paging)이란? 페이지 테이블이란? (0) | 2021.12.10 |