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한다는 의미를 가진 것이다.
'컴퓨터공학기초 개념 > 시스템 프로그래밍' 카테고리의 다른 글
24. 프로세스 - 프로세스 생성과 종료 총정리 (0) | 2021.09.17 |
---|---|
23. 프로세스 - 프로세스 종료(exit) (0) | 2021.09.17 |
21. 프로세스 - wait & 쉘 만들기 (0) | 2021.09.16 |
20. 프로세스 - 프로세스 생성(exec) (0) | 2021.09.15 |
19. 프로세스 - 프로세스 생성(fork) (0) | 2021.09.15 |
댓글