운영체제에서 메모리 관리는 시스템 성능과 안정성에 매우 중요한 역할을 합니다. 메모리가 부족할 때 효율적으로 메모리를 회수하는 페이지 프레임 회수(Page Reclaim)는 핵심적인 기술입니다.
1. 페이지 프레임 회수의 개념
- 페이지 프레임 회수는 물리적 메모리가 부족할 때 사용되지 않는 페이지를 해제하거나 스왑 영역으로 이동시켜 새로운 메모리 요청을 처리할 수 있도록 하는 과정
2. LRU 리스트 구조와 기능
- 운영체제는 참조 플래그(PTE.accessed)와 페이지 상태를 기반으로 페이지를 ACTIVE와 INACTIVE 리스트 간에 이동시키며 필요 시 비활성 리스트에서 희생 페이지(victim page)를 선택해 회수
익명 페이지(Anonymous Pages)
- ACTIVE_ANON
- INACTIVE_ANON
- 덜 참조된 익명 페이지로 필요 시 스왑 영역으로 이동
파일 기반 페이지(File-backed Pages)
- ACTIVE_FILE
- INACTIVE_FILE
- 덜 참조된 파일 매핑 페이지로 필요 시 디스크에 기록 후 제거
Swappiness
- 익명 페이지와 파일 기반 페이지의 회수 우선순위를 조정하는 매개변수
- Swappiness 값이 높으면 익명 페이지를 더 빨리 스왑 영역으로 전송
- 값이 낮으면 파일 기반 페이지를 더 빨리 회수

3. 알고리즘
Clock-based Second Chance Algorithm
- LRU 근사 알고리즘으로 참조된 희생 페이지는 삭제하지 않고 유지하며 효율성을 높임
Working-set 개념
- LRU 리스트를 ACTIVE와 INACTIVE로 나누어 워킹 세트(working set)를 관리
- 자주 사용되는 "핫" 페이지는 ACTIVE 리스트에 유지되고 덜 사용되는 "콜드" 페이지는 INACTIVE 리스트로 이동
Swappiness
Swappiness 값은 익명 페이지와 파일 기반 페이지의 회수 우선순위를 조정
4. Refault Distance
- 페이지가 메모리에서 제거되었다가 다시 참조(refaulted)될 때 계산되는 거리
Refault Distance 계산 공식
- Refault Distance=size INACTIVE +R−ERefault Distance=size INACTIVE +R−E
- EE: 페이지가 메모리에서 제거될 당시의 nonresident_age
- RR: 페이지가 다시 참조(refaulted)될 당시의 nonresident_age
- size(INACTIVE)size(INACTIVE)

5. 페이지 회수방법
try_to_free_pages()
(동기적 Reclaim)
- 목적
- 메모리 부족으로 인해 특정 영역(zone)이 최소 워터마크(min watermark) 아래로 떨어졌을 때 사용
- 특징
- 필요하면 디스크에 데이터를 기록(write-back I/O)하여 메모리를 확보
kswapd
와 유사하게 영역을 줄이는(shrinking) 작업을 수행하지만 설정된 목표(nr_to_reclaim
)가 충족되면 중단
- 함수 호출 흐름
shrink_zones()
→ shrink_node()
→ shrink_node_memcgs()
kswapd
(비동기적 Reclaim)
- 목적
- 메모리 부족으로 인해 특정 영역이 낮은 워터마크(low watermark) 아래로 떨어졌을 때 트리거
- 특징
- 모든 영역(zone)을 "균형 상태(balanced)"로 만들려고 시도
- 노드에 대해
balance_pgdat()
를 호출하며 shrink_node_memcgs()
를 호출
- 균형 상태의 정의
- 사용 가능한 페이지 수(
nr_free
)가 WMARK_HIGH
이상
- 요청된 페이지의 크기(order)를 충족할 수 있는 적절한 페이지 필요
- 균형 상태가 아니면 우선순위를 조정하여 재시도
node_reclaim()
(sysctl → zone_reclaim_mode)
- 목적
- 다른 메모리 노드에 부담을 주지 않도록 로컬 노드에서 파일 페이지를 회수
- 특징

shrink_node()
- 메모리 부족 시 특정 노드에서 비활성화된 페이지를 회수하는 함수
- 메모리 그룹(memcg)에 대해 작업을 수행하며 LRU 벡터에서 비활성 리스트를 스캔하고 필요 시 캐시나 더티 데이터를 정리
shrink_lruvec()
LRU 벡터에서 비활성 리스트의 페이지를 스캔하고 참조 여부에 따라 다음 상태로 분류
- 유지(KEEP)
- 활성화(ACTIVATE)
- 회수(RECLAIM)
shrink_page_list()
비활성 리스트에서 선택된 페이지의 상태를 분석
- 스왑 캐시에 추가
- 디스크에 기록 후 제거
- 활성화 또는 유지
6. Unevictable Pages(비회수 가능한 페이지)
회수가 불가능한 Unevictable Pages는 별도의 리스트에 저장
- 잠긴 메모리(
mlock()
호출)
- RAM 파일 시스템 데이터
- 프로세스 간 잠긴 공유 메모리 영역 등
7. 결론
페이지 프레임 회수는 운영체제가 물리적 메모리를 효율적으로 관리하기 위한 필수적인 기술입니다. Linux 커널은 LRU 기반 알고리즘을 통해 자주 사용되는 데이터를 메모리에 유지하고 덜 중요한 데이터를 제거하여 성능을 최적화합니다. Refault Distance 계산은 이러한 과정에서 중요한 역할을 하며 시스템 안정성을 보장합니다.