개요

Copy On Write란 말 그대로 작성시 이전의 내용을 Copy한다는 뜻이다. 부모나 자식 프로세스가 copy on write 메모리 영역에 접근하게 되면 그 영역을 먼저 복사하고 작성하게 된다.

Linux(Unix)에서는 자식 프로세스(child process)를 생성(fork)하면 같은 메모리 공간을 공유하게 된다. 그런데 부모 프로세스가 데이터를 새로 넣거나, 수정하거나, 지우게 되면 같은 메모리 공간을 공유할 수 없게 된다. 이때 부모 프로세스는 해당 페이지를 복사한 다음 수정한다. 이것을 Copy-on-Write(COW)라고 한다.

만약 자식 프로세스가 없었다면 페이지를 복사하지 않고 바로 수정했을 것이다. 따라서 자식 프로세스가 생성되어 작업을 하는 동안 데이터 입력/수정/삭제가 발생하면 해당 메모리 페이지를 복사해야 되기 때문에 평소보다 더 많은 메모리가 필요해진다.

또한 자식 프로세스의 입장에서도 부모 프로세스가 전달해준 메모리 영역에 작성을 하면 같은 메모리 영역에 작성하는 것이기 때문에 메모리를 복사해서 작성해야 한다. 즉 Copy on write는 fork 시간은 줄여주지만, memory access에 더 copy하는 시간이 더 드는 단점이 있다.

작동 방식

Linux에서 Kernel은 시스템콜을 처리하면서 parent process의 영역을 readonly로 표시하고 page table을 복사하여 child process로 건넨다. 이때 만약 복사된 page table을 사용하여 memory영역에 read 접근을 하면 page fault가 발생하지 않지만, write로 접근하면 page fault가 발생하여 이 영역을 복사한후 명령을 처리하게 된다. 또한 Linux커널은 user가 read only라고 표시한것과 copy on write때문에 read only라고 표시한 것을 구분 할 수 있게 구현되어 있다. 따라서 리눅스 커널은 page fault을 통해서 효과적으로 copy on write를 처리할 수 있다.