본문 바로가기
컴퓨터공학기초 개념/시스템 프로그래밍

22. 프로세스 - copy on write

by devraphy 2021. 9. 16.

0. 시작하기전에 

- 리눅스 프로세스 생성 속도를 높이는 copy on write 기술을 알아볼 예정이다. 

- 이를 이해하기 위해서는 기본적으로 리눅스의 프로세스 구조와 가상메모리 시스템간의 메커니즘을 이해해야한다.

- 이 부분은 운영체제 파트에서 깊게 다루었던 내용이기 때문에, 간략하게 복습해보자. 

 


1. 리눅스 프로세스 구조 

a) 프로세스의 기본구조

- 모든 프로세스는 4GB의 가상메모리를 할당받는다. 

- 3GB ~ 4GB의 가상메모리 주소는 OS 코드가 들어있는 커널 영역에 할당된다.

- 0GB ~ 3GB의 가상메모리 주소는 응용프로그램의 코드가 들어있는 사용자 영역에 할당된다. 

- 프로세스 메모리로 알고있는 text, data, bss, heap, stack은 사용자 영역에 존재한다. 

 

 

b) 모든 프로세스의 커널영역은 공유된다. 

- 각 프로세스의 커널영역(3GB ~ 4GB)에는 OS 코드가 들어있다.

- 그러나 모든 프로세스에 OS코드가 개별적으로 들어있다면, 동기화하기도 힘들고

- 동일한 코드가 여러 프로세스에 배치되어 있기에 메모리 효율성이 떨어진다. 

- 그러므로 모든 프로세스의 커널영역은 공유되는 영역이다.  

- 위의 그림에서 볼 수 있듯이, 각 프로세스마다 페이지 테이블이 존재한다. 

- 각 프로세스의 페이지 테이블에는 당연히 커널영역의 코드를 가리키는 주소가 존재한다. 

- 실제로 프로세스마다 이 주소를 따라가보면 동일한 물리 메모리 주소를 가리킨다는 것을 알 수있다.

- 이것이 구현 가능한 이유는 가상메모리시스템을 사용하기 때문이다. 

 


2. Copy on write

- 앞서 말했듯이, 각 프로세스는 4GB의 가상메모리 영역을 할당 받는다.

- fork()를 사용해서 기존의 프로세스를 복사하여 새로운 프로세스를 생성한다고 하면, 

- 이 4GB의 가상메모리영역을 모두 복사해야 하는것이다. 시간이 오래 걸릴 것 같지 않은가? 

- 실제로 시간이 오래 걸리기에, 이를 극복하기위해서 나온 기술이 copy on write이다. 

 

a) copy on write의 동작방식 

- 만약 새로 생성되는 프로세스의 데이터가 읽기(read) 작업을 위한 것이라면,

- 자식 프로세스를 물리메모리에 할당하지 않고, 부모 프로세스의 메모리 영역을 계속해서 사용한다.

 

- 반면에, 쓰기(write) 작업의 경우, 프로세스의 데이터를 업데이트 하는 작업이므로

- 부모 프로세스의 메모리 영역에 새로운 데이터를 업로드 할 수는 없다. 부모 프로세스의 데이터가 있기 때문이다. 

- 그러므로 부모 프로세스의 메모리영역에서 필요한 부분만 복사하여 자식 프로세스의 메모리로 할당한다.

- 이 경우 부모 프로세스 메모리의 일부분만 복사하여 자식 프로세스의 메모리에 할당하기 때문에 프로세스 생성시간을 최소화 할 수 있다. 

 

- 더불어 프로세스가 새로 생성될 때마다 새로운 페이지가 생성되는데,

- 이렇게 부모 프로세스를 이용하는 경우, 페이지 수도 최소화 할 수 있다는 장점이 있다. 

- 다음 그림을 통해 이해해보자. 

 

 

▶ 새로운 프로세스의 데이터가 읽기(read)작업을 수행하는 경우

- 위의 그림에서 볼 수 있듯이, 읽기(read)작업 만을 수행하는 경우, 새로운 프로세스를 생성하지 않고

- 부모 프로세스가 사용하는 물리메모리의 영역을 그대로 사용한다는 것을 알 수 있다.    

- 다르게 표현하자면, 포인터를 새로 만들어서 부모 프로세스와 동일한 메모리주소를 가리키게 할 뿐인 것이다.

- 즉, 프로세스의 커널영역이 공유되는 방식과 동일한 메커니즘으로 작동하는 것이다. 

 

 

▶ 새로운 프로세스의 데이터가 쓰기(write)작업을 수행하는 경우

- 쓰기(write)작업을 필요로 하는 경우, 쓰기 작업에 필요한 만큼만 부모 프로세스의 메모리 영역을 복사한 뒤, 

- 자식 프로세스를 위한 메모리 영역을 새롭게 할당한다. 

- 부모 프로세스를 기반으로 쓰기작업에 필요한 만큼의 메모리 영역을 복사하므로

- 부모 프로세스의 전체 메모리 영역(4GB)을 복사하는 것이 아니라 일부분만 복사하게 된다.

- 그러므로 자식 프로세스 생성에 있어서 수행시간을 단축시킨다.

 

- 이와 같은 이유로, copy on write는 write 작업을 할 때 copy한다는 의미를 가진 것이다. 

댓글