페이지 교체 알고리즘 (Page Replacement Algorithm)
한눈에 보기
물리 메모리가 가득 찼을 때 내보낼 페이지를 고르는 페이지 교체 알고리즘을 다룬다. FIFO와 LRU와 클럭 알고리즘 비교, 벨라디의 모순, 스래싱과 작업 집합 모델까지 정리한다.
최종 업데이트 2026.09.17
페이지 교체 알고리즘(Page Replacement Algorithm)은 물리 메모리가 가득 찬 상태에서 새 페이지를 들여와야 할 때 어떤 페이지를 내보낼지 결정하는 운영체제의 정책이다. 가상 메모리 시스템에서는 필요한 페이지가 메모리에 없으면 페이지 폴트(page fault)가 발생하고 디스크에서 읽어 와야 하는데, 이 비용이 매우 크므로 앞으로 쓰이지 않을 페이지를 잘 골라 내보내는 것이 성능을 좌우한다. FIFO, LRU, 클럭 알고리즘이 대표적이다.
페이지 폴트와 교체가 일어나는 맥락
요구 페이징(demand paging)에서는 페이지를 실제로 접근할 때 비로소 메모리에 올린다. 접근한 페이지가 메모리에 없으면 MMU가 페이지 폴트 트랩을 발생시키고, 커널은 빈 프레임을 찾아 디스크에서 페이지를 읽어 온 뒤 페이지 테이블을 갱신하고 명령을 재실행한다. 빈 프레임이 없다면 희생 페이지(victim page)를 골라야 하며, 그 페이지가 수정된 상태(dirty)라면 디스크에 먼저 써야 해서 비용이 두 배가 된다. 그래서 교체 알고리즘은 페이지 폴트 횟수를 줄이는 동시에 수정되지 않은 페이지를 우선 내보내는 것도 고려한다. 이론적 최적은 앞으로 가장 오랫동안 사용되지 않을 페이지를 내보내는 OPT(Optimal)지만 미래를 알 수 없으므로, 실제 알고리즘들은 과거의 접근 패턴이 미래에도 이어진다는 지역성(locality)에 기대어 OPT를 근사한다. 또한 희생자를 폴트를 일으킨 프로세스의 프레임 안에서만 고르는 지역 교체(local replacement)와 시스템 전체 프레임에서 고르는 전역 교체(global replacement)의 구분도 있다. 전역 교체는 프레임 활용이 유연하지만 한 프로세스의 폴트가 다른 프로세스의 페이지를 쫓아내 성능 간섭을 일으킬 수 있다.
대표 알고리즘 비교
| 알고리즘 | 교체 대상 | 장점 | 단점 |
|---|---|---|---|
| FIFO(First In First Out) | 가장 먼저 들어온 페이지 | 큐 하나로 구현이 단순하다 | 오래됐지만 자주 쓰는 페이지도 쫓아내며 벨라디의 모순이 발생한다 |
| OPT(Optimal) | 앞으로 가장 늦게 쓰일 페이지 | 페이지 폴트가 이론상 최소다 | 미래 참조를 알 수 없어 구현 불가, 비교 기준으로만 쓴다 |
| LRU(Least Recently Used) | 가장 오랫동안 안 쓰인 페이지 | 지역성 가정 아래 OPT에 근접한다 | 매 접근마다 순서 갱신이 필요해 하드웨어 지원 없이는 비싸다 |
| LFU(Least Frequently Used) | 참조 횟수가 가장 적은 페이지 | 꾸준히 쓰는 페이지를 보호한다 | 과거에만 많이 쓰인 페이지가 눌러앉고 카운터 관리 비용이 크다 |
| 클럭(Clock, Second Chance) | 참조 비트가 0인 첫 페이지 | 비트 하나로 LRU를 저렴하게 근사한다 | 정확한 LRU보다는 근사 품질이 낮다 |
벨라디의 모순
직관적으로는 프레임을 늘리면 페이지 폴트가 줄어야 하지만, FIFO에서는 프레임을 늘렸는데 폴트가 오히려 늘어나는 경우가 있다. 이를 벨라디의 모순(Belady's anomaly)이라고 한다. 참조열 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5를 FIFO로 처리하면 프레임 3개일 때 폴트 9회, 4개일 때 10회가 나온다. LRU처럼 프레임 n개일 때의 내용이 항상 n+1개일 때의 내용에 포함되는 스택 알고리즘(stack algorithm)에서는 이런 모순이 일어나지 않는다. 프레임 증설이 늘 해답은 아니며 알고리즘의 성질이 중요하다는 것을 보여 주는 사례다.
클럭 알고리즘의 동작
정확한 LRU는 매 메모리 접근마다 기록을 갱신해야 해서 부담이 크다. 클럭 알고리즘은 페이지마다 하드웨어가 자동으로 켜 주는 참조 비트(reference bit) 하나만 이용한다.
프레임들을 원형으로 배치하고 시곗바늘을 둔다
교체가 필요할 때:
바늘이 가리키는 페이지의 참조 비트를 본다
비트가 1이면: 0으로 지우고 바늘을 다음으로 옮긴다 (한 번 더 기회)
비트가 0이면: 이 페이지를 희생자로 선택한다
최근에 접근된 페이지는 비트가 1이므로 최소 한 바퀴는 살아남는다
수정 비트(dirty bit)까지 함께 보아, 참조도 안 되고 수정도 안 된 페이지를 최우선으로 내보내는 개선판도 있다. 실제 리눅스는 페이지를 활성(active)과 비활성(inactive) 리스트로 나눠 관리하는 LRU 근사 방식을 쓰며, 최근 커널은 세대 단위로 페이지 나이를 관리하는 다세대 LRU(Multi-Gen LRU)로 정확도와 비용의 균형을 더 끌어올렸다.
스래싱과 작업 집합
교체 알고리즘이 아무리 좋아도 프로세스가 실제로 필요로 하는 페이지 집합이 할당된 프레임보다 크면, 내보낸 페이지를 곧바로 다시 불러오는 일이 반복된다. 시스템이 실질적인 일보다 페이지 교체에 시간을 다 쓰는 이 상태가 스래싱(thrashing)이다. 스래싱이 시작되면 CPU 이용률이 급락하는데, 이를 보고 다중 프로그래밍 정도를 더 올리면 상황이 악화되는 악순환이 생긴다. 해법은 각 프로세스가 최근에 참조한 페이지 집합, 즉 작업 집합(working set)을 추정해 그만큼의 프레임을 보장하고, 보장할 수 없으면 일부 프로세스를 통째로 내리는 것이다. 페이지 폴트 빈도(PFF, Page Fault Frequency)를 상한과 하한 사이로 유지하도록 프레임을 조절하는 방식도 같은 목적의 실용적 기법이다.
면접에서 이렇게 물어본다
- 페이지 폴트가 발생했을 때 운영체제가 처리하는 과정을 순서대로 설명해 보라.
- LRU가 OPT의 근사가 되는 근거인 지역성 원리를 설명해 보라.
- 벨라디의 모순이 무엇이고 어떤 알고리즘에서 왜 발생하는가.
- 정확한 LRU 대신 클럭 알고리즘을 쓰는 이유와 그 동작 방식을 설명해 보라.
- 스래싱의 원인과 작업 집합 모델이 이를 어떻게 막는지 말해 보라.
운영체제에서 같이 읽기
- CPU 스케줄링 (CPU Scheduling)운영체제가 준비 상태의 여러 프로세스 중 다음에 CPU를 쓸 프로세스를 고르는 CPU 스케줄링을 다룬다. 선점과 비선점, FCFS부터 라운드 로빈과 MLFQ까지 알고리즘 비교, 리눅스 CFS와 EEVDF까지 정리한다.
- 교착 상태 (Deadlock)둘 이상의 프로세스가 서로가 점유한 자원을 기다리며 영원히 멈추는 교착 상태를 다룬다. 네 가지 필요조건, 예방과 회피와 탐지 회복 전략, 기아와 라이브락의 구분, 데이터베이스 데드락 실무 사례까지 정리한다.
- 파일 시스템 (File System)저장 장치 위에 파일과 디렉터리라는 추상화를 만드는 파일 시스템을 다룬다. 슈퍼블록과 아이노드 구조, 연속과 연결과 색인 할당 비교, 저널링과 쓰기 시 복사, VFS 계층까지 정리한다.
- 인터럽트 (Interrupt)CPU가 하던 일을 멈추고 긴급한 사건을 먼저 처리하게 하는 인터럽트를 다룬다. 폴링과의 비교, 하드웨어 인터럽트와 예외와 트랩의 구분, 처리 절차와 상반부 하반부, 타이머 인터럽트와 멀티태스킹의 관계를 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기