PintOS Out Of Memory 개념: Demand Paging과 Eviction

PintOS의 Out Of Memory(OOM) 테스트는 물리 메모리가 부족한 상황에서도 시스템이 올바르게 동작하는지를 검증한다. 이를 이해하려면 Demand PagingPage Eviction(쫓아내기), Swap의 흐름을 알아야 한다. 차례대로 정리한다.

1. Demand Paging (요구 페이징)

Demand Paging은 운영체제가 실제로 필요할 때만 메모리 페이지를 로드하는 기법으로, 가상 메모리 시스템에서 메모리를 효율적으로 쓰기 위한 핵심 기술이다.

1-1. 기본 개념

방식 동작 단점
기존 방식 (Pre-paging) 프로그램 시작 시 모든 페이지를 한 번에 메모리에 로드 필요 없는 페이지까지 올려 메모리 낭비가 심함
Demand Paging 실행에 필요한 최소한의 페이지만 먼저 올리고, 나머지는 실제 접근 시 로드 첫 접근 시 page fault 처리 비용 발생

1-2. 동작 방식

  1. 프로세스 실행 시작
    • 코드·데이터 전체를 메모리에 올리지 않는다
    • 페이지 테이블에 해당 페이지가 “현재 메모리에 없음(not present)”이라고 표시한다
  2. 접근 시도 → Page Fault 발생
    • CPU가 메모리에 없는 페이지에 접근하면 page fault가 발생한다
    • 제어가 커널의 page fault 핸들러로 넘어간다
  3. 커널이 페이지를 메모리에 적재
    • 페이지의 출처(실행 파일, swap 영역, 또는 0으로 채울 익명 페이지)에 따라 물리 프레임을 확보해 내용을 채운다
    • 페이지 테이블 엔트리(PTE)를 “present + 해당 프레임”으로 갱신한다
  4. 명령 재실행
    • fault가 났던 명령을 다시 실행하면 이제 정상적으로 페이지에 접근할 수 있다

이 흐름 덕분에 프로그램은 실제로 쓰는 페이지에 대해서만 물리 메모리를 소비한다. (관련 개념으로 Demand-zero memory도 참고하면 좋다.)

2. Page Fault의 두 종류

page fault라고 다 같은 것은 아니다. OOM 테스트를 이해하려면 둘을 구분해야 한다.

종류 상황 처리
정상 fault (lazy loading) 아직 로드되지 않은 유효한 페이지에 처음 접근 페이지를 적재하고 명령 재실행 (정상 동작)
비정상 fault 잘못된 주소, 권한 위반(읽기 전용에 쓰기 등) 해당 프로세스를 종료

Demand Paging에서 대부분의 fault는 첫 번째(정상) 종류이며, 이를 처리하는 것이 가상 메모리 구현의 핵심이다.

3. 메모리가 가득 찼다면? — Page Eviction

물리 메모리에는 한계가 있다. 새 페이지를 올려야 하는데 빈 프레임이 없으면, 기존 페이지 하나를 쫓아내(evict) 공간을 확보해야 한다. 이것이 OOM 테스트가 실제로 검증하는 부분이다.

3-1. Eviction 흐름

  1. 빈 프레임을 요청했는데 없다 → victim(쫓아낼 페이지)을 고른다
  2. victim이 수정된(dirty) 페이지라면, 내용을 잃지 않도록 swap 영역(디스크) 에 저장한다
  3. victim의 프레임을 회수하고, PTE를 “not present”로 바꾼다
  4. 비워진 프레임에 새 페이지를 적재한다

나중에 swap된 페이지에 다시 접근하면 page fault가 일어나고, 커널은 swap에서 그 페이지를 다시 읽어 들인다(swap in).

3-2. Victim 선정 정책

어떤 페이지를 쫓아낼지 고르는 대표적인 알고리즘이다.

정책 설명
FIFO 가장 먼저 들어온 페이지를 쫓아냄. 단순하지만 자주 쓰는 페이지를 내보낼 수 있음
LRU 가장 오래 사용되지 않은 페이지를 쫓아냄. 이상적이나 구현 비용이 큼
Clock (Second-chance) LRU의 근사. accessed 비트를 활용해 “한 번 더 기회”를 주는 방식으로, PintOS에서 흔히 구현

4. Swap

Swap은 물리 메모리에서 쫓겨난 페이지를 임시로 보관하는 디스크 영역이다.

동작 설명
Swap Out victim 페이지의 내용을 swap 영역에 기록하고 프레임을 회수
Swap In swap된 페이지에 다시 접근(fault)하면 swap에서 읽어와 프레임에 적재

dirty하지 않은(수정되지 않은) 페이지 중 실행 파일에서 온 것은, swap에 쓰지 않고 필요할 때 원본 파일에서 다시 읽어올 수도 있다. 이렇게 하면 swap 공간을 아낄 수 있다.

5. Out Of Memory 테스트가 검증하는 것

정리하면, OOM 테스트는 다음 사이클이 끝까지 안정적으로 도는지를 확인한다.

  1. Demand Paging으로 필요한 페이지만 올린다
  2. 메모리가 가득 차면 victim을 골라 evict하고, 필요하면 swap out한다
  3. 확보한 프레임에 새 페이지를 올린다
  4. swap된 페이지에 다시 접근하면 swap in한다

즉, 물리 메모리보다 훨씬 큰 메모리를 요구하는 상황에서도 page fault → eviction → swap → 재적재 가 무한히 반복되며 시스템이 죽지 않아야 통과한다. 이 과정에서 프레임·swap 슬롯을 누수 없이 회수하는 것이 관건이다.


© 2022 JeongHwan Yun.