운영체제
요구 페이징과 교체 정책
필요할 때 페이지를 준비하는 페이지 폴트 처리 메커니즘과, 메모리가 가득 찼을 때 어떤 페이지를 내보낼지 고르는 교체 정책을 나누어 이해합니다.
이럴 때 필요해요
메모리 사용량이 물리 RAM 한계에 가까워졌을 때 왜 갑자기 디스크 I/O가 폭증하며 서버 응답 시간이 급격히 느려지는지 파악하기 위해 필요합니다.
어떻게 동작하나요?
프로그램을 실행할 때 당장 쓰지도 않을 수백 메가바이트의 코드와 데이터를 처음부터 물리 RAM에 전부 올려두면 시작도 느리고 메모리도 낭비됩니다. 그래서 운영체제는 실제로 CPU가 특정 가상 주소에 접근하는 순간에야 필요한 페이지를 준비하는 요구 페이징(Demand Paging)을 사용합니다. 접근한 가상 페이지가 아직 물리 프레임에 연결되어 있지 않으면 하드웨어가 페이지 폴트(Page Fault)를 발생시켜 커널을 호출하고, 커널은 정당한 접근이면 프레임을 연결해 준 뒤 명령어를 이어서 실행하고 잘못된 주소면 프로세스 오류로 처리합니다.
여기서 중요한 점은 페이지 폴트가 곧바로 느린 디스크 읽기를 뜻하지는 않는다는 것입니다. 새로 할당받은 힙·스택 페이지에 0으로 채워진 빈 RAM 프레임을 바로 연결해 주거나 이미 메모리에 있는 공유 페이지를 매핑해 주는 것은 디스크를 거치지 않는 가벼운 마이너 폴트(Minor Fault)입니다. 반대로 물리 RAM이 부족해 디스크(스왑이나 파일)에서 페이지를 읽어 와야 하는 메이저 폴트가 계속 반복되면, CPU가 실제 계산보다 페이지 교체 I/O만 기다리느라 시스템이 사실상 멈추는 스래싱(Thrashing) 현상이 벌어집니다.
물리 메모리가 가득 찼을 때 어떤 페이지를 내보낼지 결정하는 것이 페이지 교체 정책입니다. 가장 먼저 들어온 페이지를 빼는 FIFO는 구현이 단순하지만 자주 쓰이는 페이지를 내보낼 수 있고, 가장 오랫동안 안 쓰인 페이지를 빼는 LRU는 효율적이지만 매 접근마다 정확한 순서를 기록하는 비용이 큽니다. 그래서 실제 운영체제 커널은 페이지의 참조 비트(Reference Bit)를 시계바늘처럼 돌며 확인하는 Clock 같은 LRU 근사 알고리즘과 수정 여부(Dirty Bit)를 함께 조합해 사용합니다.
코드 예제
동작을 설명하는 읽기 전용 예제입니다.
프레임 2개, 참조열 A B A C
A → [A]
B → [A B]
A → [A B] (A 최근 사용)
C → LRU에서는 B를 내보내 [A C]프레임이 2개인 환경에서 A → B → A → C 순서로 참조할 때 LRU가 어떻게 동작하는지 보여 주는 예시입니다. 두 번째 A 참조로 인해 A가 가장 최근에 쓰인 페이지가 되므로, C가 들어올 때는 더 오래전에 참조된 B를 내보냅니다.
자주 헷갈리는 포인트
- 페이지 폴트(Page Fault)라는 이름 때문에 언제나 프로그램의 잘못된 메모리 접근 버그이거나 무조건 디스크 I/O가 일어난다고 오해하면 안 됩니다.
- 교과서에 나오는 순수 LRU 연결 리스트를 실제 운영체제 커널이 매 메모리 명령어마다 그대로 실행한다고 단정하면 안 됩니다.
내 말로 설명해 보기
프레임 2개에서 A B A C를 참조할 때 LRU는 왜 A가 아니라 B를 내보내나요? 그리고 페이지 폴트가 발생하면 항상 디스크 읽기가 일어날까요?
생각할 단서 C가 들어오기 직전 시점에 A와 B 중 어느 페이지가 더 최근에 다시 참조되었는지 확인해 보세요.
예시 답변 확인
설명에 들어갈 핵심
- A B A 순서에서 세 번째 참조로 인해 A가 B보다 더 최근에 사용된 상태가 됩니다
- LRU는 가장 오랫동안 참조되지 않은 B를 교체 대상으로 내보냅니다
- 페이지 폴트는 빈 프레임 즉시 할당이나 복사 지연(CoW)에서도 발생하므로 항상 디스크 I/O를 뜻하지는 않습니다
예시 답변
A B A까지 실행된 시점에는 A가 방금 다시 참조되어 가장 최근에 쓰인 페이지가 되므로, 새 페이지 C를 넣을 때 LRU는 더 오래전에 쓰인 B를 내보냅니다. 또한 페이지 폴트는 아직 매핑만 안 된 새 메모리 할당이나 복사 지연(Copy-on-Write) 처리에서도 발생하므로 언제나 디스크 읽기를 동반하는 것은 아닙니다.
문장을 그대로 외우기보다 예제의 값과 실행 흐름을 떠올리며 설명해 보세요.
함께 읽으면 좋은 개념
관련 면접 질문 2개
페이지 교체 알고리즘인 FIFO, LRU, Clock은 각각 어떤 기준으로 교체 대상을 고르나요?
물리 프레임이 부족할 때 FIFO는 가장 먼저 들어온 페이지를, LRU는 가장 오랫동안 참조되지 않은 페이지를 우선 교체합니다. 정확한 LRU는 매 메모리 접근마다 순서를 갱신하는 비용이 크기 때문에, 실제 운영체제는 참조 비트(Reference Bit)를 순환하며 확인하는 Clock 알고리즘 등으로 LRU를 근사해 구현합니다. 미래에 가장 늦게 쓰일 페이지를 빼는 최적(Optimal) 교체는 실시간 구현이 불가능한 비교 기준이며, 실제 커널은 수정된 페이지(Dirty Page)의 디스크 기록 비용과 워크로드도 함께 고려합니다.
꼬리질문과 참고자료 →요구 페이징(Demand Paging)과 페이지 폴트(Page Fault)는 어떤 순서로 동작하나요?
요구 페이징은 프로그램의 모든 페이지를 미리 적재하지 않고 실제로 접근할 때 준비하는 정책입니다. CPU가 접근한 가상 주소에 유효한 매핑이 없으면 페이지 폴트가 발생하고, 운영체제는 접근 권한과 매핑을 확인해 새 프레임 할당, 디스크 적재, 또는 복사 지연(Copy-on-Write) 처리를 수행한 뒤 명령어를 재개합니다. 만약 허용되지 않은 잘못된 주소 접근이라면 프로세스 오류로 처리하며, 모든 페이지 폴트가 항상 디스크 I/O를 수반하는 것은 아닙니다.
꼬리질문과 참고자료 →