익명 페이지는 파일에 연결되지 않은 메모리 페이지를 말합니다.
즉, 특정 파일을 백업으로 갖지 않고, 내용이 오직 메모리 안에만 존재하는 페이지입니다.

malloc() 이나 brk() 로 확장된 사용자 메모리에서 사용합니다.char *buf = malloc(1024) 같은 임시 저장공간 생성시 사용합니다.현실에서 프로그램은 다음과 같은 메모리 공간을 필요로 합니다.
| 메모리 구역 | 설명 | 파일 기반? |
|---|---|---|
| 코드 영역 (text) | 실행파일에서 가져옴 | O (file-backed) |
| 데이터 영역 (data) | 초기화된 전역 변수 | O |
| 힙 영역 (heap) | malloc(), new로 동적 메모리 할당 | X |
| 스택 영역 (stack) | 함수 호출 시 생기는 지역 변수 | X |
→ Anonymous Page는 힙과 스택을 담당하는 페이지입니다.
→ 힙과 스택은 특정 파일을 참조하지 않고, 운영체제가 직접 메모리를 할당해서 관리해줘야합니다. 그래서 파일 없이 사용 가능한 Anonymous Page라는 개념이 필요합니다.
익명 페이지는 파일이 없기 때문에, 메모리 부족 시 운영체제는 이 내용을 Swap 공간에 따로 저장해야 합니다.
즉, Anonymous Page는 Swap과 함께 동작하며 다음과 같은 이점을 줍니다.
Pintos에서 관련된 구조체는 다음과 같습니다.
| 구조체 | 위치 | 설명 |
|---|---|---|
struct page | vm/page.h | 모든 종류의 페이지의 공통 정보를 담는 구조체 |
struct anon_page | vm/anon.h | 익명 페이지 전용 정보 (예: swap_slot) |
struct frame | vm/frame.h | 실제 물리 메모리 프레임 정보 |
→ 익명 페이지는 struct page 안의 union 멤버로 존재하는 anon_page 구조를 통해 구현됩니다.
익명페이지는 다음과 같은 코드로 생성됩니다.
vm_alloc_page_with_initializer (VM_ANON, upage, writable, init, aux);
→ init == anon_initializer()가 등록됩니다. 이후 실제로 해당 주소에 접근하면 Page Fault 발생 → anon_initializer()가 실행되어 frame을 할당하고 0으로 초기화됩니다.
Anonymous page는 백업 파일이 없기 때문에, 메모리에서 제거할 때는 Swap 공간에 저장해야합니다.
동작 흐름은 다음과 같습니다.
evict_frame()에서 익명 페이지가 선택됩니다.swap_out() 호출하고, 페이지의 내용을 swap 영역과 swap_slot 번호를 저장합니다.(anon_page.swap_slot)swap_in() 호출로 swap에서 데이터를 읽어와 복구합니다.| 항목 | 설명 |
|---|---|
| Anonymous Page란? | 파일에 연결되지 않은 메모리 전용 페이지 |
| 용도 | Heap, Stack, 임시 버퍼 등 |
| Pintos 구조 | struct page + struct anon_page, VM_ANON 타입 |
| 처리 방식 | Lazy loading + swap 연동 |
| 핵심 함수 | anon_initializer(), anon_swap_in(), anon_swap_out() |