일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 이분 탐색(Binary Search)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- DFS & BFS
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 백준 1707번
- 동적 프로그래밍(Dynamic Programming)
- 백준 17608번
- DFS(Depth First Search)
- 큐(Queue)
- 백준 2493번
- 백준 2504번
- 위상 정렬(Topological Sort)
- 위상 정렬(Topology Sort)
- 백준 2261번
- 스택(Stack)
- 이분 그래프(Bipartite Graph)
- 백준 1948번
- 백준 10000번
- 알고리즘 개념
- 트리(Tree)
- 분할 정복(Divide and Conquer)
- 백준 9012번
- 백준 21606번
- 백준 2812번
- 그래프(Graph)
- BFS
- 그리디 알고리즘(Greedy Algorithm)
- BFS(Breadth First Search)
- DFS
- 백준 18352번
- Today
- Total
Always Be Wise
가상화 - 메모리 가상화 : 물리 메모리 크기의 극복(메커니즘) 본문
지금까지는 가상 주소 공간이 비현실적으로 작아서 실행 중인 프로세스의 전체 가상 주소 공간이 메모리에 탑재된 것으로 가정하였다.
이제부터는 다수의 프로세스들이 동시에 매우 큰 가상 주소 공간을 사용하고 있다고 가정하자.
이 경우, 개별 프로세스가 자신의 가상 주소 공간 전부를 메모리에 탑재하는 것이 불가능하다.
현재는 크게 필요하지 않은 가상 주소 공간의 일부를 메모리가 아닌 다른 공간(스왑 공간, Swap Space)에 보관해두어야 한다.
일반적으로 그 공간은 메모리보다 더 크며, 더 느리다. 현대 시스템에서는 보통 하드 디스크나 SSD가 그 역할을 담당한다.
스왑 공간
스왑 공간의 입출력 단위를 페이지라고 가정하자. 운영체제는 스왑 아웃(Swap Out) 시, 메모리의 페이지 내용을 읽어서 스왑 공간에 쓴다. 반면, 스왑 인(Swap In) 시, 스왑 공간에서 내용을 읽어 다시 메모리에 탑재한다.
스왑 공간의 크기는 매우 중요하다. 시스템이 사용할 수 있는 페이지의 최대수를 결정하기 때문이다.
아래의 간단한 예제를 보도록 하자. 물리 메모리와 스왑 공간에는 각각 4개의 페이지와 8개의 페이지를 위한 공간이 존재한다.
이 예에서는 세 개의 프로세스(Proc 0, Proc 1, Proc 2)가 물리 메모리를 공유하고 있다.

