Pintos 세 번째 프로젝트는 Virtual Memory이다.
핀토스에서 가상 메모리 시스템을 구현하기 위해 SPT(Supplemental Page Table)를 사용한다.
SPT의 역할은 그 이름처럼 Page Table을 보조하는 역할을 한다.
먼저, 운영체제에서 Virtual Memory System을 위해서 MMU(Memory Management Unit), TLB(Translation Lookaside Buffer) 등의 하드웨어와 함께 Page Table이라는 자료구조를 사용한다. 페이지 테이블은 페이지(Virtual page)를 프레임(Physical page)에 매핑해주는 역할을 한다. Page table은 PTE(Page Table Entry)의 배열 형태를 가진다. 각 Page Table Entry는 valid bit(0/1)와 Physical page number 정보를 담고 있고 valid bit이 1인 경우 페이지에 매핑된 물리 프레임이 존재한다는 의미이고, 0인 경우에는 페이지에 매핑된 물리 프레임이 존재하지 않는다는 의미이다. 이는 프레임이 disk로 swap out되었거나, 아직 페이지에 대한 프레임이 할당된 적 없는 페이지라는 것을 의미한다.
위 그림에서, valid bit = 0인 PTE에 접근한 경우, 유효하지 않은 주소에 접근했으므로(해당 주소에 대한 물리 공간이 존재하지 않음) Exception이 발생하는데, 이를 Page Fault라고 한다. Page Fault가 발생하는 경우는 다양하지만 현재까지의 구현 내용에서는 2가지 Case로 나눌 수 있다.
- 유효하지 않은 페이지에 접근한 경우 - > 프로세스를 종료
- 유효한 페이지에 접근했으나 아직 물리 프레임이 매핑되지 않은 경우 -> 프레임을 할당받아 mapping
위 두가지를 구별하기 위해 Pintos에서는 SPT(Supplemental Page Table)를 사용한다.
SPT를 활용하는 로직은 다음과 같다.
1) page가 새로 생성
2) SPT에 insert
3) Page Fault가 발생
4) SPT에서 해당 페이지를 찾음
5-1) SPT에 해당 페이지가 존재하지 않는 경우 : Case 1
5-2) SPT에 해당 페이지가 존재하는 경우 : Case 2
👉 필요 시점까지 메모리의 로딩을 지연시키는 방법
Page fault로 인해 리소스가 필요하다는 signal을 받을 때 물리 메모리(프레임)을 할당한 뒤 데이터를 load
현재까지는 파일을 load할 때, load 함수에서 즉시 모든 데이터를 로딩(Eager Loading)했다. 이번 프로젝트부터는, Lazy Loading를 구현하여 필요 시점까지 메모리의 로딩을 지연시키고(Lazy Loading), Page fault로 인해 리소스가 필요하다는 signal을 받을 때 물리 메모리를 할당한 뒤 데이터를 load한다.
Lazy Loading의 장점
✅ 메모리 사용량 감소 : 필요할 때만 데이터를 로드하여 메모리를 절약할 수 있다.
✅ 초기 로딩 시간 감소 : 모든 데이터를 한 번에 로드하지 않으므로 초기 로딩 시간이 감소한다.
✅ 성능 향상 : 애플리케이션이 모든 데이터를 한번에 로드해야하는 부담을 덜기 때문에 성능이 향상될 수 있다.
Lazy Loading의 단점
❌ Latency 증가 : 데이터가 즉시 필요한 경우 지연 시간이 발생한다.
❌ 데이터 누락 가능성 : 신중히 설계하지 않으면 데이터가 누락될 수 있다.
페이지는 크게 Anonymous Page와 File-backed Page로 나눌 수 있다.
Anonymous page란 파일로부터 매핑되지 않은 페이지로서 커널로부터 할당된 페이지이다. Disk에 있던 프로그램이 실행될 때 Code Section과 Data Section은 메모리에 File-backed page로 load 되지만, Stack과 Heap Section은 Anonymous page로 할당된다.