Anonymous & File-backed Page
Anonymous page와 File-backed page에 대해서 알아보자
Anonymous page(익명 페이지)
“태어나서 처음으로 0만 담긴 백지장을 받고, 나중에 필요해지면 스왑장치에 임시로 메모를 남기는 종이”
정의
- 백업 파일이 없는 사용자 가상 페이지 (어떤 파일에 연결되지 않고, 콘텐츠를 오직 프로세스가 직접 만든다)
주로 쓰이는 곳
힙(Heap) -
malloc(),brk()/sbrk()로 확장된 영역스택(Stack) - 함수 호출 · 지역 변수 · 스택 자동 확장
BSS - 초기값이 0인 전역/정적 변수
초기 로딩
페이지 폴트 발생
커널이 새 프레임을 할당(palloc 등)
Zero-fill → 프레임 전체를 0으로 채움
PTE(Present = 1…) 갱신
추방(Eviction) & 복원
프레임 부족 시 swap device에 4KB 블록 단위로 기록
page->anon.swap_slot에 위치 기록다시 접근하면 swap 슬롯에서 읽어 프레임 재생성(
swap_in)
특징 & 장단점
| 장점 | 단점 |
|---|---|
| ① 생성·파괴가 빠르고 단순 (Zero-fill) | ① 스왑 I/O 부담 (백업이 swap뿐) |
| ② 프로세스마다 독립적인 공간 | ② 다른 프로세스와 공유 불가-동일 내용이라도 중복 |
Anonymous page는 “이 페이지를 원래 복원시켜 줄 파일이 없다”는 뜻이고, 그래서 스왑 장치가 실질적 백업이다.
File-backed page
“이미 원본 파일이 존재하는 종이의 사본. 필요하면 원본을 다시 떼어오면 되고, 수정하면 원본에 덮어쓰거나 폐기”
정의
- 파일 시스템 블록을 근간(backup store)으로 삼는 가상 페이지 (실행 파일 · 공유 라이브러리 ·
mmap()한 일반 파일 등)
- 파일 시스템 블록을 근간(backup store)으로 삼는 가상 페이지 (실행 파일 · 공유 라이브러리 ·
주로 쓰이는 곳
코드(Text) / 데이터(Data) 세그먼트 - ELF 로더가 LAZY-LOAD
공유 라이브러리 - 여러 프로세스가 같은 read-only 프레임 공유
Memory-Mapped File -
mmap()으로 매핑해 직접 버퍼처럼 사용
초기 로딩
페이지 폴트 발생
새 프레임 할당
file_read_at()으로 해당 오프셋 데이터 읽어 채움
- 남는 바이트는 0-fill
PTE 갱신
추방(Eviction) & 복원
| 상태 | 동작 |
|---|---|
| Clean(수정 안됨) | 프레임을 그냥 버림 → 나중에 다시 파일에서 읽으면 끝 |
| Dirty(수정됨) | 쓰기 가능한 매핑이면 파일에 write-back 읽기 전용 매핑에서 dirty가 날 일 없도록 PTE R/W 비트를 미리 제한 |
특징 & 장단점
| 장점 | 단점 |
|---|---|
| ① Clean페이지는 I/O 없이 드롭 → 캐시처럼 동작 ② 여러 프로세스 간 공유·중복 제거 가능 (코드 세그먼트) | ① Dirty 페이지 관리 복잡 (write-back 시점·동기화) ② 파일 시스템 락·I/O 지연 영향 |
File-backed page는 “이미 파일이 백업 스토어로 존재한다”는 뜻이고, OS는 이를 활용해 I/O 횟수를 줄이고, 여러 프로세스가 같은 데이터(코드 등)를 안전하게 공유할 수 있다.
왜 ‘익명’과 ‘파일’로 나눌까?
백업 스토어 차이
익명 : 원본이 없으므로 스왑이 유일한 백업
파일 : 이미 디스크에 존재 → 불필요 I/O 줄이기
보호 및 공유 모델
파일 기반 read-only 코드는 모든 프로세스가 하나의 물리 프레임 공유 → 메모리 절약
익명은 변경이 빈번 · 사적이라 안전하게 분리
성능 최적화
Clean file page drop → 페이지 캐시 hit/evict가 빠름
익명은 zero-fill이 간단하고 빠름
즉, “누가 너의 원본을 책임지냐?”에 따라 정책이 갈라진다 “원본 없음 → 익명 + 스왑” “원본 파일 → 파일 + 캐시/write-back”
한 눈에 보는 차이점
| 구분 | Anonymous page | File-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->operations | anon_page_ops → swap_in, swap_out, destroy | file_page_ops → swap_in(=file_read_at), swap_out(dirty이면 file_write_at), destroy |
| 스왑 슬롯 필요? | 예 (page->anon.swap_slot) | 대게 필요 없음(파일이 백업 스토어). 단, 쓰기 가능 매핑에서 dirty 후 evict 시 swap 사용 가능 |