가상 메모리 쓰기 시 복사 (copy-on-write)

By 01/11/2018OS Concept

가상 메모리 쓰기 시 복사 (copy-on-write)

 

프로세스를 빠르게 시작하기 위해 첫 명령어가 포함된 페이지를 요구 페이징 하였다. 그러나 fork() 시스템 호출을 통해 프로세스를 생성할 때에는 페이지 공유 와 비슷한 기법으로 첫 요구 페이징 조차 생략하는 것이 가능하다. 이 기법을 통해 프로세스 생성 시간이 더 줄일 수 있음은 물론 새로 생성된 프로세스에 새롭게 할당되어야 하는 페이지의 수도 최소화 할 수 있다.

 

 

fork()를 하면 부모 프로세스의 페이지들을 실제로 자식 프로세스에 복사해 줌으로써 자식 프로세스의 주소 공간을 구성해 주고 대부분의 자식 프로세스들은 주소 공간이 마련되자마자 exec() 시스템 호출 한다. 그러면 부모로부터 복사해온 페이지들은 다 쓸모 없는 것들이 되고 만다.

그래서 부모의 페이지들을 다 복사해오는 대신 쓰기 시 복사(copy-on-write)방식을 사용할 수 있다. 이 방식에서는 자식 프로세스가 시작할 때 부모의 페이지를 당분간 함께 사용하도록 한다. 이때 공유되는 페이지를 쓰기 시 복사 페이지라고 표시한다. “둘 중 한 프로세스가 공유중인 페이지에 쓸 때 그 페이지의 복사본이 만들어 진다.”는 의미이다.

 

그림을 통해서 부모 프로세스가 자식 프로세스에게 메모리 복사를 통한 물리 메모리 상태를 확인해 보자.

 

쓰기 시 복사 처리 과정에서 페이지 복사본을 만들 때 빈 페이지를 어떻게 할당 받는지를 살펴 보는 것이 중요하다. 많은 운영체제에서 요구를 처리하기 위해 빈 페이지 집합(pool)을 유지하고 있다.

 

빈 페이지가 프로세스에게 할당 되는 경우는 쓰기 시 복사를 할 때 그리고 스택이나 힙 공간을 확장해야 할 때이다. 운영체제는 보통 zero-fill-on-demand 기법으로 페이지를 할당 한다. 페이지를 할당할 때 그 내용을 영(0)으로 채워 이전 내용을 지워야 한다.

 

일부 운영체제는 vfork()(virtual memory fork)라는 시스템 호출을 제공한다. vfork()는 fork()와는 다르게 부모 프로세스는 잠시 중단(suspend)되고 자식 프로세스가 부모의 주소 공간을 사용하게 된다. vfork()는 쓰기 시 복사를 사용하지 않으므로 자식 프로세스가 부모 주소 공간의 페이지를 수정하게 되면 변경된 페이지가 재실행 시 부모 프로세스에 그대로 보여진다.

 

따라서 vfork()를 사용할 때에는 자식 프로세스가 부모 주소 공간의 페이지들에 변경을 가하지 않도록 주의해야 한다. vfork()는 자식 프로세스가 만들어지자마자 exec()를 호출하는 경우를 위해 마련된 것이다.

 

 

[참고자료]

Operating System Concepts

 

operationsystem, 운영체제, 운영체제구조, 컴퓨터구조, OSConcept, 가상메모리, 힙, 스택, virtualmemory, 요구페이징, sqlmvp, SQL Angeles

 

Leave a Reply

%d bloggers like this: