Virtual Memory #1
- Virtual Memory 기술은 1960년대부터 존재해왔던 기술이다.
- 1978년, IBM에서는 Real, Virtual, Transparent, Erased 개념을 기술했다.
1. Real: 실제로 존재하고, 볼 수 있는 것
2. Virtual: 실제론 없으나, 볼 수 있는 것
3. Transparent: 실제로 존재하나, 볼 수 없는 것
4. Erased: 존재하지도 않고, 볼 수도 없는 것
- Virtual Memory는 OS가 지원하는 기술이다.
- Secondary Storage는 시스템의 전원이 꺼져도 데이터가 그대로 저장되어 있으며, 메모리 크기는 메인 메모리보다 훨씬 크다.
- Processor는 Physical Address*를 이용하여 메인 메모리에 접근한다.
- Processor 내부에 Virtual Memory Space는 실제로 존재하지는 않으나, 가상으로 존재하는 메모리이며, Virtual Memory에 접근하기 위해 Virtual Address**를 이용한다.
- 메인 메모리는 Virtual Memory와 Seceondary Storage 사이에 위치하여 마치 Cache와 같은 역할을 한다.
* Physical Address: 메인 메모리(D-RAM)에 사용되는 주소이다.
** 프로그래머가 OS 기반하에 프로그램 개발 시 사용하는 주솟값은 Virtual Address이다.
1. Virtual Memory 개념의 첫 번째 필요성: 프로세스 간 메인 메모리 공유를 위해
- 명령어들로 구성된 "프로그램"은 Secondary Storage(Hard Disk)에 저장된다.
- "프로그램"을 동적인 엔터티인 "프로세스"로 전환하기 위해서는 프로그램 내에서 실행되어야 하는 Active Portion을 메인 메모리에 Load해야 한다.
- 제한된 메인 메모리의 크기로 인해 프로세스들이 수시로 메인 메모리에 Load되었다가 Unload되고, 다시 Load 되곤 하는데, 이렇게 다시 Load되는 과정에서 이전의 메인 메모리 위치(이전 메인 메모리 주소)에 그대로 다시 Load된다는 보장이 없다.
- 메인 메모리의 위치(메인 메모리 물리 주소)가 변해도 프로그램 실행에 영향을 미치지 않게 하기 위해 가상의 주소 개념이 필요하다. (Virtual Memory 개념의 필요성)
- 즉, Virtual Memory 개념은 여러 프로그램들이 하나의 메인 메모리를 공유할 수 있도록 하는 개념이다.
2. Virtual Memory 개념의 두 번째 필요성: 메인 메모리보다 큰 크기의 프로세스를 실행하기 위해
- 메인 메모리보다 큰 프로그램을 사용하기 위해 Secondary Storage의 일부를 메인 메모리처럼 사용하는 기법이다.
- OS를 이용하지 않는 Embedded System이나, 구형 프로그래밍 언어(COBOL 등) 사용 시, 실제 Physical Address를 염두한 채로 프로그램이 개발되었다. (즉, Virtual Memory 개념이 없다.)
Ex. 1GB의 메인 메모리와 1.5GB의 프로그램
- 1.5GB의 프로그램을 메인 메모리에 Load가 가능하게 하기 위해 각각 1GB, 0.5GB의 Overlay로 분할하여, 각각의 Overlay는 서로 독립적으로 실행 가능하도록 설계해야 했었다.
- Virtual Memory 개념을 지원하지 않는 OS에서는 프로그램을 메인 메모리의 크기를 넘어가지 않게 Overlay로 분할해야 하며, 각각의 Overlay들이 메인 메모리에 Load/Unload할 수 있도록 독립적으로 실행 가능하도록 설계되어야 했었다.
Virtual Memory 개발 동기
1. 여러개의 프로그램 사이에서 하나의 메인 메모리를 공유할 때, 효율적이면서 안전하게 이루어질 수 있도록 한다.
- OS에게 이러한 권한을 부여함으로써, 프로그래머는 이러한 제약 사항을 신경쓰지 않아도 된다.
- OS에 의해 구현된 Virtual Memory는 동적으로 Virtual Address Space에서 Physical Address Space로 Translation 하는 역할을 한다.
2. 메인 메모리보다 큰 프로그램을 보다 편리하게 구동 가능하게 한다.
- 구시대의 비효율적인 Overlay를 이용한 기법을 사용하지 않아도 된다.
- Virtual Memory는 근본적으로 OS가 제공하는 기술이다.
- Virtual Memory는 D-RAM 기반의 메인 메모리와 Disk 기반의 Secondary Storage 사이의 속도 차이를 완화하기 위해 Cache처럼 사용된다.
- 실제 메인 메모리의 데이터들을 Virtual Memory에 Mapping하기 위해 고정된 크기의 단위인 Pages를 사용한다.
(Cache와 메인 메모리가 Cache Block(Cache Line)이라는 단위를 사용하는 것과 일맥상통한다.)
(일반적으로. Pages의 크기는 4KB 수준이다.)
- Page Fault: 프로세스가 원하는 Page가 메인 메모리에 Load되어 있지 않아서 발생하는 현상이다. (Miss와 같다.)
- OS는 Physical Page와 Virtual Page를 Mapping(Translation)하는 역할을 한다.
- 이러한 Mapping 관계를 생성/기록하기 위해 Page Table이 존재한다.
- Page Table에는 Virtual Page와 Physical Page의 Mapping 관계에 대한 정보를 저장하고 있다.
- 프로그램은 Virtual Memory Space 기반하에 구현된다.
- 프로그램 내의 각각의 Page는 메인 메모리 혹은 Hard Disk에 Mapping이 되어 있어야 실제로 구동이 가능해진다.
- 프로그램마다 각각의 Page Table을 두어 Virtual Page와 Physical Page의 Mapping 관계를 알고 있어야 한다.
- 실제, 프로그램 동작 중, 메모리 요청이 들어오게 되면, Virtual Memory Space에서 Physical Memory Space로 OS에 의해 변환된다.
Ex. MIPS에서는 Virtual Address 또한, 32bits 체계로 표현 가능하다.
- 각각의 Page가 4KB이기 때문에, 12bits의 Page Offset으로 사용할 수 있다. (\(2^12 = 4,096\), 즉, 하나의 Page내에 4,096개의 공간을 구분할 수 있다.)
- 나머지 20bits는 Virtual Page Number로 사용한다. (즉, 2^20개의 서로다른 Virtual Page를 구분할 수 있다.)
- 하나의 Virtual Page가 하나의 Physical Page로 1:1 Mapping되므로, Offset은 그대로 사용된다.
- Physical Address는 H/W의 구현상의 이유 등으로 32bits인 Virtual Memory에 대비적으로 더 적은 Bit수로 구현될 수 있다.
※ 즉, Virtual Address는 실제 Physical Address의 Bit수 보다 더 크게 구현될 수 있다.
- OS는 각각의 프로세스(프로그램)당 하나의 Page Table을 보유하고 있다.
- Page Ta ble은 Virtual Address를 실제 Physical Address로 변환하기 위한 정보(관계)를 저장한다.
- Page Table은기본적으로메인메모리에위치한다.
- Page Table Entry(PTE)에는 각각의 Virtual Page들이 어느 Physical Page로 대응되는지를 나타낸다.
- PTE는 Virtual Page Number로 Indexing되어 있다.
- 메인 메모리에 저장된 Page Table의 시작 주소를 저장하는 Page Table Register가 CPU내에 존재한다.
실제, Page Table을 활용하는 두 가지 사례
1. 필요로 하는 특정 Virtual Page에 대한 Physical Page가 메인 메모리에 위치해 있는 경우
- PTE에는 정상적으로 Physical Page Number와 부가적인 정보가 저장되어 있을 것이다.
2. 필요로 하는 특정 Virtual Page에 대한 Physical Page가 메인 메모리 없는 경우
- PTE는 Secondary Storage내의 Swap Space를 검색하여 찾아낸다.
- Swap Space는 하나의 프로세스에 대한 전체 Virtual Memory Space 내용들을 전부 저장하고 있는 공간이다.
- 프로그래머가 프로그래밍 시에 사용하는 주소는 Virtual Address이다.
- Virtual Address는 OS에 의해 Physical Address로 변환되어 실질적으로 사용가능해진다.
- OS는 메인 메모리에 Page Table을 저장시키고, Page Table의 시작 주소는 Page Table Register에 저장하여 프로세서가 알 수 있게 한다.
- Virtual Page #(Number)를 이용하여 Page Table 내부를 Indexing 한다.
- Page Table의 Valid(V) Bit가 1이면 메인 메모리에 데이터가 존재함(마치, HIT)을 의미한다.
- "Page Table Register + Offset"을 계산하여, 원하는 데이터가 위치한 실제 메인 메모리 주소를 알아낼 수 있다.
- Physical Page #(Number)는 실제 메인 메모리 주솟값을 의미한다.