같은 물리 프레임을 사용함으로써 복제를 빠르게 하는 방법

어떠한 자원을 여러 프로세스에서 공유하는 경우, 각 프로세스는 자원에 대해 복사본을 각각 갖고 있다. 그러나, 자원이 수정되지 않고 읽기만 한다면 굳이 같은 복제본을 여러 개 물리 메모리에 올려놓을 필요가 없다.

예를 들어, fork를 통해 새로운 프로세스가 생성되었다고 가정하자. 자식이 부모의 자원을 복제하면서 다음과 같은 과정을 거친다:

Resource Copy Process

  1. 물리 프레임 할당
  2. 그 프레임에 데이터를 쓰기
  3. 페이지 테이블에서 페이지 - 프레임 사이 매핑 수립

이러한 과정은 많은 시간을 소요할 수 있다.

그러나, Copy-on-Write 기법을 활용하면 자원의 복제본에 대해 새로운 물리 프레임을 할당하지 않아도 된다. 이미 해당 데이터가 물리 데이터에 올라와 있으므로, 자식의 페이지 테이블에서 가상 주소와 그 물리 프레임을 연결만 해주면 된다. 이로서 부모와 자식은 같은 물리 프레임의 데이터에 접근하게 된다. 만약 하나의 프로세스에서 공유된 자원에 대해 수정 작업을 하기를 원하면, 그제야 각자의 물리 프레임을 생성하게 된다. 결과적으로 복제 작업은 첫 쓰기까지 지연된다.

이를 구현하기 위해선 OS가 Copy-on-Write 페이지에 대한 쓰기 시도를 구별해야 한다. 여기서 활용하는 방법은 쓰기-보호 메커니즘으로, 쓰기 요청에 대해 페이지 폴트를 발생시키는 것이다. 쓰기-보호된 페이지는 아예 쓰기 작업이 수행되어서는 안된다.

fork에 대한 Copy-on-Write를 구현해야 한다. 자식이 부모로부터 자원을 상속받을 때, 자식이 이를 수정하려 하지 않는 이상 같은 물리 주소를 가리킨다. 모든 쓰기-보호 페이지는 evict의 후보이다.