[운영체제] Copy On Write(COW)란? | Copy On Write 예시

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
 
+= " World!";    // now y uses a different buffer
                    // x still uses the same old buffer
cs

위와 같은 코드가 있다고 하자. ( C++ 98에서의 동작이다. C++ 11 이상에서는 동작하지 않음 )

COW1
COW 예시

x라는 buffer에 "Hello" 라는 string을 넣고, y라는 복사본을 만든다고 하자. 이때 x와 y는 같은 buffer를 가리키게 된다.

하지만 이때 복사본인 y를 변경하면 아래와 같이 된다.

COW2
COW 예시

더이상 y는 같은 buffer를 가리키지 않고, 새로운 buffer를 생성해 가리키게 된다. x가 가리키던 원래 데이터는 여전히 변질되지 않고 잘 보존되어 있다.

 

이처럼 Copy On Write는 리소스가 복제되었지만 수정되지 않은 경우에 새 리소스를 만들 필요 없이 복사본과 원본이 리소스를 공유하고, 복사본이 수정되었을 때만 새 리소스를 만드는 리소스 관리 기법을 말한다.

 

OS의 Copy On Write

OS에서의 COW는 fork() 기능과 관련이 깊다. fork()를 수행하면 자식 프로세스가 부모프로세스의 복사본이 된다. 그런데 이때 대부분 fork() 이후 exec()를 수행해 새로운 프로세스를 overwrite하게 된다. 즉, 복사를 하고 바로 exec()를 통해 새로운 프로세스를 만들게 된다. 이것은 overhead가 발생하게 되므로 비효율적이다.

OS COW1
OS에서의 COW

따라서 COW를 이용해 자식 프로세스가 같은 페이지를 공유하게 하면 된다. 만약 자식 프로세스에 수정이 일어난다면 그때 Copy를 수행하면 된다. 위와 같은 상황에서 만약 page C가 변경된다면, 아래와 같이 된다.

OS COW2
OS에서의 COW

page C의 복사본을 할당하고, 이를 가리키게 하면 된다.

 

이런식으로 내용이 바뀌지 않을 때까지는 페이지를 공유하고, 내용이 변경된다면 새로운 page를 할당해서 복사를 해주어 복사에 드는 비용(overhead)를 감소시킬 수 있다. 

 

대부분의 OS에서 COW 방식을 채택한다.

반응형

댓글

Designed by JB FACTORY