세 개의 프로세스는 몇 개의 유효한 페이지들만 물리 메모리에 올려놓았으며, 나머지 페이지들은 스왑 공간에 스왑 아웃되어 있다.
네 번째 프로세스(Proc 3)의 모든 페이지들은 스왑 공간으로 스왑 아웃되어 있기 때문에 현재 실행 중이 아니다.
이처럼 스왑 공간을 이용하면 시스템에 실제 물리적으로 존재하는 메모리 공간보다 더 많은 공간이 존재하는 것처럼 가장할 수 있다.
Present Bit
물리 메모리와 스왑 공간 사이의 스와핑을 구현하기 위해서는 몇 가지 추가적인 기능들이 필요하다.
먼저 메모리가 참조되는 과정을 상기해 보자.
프로세스의 가상 주소를 물리 주소로 변환해야 한다.
하드웨어는 가상 주소에서 VPN을 추출한 후에 TLB에 해당 정보가 있는지 확인한다.
TLB 히트라면, VPN에 해당 하는 PFN 정보를 바로 확인하고, 이를 오프셋과 결합하여 쉽게 물리 주소를 구할 수 있다.
그런데 TLB 미스라면, 하드웨어는 페이지 테이블 베이스 레지스터를 사용하여 페이지 테이블의 메모리 주소를 파악하고,
VPN을 인덱스로하여 원하는 페이지 테이블 항목(PTE)을 추출해야 한다.
이후, 해당 페이지 테이블 항목이 유효하고, 항목의 페이지가 물리 메모리에 존재하면, 하드웨어는 PFN 정보를 추출하여 TLB에 탑재한다.
TLB 탑재 후 명령어를 재실행하면 TLB 히트가 발생하고, 이후 물리 주소를 구해 메모리 참조를 진행할 수 있다.
이러한 메모리 참조 과정에서 페이지의 물리 메모리 존재 여부를 표현할 수 있는 기법이 필요하다.
Present Bit는 페이지 테이블 항목의 페이지가 물리 메모리에 존재하는지를 나타내기 위해 사용하는 비트이다.
비트가 1로 설정되어 있다면, 물리 메모리에 해당 페이지가 존재한다는 것이고, 0으로 설정되어 있다면 존재하지 않는다는 의미이다.
물리 메모리에 존재하지 않는 페이지를 접근하는 행위를 일반적으로 페이지 폴트(Page Fault)라고 한다.
페이지 폴트가 발생하면 페이지 폴트를 처리하기 위해 운영체제로 제어권이 넘어가 페이지 폴트 핸들러가 실행된다.
페이지 폴트
페이지 폴트가 발생하면 운영체제가 그 처리를 담당한다. 아래는 페이지 폴트 처리의 상세한 과정을 나타낸다.
우선, 하드웨어를 통한 주소 변환 과정을 살펴보자. TLB 미스 발생 시, 세 가지의 중요한 경우가 있다는 것을 알 수 있다.
첫 째는 페이지가 존재하며 유효한 경우이다(18-21라인). 이 경우에는 TLB 미스 핸들러가 PTE에서 PFN을 가져와 명령어를 재시도 한다.
두 번째 경우에는 페이지가 유효하지만 존재하지 않는 경우이다(22-23라인). 페이지 폴트 핸들러가 반드시 실행되어야 한다.
세 번째는 페이지가 유효하지 않은 경우이다(13-14라인). 잘못된 주소 접근으로 세그멘테이션 폴트가 발생한다.

다음은 운영체제가 페이지 폴트를 처리하는 과정이다. 운영체제는 탑재할 페이지를 위한 물리 프레임을 확보한다.
만약 여유 프레임이 없다면, 교체 알고리즘을 실행하여 메모리에서 페이지를 내보내고 여유 공간을 확보한다.
물리 프레임을 확보한 후, 스왑 영역에서 페이지를 읽어 온다. 이후, 운영체제는 페이지 테이블을 갱신하고 명령어를 재시도한다.

요약
시스템에 실제 존재하는 물리 메모리의 크기보다 더 많은 메모리를 사용하기 위한 개념을 살펴보았다.
이를 위해서 메모리에 특정 페이지가 존재하는지를 확인하기 위해 Present Bit와 좀더 복잡한 페이지 테이블 구조가 필요했다.
운영체제는 페이지 폴트를 처리하기 위해 페이지 폴트 핸들러를 실행시킨다. 핸들러는 원하는 페이지를 메모리에 올리기 위해
메모리의 일부 페이지들을 먼저 교체하여 새롭게 스왑되서 들어올 페이지를 위한 공간을 만드는 조치를 취한다.
'컴퓨터 시스템 > OSTEP' 카테고리의 다른 글
가상화 - 메모리 가상화 : 완전한 가상 메모리 시스템 (0) | 2022.01.27 |
---|---|
가상화 - 메모리 가상화 : 물리 메모리 크기의 극복(정책) (0) | 2022.01.26 |
가상화 - 메모리 가상화 : 더 작은 페이지 테이블 (0) | 2022.01.26 |
가상화 - 메모리 가상화 : 더 빠른 변환을 위한 TLB (0) | 2022.01.26 |
가상화 - 메모리 가상화 :페이징 (0) | 2022.01.25 |