Pintos에서 copy-on-write 메커니즘을 구현하세요.

Copy-on-write는 동일한 인스턴스의 물리 페이지를 사용하여 더 빠른 복제 작업을 가능하게 하는 리소스 관리 기술입니다. 어떤 리소스가 여러 프로세스에서 사용되고 있는 경우, 충돌이 발생하지 않도록 각 프로세스는 일반적으로 해당 리소스의 자체 복사본을 가지고 있어야 합니다. 그러나 리소스가 수정되지 않고 단순히 읽기만 하는 경우에는 물리 메모리에 여러 복사본이 있을 필요가 없습니다.

예를 들어, fork를 통해 새 프로세스가 생성된다고 가정해 보겠습니다. 자식 프로세스는 데이터를 가상 주소 공간으로 복제하여 부모 프로세스의 리소스를 상속받아야 합니다. 일반적으로 가상 메모리에 내용을 추가하는 것은 물리 페이지를 할당하고, 데이터를 프레임에 쓰고, 페이지 테이블에 가상->물리 매핑을 추가하는 단계를 포함합니다. 이러한 단계는 상당히 시간이 소요될 수 있습니다.

그러나 copy-on-write 기술을 사용하면 리소스의 새 복사본에 대해 새로운 물리 페이지를 할당하지 않습니다. 이는 기술적으로 내용이 이미 물리 메모리에 존재하기 때문입니다. 따라서 자식 프로세스의 페이지 테이블에서 가상->물리 매핑만 추가하면 됩니다. 여기서 가상 주소는 이제 자식 프로세스의 메모리 공간에 있습니다. 그런 다음 부모와 자식은 동일한 물리 페이지에서 동일한 데이터에 접근합니다. 그러나 여전히 별도의 가상 주소 공간을 통해 격리되어 있으며, OS만이 동일한 프레임을 참조하고 있다는 것을 알고 있습니다. 프로세스 중 하나가 공유 리소스의 내용을 수정하려고 시도할 때만 자체적으로 새 물리 페이지에 별도의 복사본을 생성합니다. 따라서 실제 복사 작업은 첫 번째 쓰기 작업으로 연기됩니다.

즉, OS는 copy-on-write 페이지에 대한 쓰기 시도를 감지할 수 있어야 합니다. 이를 달성하기 위해 OS는 "write-protect" 메커니즘을 사용합니다. 이는 간단한 아이디어입니다: 쓰기 접근 시 페이지 폴트를 발생시키는 것입니다. 이는 메모리 관리 시스템의 지원으로 쉽게 구현할 수 있으며, 쓰기 보호된 페이지를 완전히 쓸 수 없는 것으로 표시하기만 하면 됩니다.

fork에 대해서만 copy-on-write를 구현하면 됩니다. 자식 프로세스가 부모 프로세스로부터 리소스를 상속받을 때, 자식 프로세스가 수정하려고 시도할 때까지 동일한 물리 데이터를 참조할 수 있습니다. 모든 쓰기 보호된 페이지는 제거 대상입니다.

우리는 copy-on-write에 대한 기본 테스트 케이스만 제공합니다. 가능한 모든 경우를 고려해야 합니다(여기 작은 힌트가 있습니다: 파일 백업 페이지의 공유를 구현해야 합니다). 이 추가 프로젝트의 채점은 숨겨진 테스트 케이스를 사용하여 수행됩니다.