Anonymous & File-backed Page

Anonymous page와 File-backed page에 대해서 알아보자

Anonymous page(익명 페이지)

“태어나서 처음으로 0만 담긴 백지장을 받고, 나중에 필요해지면 스왑장치에 임시로 메모를 남기는 종이”

  1. 정의

    • 백업 파일이 없는 사용자 가상 페이지 (어떤 파일에 연결되지 않고, 콘텐츠를 오직 프로세스가 직접 만든다)
  2. 주로 쓰이는 곳

    • 힙(Heap) - malloc(), brk()/sbrk()로 확장된 영역

    • 스택(Stack) - 함수 호출 · 지역 변수 · 스택 자동 확장

    • BSS - 초기값이 0인 전역/정적 변수

  3. 초기 로딩

    1. 페이지 폴트 발생

    2. 커널이 새 프레임을 할당(palloc 등)

    3. Zero-fill → 프레임 전체를 0으로 채움

    4. PTE(Present = 1…) 갱신

  4. 추방(Eviction) & 복원

    • 프레임 부족 시 swap device에 4KB 블록 단위로 기록

    • page->anon.swap_slot에 위치 기록

    • 다시 접근하면 swap 슬롯에서 읽어 프레임 재생성(swap_in)

특징 & 장단점

장점단점
① 생성·파괴가 빠르고 단순 (Zero-fill)① 스왑 I/O 부담 (백업이 swap뿐)
② 프로세스마다 독립적인 공간② 다른 프로세스와 공유 불가-동일 내용이라도 중복

Anonymous page는 “이 페이지를 원래 복원시켜 줄 파일이 없다”는 뜻이고, 그래서 스왑 장치가 실질적 백업이다.

File-backed page

“이미 원본 파일이 존재하는 종이의 사본. 필요하면 원본을 다시 떼어오면 되고, 수정하면 원본에 덮어쓰거나 폐기”

  1. 정의

    • 파일 시스템 블록을 근간(backup store)으로 삼는 가상 페이지 (실행 파일 · 공유 라이브러리 · mmap()한 일반 파일 등)
  2. 주로 쓰이는 곳

    • 코드(Text) / 데이터(Data) 세그먼트 - ELF 로더가 LAZY-LOAD

    • 공유 라이브러리 - 여러 프로세스가 같은 read-only 프레임 공유

    • Memory-Mapped File - mmap()으로 매핑해 직접 버퍼처럼 사용

  3. 초기 로딩

    1. 페이지 폴트 발생

    2. 새 프레임 할당

    3. file_read_at()으로 해당 오프셋 데이터 읽어 채움

      • 남는 바이트는 0-fill
    4. PTE 갱신

  4. 추방(Eviction) & 복원

상태동작
Clean(수정 안됨)프레임을 그냥 버림 → 나중에 다시 파일에서 읽으면 끝
Dirty(수정됨)쓰기 가능한 매핑이면 파일에 write-back
읽기 전용 매핑에서 dirty가 날 일 없도록 PTE R/W 비트를 미리 제한

특징 & 장단점

장점단점
Clean페이지는 I/O 없이 드롭 → 캐시처럼 동작
② 여러 프로세스 간 공유·중복 제거 가능 (코드 세그먼트)
① Dirty 페이지 관리 복잡 (write-back 시점·동기화)
② 파일 시스템 락·I/O 지연 영향

File-backed page는 “이미 파일이 백업 스토어로 존재한다”는 뜻이고, OS는 이를 활용해 I/O 횟수를 줄이고, 여러 프로세스가 같은 데이터(코드 등)를 안전하게 공유할 수 있다.

왜 ‘익명’과 ‘파일’로 나눌까?

  1. 백업 스토어 차이

    • 익명 : 원본이 없으므로 스왑이 유일한 백업

    • 파일 : 이미 디스크에 존재 → 불필요 I/O 줄이기

  2. 보호 및 공유 모델

    • 파일 기반 read-only 코드는 모든 프로세스가 하나의 물리 프레임 공유 → 메모리 절약

    • 익명은 변경이 빈번 · 사적이라 안전하게 분리

  3. 성능 최적화

    • Clean file page drop → 페이지 캐시 hit/evict가 빠름

    • 익명은 zero-fill이 간단하고 빠름

즉, “누가 너의 원본을 책임지냐?”에 따라 정책이 갈라진다 “원본 없음 → 익명 + 스왑” “원본 파일 → 파일 + 캐시/write-back”

한 눈에 보는 차이점

구분Anonymous pageFile-backed page
초기 내용0으로 채우거나(즉시 zero-fill) swap 공간에서 가져옴실제 파일 블록(ELF 텍스트/데이터, mmap)
영속성(Persistence)프로세스가 끝나면 사라짐. 변경분을 별도로 저장하지 않는 한 디스크에 남지 않음원본 파일이 ‘근본’이므로, 읽기 전용이면 버려도 되고, 쓰기 가능 매핑이면 dirty 페이지를 파일에 write-back 해야 함
교체(Eviction)프레임이 부족하면 swap device(swap disk)의 빈 슬롯에 페이지 전체를 기록프레임이 부족하면
clean 페이지 → 그냥 버림(다시 파일에서 읽으면 됨)
dirty페이지 → 파일에 쓰거나, 쓰기 권한 없는 매핑이면 우선 swap 영역 사용 가능
대표 영역Heap, user stack, brk/sbrk로 늘어난 익명 메모리, BSS실행 파일 코드·데이터, 공유 라이브러리, mmap()된 보통 파일들
PintOS page->operationsanon_page_opsswap_in, swap_out, destroyfile_page_opsswap_in(=file_read_at), swap_out(dirty이면 file_write_at), destroy
스왑 슬롯 필요?예 (page->anon.swap_slot)대게 필요 없음(파일이 백업 스토어). 단, 쓰기 가능 매핑에서 dirty 후 evict 시 swap 사용 가능

© 2022 JeongHwan Yun.