Always Be Wise

가상화 - 메모리 가상화 :페이징 본문

컴퓨터 시스템/OSTEP

가상화 - 메모리 가상화 :페이징

bewisesh91 2022. 1. 25. 17:55
728x90

프로세스의 주소 공간을 가변 크기의 논리 세그먼트로 나누는 것이 아니라, 고정 크기의 페이지로 나누는 것을 페이징 기법이라 한다.

페이징 기법에서는 물리 메모리를 페이지 프레임이라고 불리는 고정 크기 슬롯의 배열로 간주하며, 프레임 각각은 하나의 가상 메모리

페이지를 저장할 수 있다. 페이지를 사용하여 어떻게 메모리를 가상화할 수 있을까?

간단한 예제 및 개요

아래 왼쪽 그림은 4개의 16바이트 페이지로 구성된 64 바이트 크기의 가상 주소 공간을,

오른쪽 그림은 8개의 16바이트 페이지 프레임으로 구성된 128 바이트 크기의 물리 메모리를 표현한 것이다.

그림에서 알 수 있듯이 물리 메모리는 고정 크기의 슬롯들로 이루어져 있으며, 가상 주소 공간의 페이지들이 분산 배치되어 있다.

 

페이징은 이전 방식들에 비해 많은 장점을 갖고 있다. 아마도 가장 중요한 장점은 유연성일 것이다.

페이징을 사용하면 프로세스의 주소 공간 사용 방식과는 상관없이 효율적으로 주소 공간 개념을 지원할 수 있다.

예를 들어, 힙과 스택이 어느 방향으로 커지는지 등을 고려하지 않아도 된다.

또 다른 장점은 빈 공간 관리의 단순함이다. 예를 들어, 64 바이트 주소 공간을 물리 메모리에 배치한다고 할 때,

단순히 비어 있는 4개의 프레임을 빈 공간 리스트에서 찾으면 된다.

 

주소 공간의 각 가상 페이지에 대한 물리 메모리 위치를 기록하기 위하여 운영체제는 프로세스마다 페이지 테이블(Page Table)이라는

자료구조를 유지한다. 페이지 테이블의 주요 역할은 주소 변환 정보를 저장하는 것이다.

위의 예의 경우, 페이지 테이블은 (VP 0 -> PF 3), (VP 1 -> PF 7), (VP 2 -> PF 5), (VP 3 -> PF 2)의 정보를 가지게 될 것이다.

그런데 중요한 것은 페이지 테이블이 프로세스마다 존재한다는 것이다.

따라서, 새로운 프로세스를 실행해야 한다면 운영체제는 해당 프로세스의 페이지 테이블을 이용하여 주소 변환을 수행해야 한다.

 

본격적으로 페이징 기법을 이용한 주소 변환 과정을 살펴보자.

우선, 가상 주소를 가상 페이지 번호(VPN)와 페이지 내의 오프셋, 2개의 요소로 분할해야 한다.

상기 예에서 가상 주소 공간의 크기는 64바이트였다. 이를 표현하기 위해서는 전체 6비트(2의 6승 = 64)가 필요하다.

그중, 2비트가 16KB 페이지 4개의 VPN을 나타내기 위해 사용되며, 나머지 4비트가 페이지의 오프셋이 된다.

 

가상 주소 21을 이진 형식으로 변환하면 010101이다. 이를 VPN과 오프셋으로 나누면 아래와 같이 표현할 수 있다.

즉, 가상 주소 21은 VPN 01번의 5번째 바이트를 의미한다.

 

이제 VPN을 페이지 테이블의 인덱스로 사용하면 가상 주소가 어느 물리 프레임에 저장되어 있는지 찾을 수 있다.

앞선 예의 페이지 테이블에서 VP 1은 PF 7에 해당하였다. 다시 말해, 물리 프레임 번호(PFN)는 7(이진수 111)이다.

 

이처럼 페이지 테이블을 이용하여 VPN을 PFN으로 주소 변환하고, 이를 오프셋과 결합하면 물리 주소(1110101)를구할 수 있다.

