[운영체제] Chapter10.3 Copy-on-Write

강현주·2025년 4월 14일

fork() 시스템 콜을 사용한 프로세스 생성은 페이지 공유와 유사한 기술을 사용하여, 처음에는 요구 페이징의 필요를 피할 수 있다. 이 기법은 빠른 프로세스 생성을 제공하고, 새로 생성된 프로세스에 할당해야 하는 새 페이지 수를 최소화 한다.

fork() 시스템 콜은 부모 프로세스의 사본인 자식 프로세스를 생성한다. 전통적으로, fork()는 부모 프로세스의 주소 공간 사본을 자식 프로세스에 생성하여, 부모 프로세스에 속한 페이지들을 복제하는 방식으로 동작했다. 하지만, 많은 자식 프로세스가 생성 직후 exec() 시스템 콜을 호출한다는 점을 고려하면, 부모 프로세스의 주소 공간을 복사하는 것은 불필요할 수 있다. 대신, 부모 프로세스와 자식 프로세스가 처음에 동일한 페이지를 공유할 수 있도록 하는 copy-on-write 기법을 사용할 수 있다. 이러한 공유 페이지는 copy-on-write 페이지로 표시되며, 이는 두 프로세스 중 하나가 공유 페이지에 쓰기 작업을 수행하면, 공유 페이지의 복사본이 생성됨을 의미한다. copy-on-write는 그림 10.7과 10.8에 설명되어 있고, 프로세스 1이 페이지 C를 수정하기 전과 후의 물리적 메모리의 내용을 보여준다.

예를 들어, 자식 프로세스가 스택의 일부를 포함하는 페이지를 수정하려고 시도하고, 해당 페이지가 copy-on-write되도록 설정되었다고 가정하면, 운영체제는 free-frame 목록에서 프레임을 가져와 이 페이지의 복사본을 생성하고, 자식 프로세스의 주소 공간에 매핑한다. 그러면, 자식 프로세스는 복사된 페이지를 수정하고, 부모 프로세스에 속한 페이지는 수정하지 않는다. copy-on-write 기법을 사용하면, 두 프로세스 중 하나에 의해 수정된 페이지만 복사된다; 수정되지 않은 모든 페이지는 부모 프로세스와 자식 프로세스가 공유할 수 있다. 수정 가능한 페이지에만 copy-on-write로 표시해야 한다. 수정할 수 없는 페이지(실행가능한 코드를 포함하는 페이지)는 부모 프로세스와 자식 프로세스가 공유할 수 있다. copy-on-write는 Windows, Linux, macOS 등 여러 운영체제에서 널리 사용되는 기법이다.

여러 버전의 UNIX(Linux, macOS, BSD UNIX 포함)는 fork() 시스템 콜의 변형인 vfork()(가상 메모리 fork)를 제공하는데, 이는 copy-on-write 방식의 fork()와 다르게 동작한다. vfork()를 사용하면 부모 프로세스는 일지 정지되고, 자식 프로세스는 부모 프로세스의 주소 공간을 사용한다. vfork()는 copy-on-write를 사용하지 않기 때문에, 자식 프로세스가 부모 프로세스 주소 공간의 페이지를 변경하면, 변경된 페이지는 부모가 다시 시작하면 부모에게 표시된다. 따라서 vfork()를 사용할 때는 자식 프로세스가 부모 프로세스의 주소 공간을 수정하지 않도록 주의해야 한다. vfork()는 자식 프로세스가 생성 직후 exec()를 호출할 때 사용되도록 설계되었다. 페이지 복사가 발생하지 않기 때문에, vfork()는 프로세스 생성의 매우 효율적인 방법이며, UNIX command-line 셸 인터페이스를 구현하는 데 사용되기도 한다.

0개의 댓글