Anonymous Page (익명 페이지)

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

용도

  • Heap 영역: malloc() 이나 brk() 로 확장된 사용자 메모리에서 사용합니다.
  • Stack 영역: 스택 프레임 추가 시 자동 생성되는 페이지에서 사용합니다.
  • 임시 버퍼: char *buf = malloc(1024) 같은 임시 저장공간 생성시 사용합니다.

왜 Anonymous Page가 필요한가? (심화)

1. 사용자 프로그램은 항상 파일만 사용하는 것이 아니기 때문입니다.

현실에서 프로그램은 다음과 같은 메모리 공간을 필요로 합니다.

메모리 구역설명파일 기반?
코드 영역 (text)실행파일에서 가져옴O (file-backed)
데이터 영역 (data)초기화된 전역 변수O
힙 영역 (heap)malloc(), new로 동적 메모리 할당X
스택 영역 (stack)함수 호출 시 생기는 지역 변수X

→ Anonymous Page는 힙과 스택을 담당하는 페이지입니다.

2. 힙과 스택은 파일 없이도 쓸 수 있어야 합니다.

  • 힙은 프로그램이 실행 도중에 동적으로 확장돼야 합니다.
  • 스택은 함수 호출마다 자동으로 커졌다 작아졌다 해야 합니다.

→ 힙과 스택은 특정 파일을 참조하지 않고, 운영체제가 직접 메모리를 할당해서 관리해줘야합니다. 그래서 파일 없이 사용 가능한 Anonymous Page라는 개념이 필요합니다.

3. Swap과 결합해 메모리를 절약할 수 있습니다.

익명 페이지는 파일이 없기 때문에, 메모리 부족 시 운영체제는 이 내용을 Swap 공간에 따로 저장해야 합니다.
즉, Anonymous Page는 Swap과 함께 동작하며 다음과 같은 이점을 줍니다.

  • 힙이 너무 커질 경우 → 일부를 스왑으로 내보냅니다.
  • 메모리 사용량 줄입니다.
  • 사용되지 않는 페이지를 우선 내보내기 좋습니다. (파일과의 연동 없음)

Pintos에서…

Pintos에서 관련된 구조체는 다음과 같습니다.

구조체위치설명
struct pagevm/page.h모든 종류의 페이지의 공통 정보를 담는 구조체
struct anon_pagevm/anon.h익명 페이지 전용 정보 (예: swap_slot)
struct framevm/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으로 초기화됩니다.

Swap과의 연동

Anonymous page는 백업 파일이 없기 때문에, 메모리에서 제거할 때는 Swap 공간에 저장해야합니다.

동작 흐름은 다음과 같습니다.

  1. evict_frame()에서 익명 페이지가 선택됩니다.
  2. swap_out() 호출하고, 페이지의 내용을 swap 영역과 swap_slot 번호를 저장합니다.(anon_page.swap_slot)
  3. 나중에 다시 접근하면 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()
profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글