해당 물리 주소가 데이터가 저장된 정확한 위치이다.

페이지 테이블은 어디에 저장되는가?

페이지 테이블은 매우 커질 수 있다. 예를 들어, 4KB 크기의 페이지를 갖는 32비트 가상 주소 공간을 가정해보자.

가상 주소는 20비트 VPN과 12비트 오프셋으로 구성된다. 이때, 20비트 VPN은 전체 주소 변환 정보가 2의 20승 가지라는 의미이다.

그런데 변환 정보와 더불어 기타 비트를 표현하기 위해페이지 테이블 항목(PTE, Page Table Entry)마다 4바이트가 필요하다고 하면,

한 개의 페이지 테이블을 저장하기 위해 총 4MB의 메모리가 사용되는 것이다. 만약 프로세스 100개가 실행 중이라고 가정하면,

페이지 테이블 100개가 필요하고 이는 주소 변환을 위해서 운영체제가 400MB의 메모리를 사용해야 함을 의미한다.

이처럼 페이지 테이블은매우 커질 수 있기에 MMU에 유지할 수 없다. 우선은 페이지 테이블이메모리에 상주한다고 가정하자.

앞으로 이러한 가정을 수정해나갈 것이다.

페이지 테이블에는 실제 무엇이 있는가?

페이지 테이블은 가상 페이지 번호(VPN)를 물리 프레임 번호(PFN)로 매핑 정보를 저장하는데 사용되는 자료 구조이다.

다양한 자료 구조가 사용 가능하나 우선은 선형 페이지 테이블을 가정하자. 이후에는 고급 자료 구조를 사용할 것이다.

운영체제는 원하는 물리 프레임 번호를 찾기 위하여 가상 페이지 번호로 배열 형식의 페이지 테이블에 접근한다.

페이지 테이블의 각 항목(PTE)은 매핑 정보 이외에도 다양한 비트 정보들을 갖고 있다. 

Valid Bit는 물리 프레임 할당 여부를 나타내기 위한 비트이다. 예를 들어, 특정 페이지가 물리 프레임과 매핑되지 않았다면,

다시 말해 물리 프레임이 할당되지 않았다면 Valid Bit는 0으로 표시된다. 해당 페이지를 통해 메모리에 접근을 시도하는 경우,

페이지 폴트가 발생한다. 페이지의 읽기/쓰기/실행 가능 여부를 표시하는 Protection Bit도 있다. 허용하지 않은 방식으로 페이지에

접근하려고 하면 운영체제에 트랩을 발생시킨다. Present Bit는 이 페이지가 물리 메모리에 있는지 혹은 디스크에 있는지 나타낸다.

Dirty Bit는 물리 메모리 반입 후, 페이지의 변경 여부를 나타내기 위해 사용한다. Reference Bit(Accessed Bit)는 페이지 접근 여부를

나타내기 위해 사용한다. Dirty Bit과 Reference Bit는 페이지 교체 정책, 메모리에 어떤 페이지가 유지되어야 하는지를 결정하는데

사용된다. 아래는 x86 아키텍처의 페이지 테이블 항목을 보여준다.

 

P : Present Bit, R/W : Read and Write, U/S : User and Superviser,  A : Reference Bit,  D : Dirty Bit

페이징 : 너무 느림

페이징 기법을 이용하여 특정 물리 주소에서 데이터를 얻기 위해서는 가상 주소를 물리 주소로 변환하는 과정을 거쳐야 한다.

그런데 페이지 테이블에서 변환 정보를 반입하는 과정 역시 메모리 참조를 수반한다.

다시 말해, 특정 물리 주소에서 데이터를 얻기 위해서 메모리 참조를 두 번 수행해야 한다는 것이다. 이는 굉장히 느린 작업이다.

요약

페이징은 많은 장점을 갖고 있다. 하지만 페이지 테이블 접근으로 인한 시스템 성능 저하와 페이지 테이블을 저장하기 위한 메모리 공간

낭비의 가능성이 존재한다. 이 두 가지 문제를 해결하기 위한 방법들을 살펴볼 것이다.

Comments