개념
페이지 폴트는 페이징 방식을 사용한 가상 메모리 기법에서 CPU가 프로그램을 실행하면서 필요한 페이지가 물리 메모리에 없는 경우를 의미.

위 사진에서 PTE의 Present bit가 0일 경우, 해당 가상 페이지가 현재 물리 메모리에 매핑되어 있지 않다라는 뜻.
이 경우 보통은 OS가 스왑 영역에서 페이지를 찾아서 물리 메모리에 로드함.
페이지 폴트의 과정

페이지 폴트는 다음과 같은 순서로 진행.
1. CPU가 가상주소(VA)로 메모리 접근(load/store/명령 fetch)
2. MMU가 주소 변환 시도
- 먼저 TLB 조회
- (TLB miss면) 페이지 테이블에서 PTE를 읽음
3. PTE 확인 결과, Present bit = 0
- 현재 RAM에 매핑이 없다로 판단
- MMU는 정상 변환을 못 하므로 페이지 폴트 예외를 발생시킴
4. CPU가 예외 처리로 진입
- 현재 실행 Context를 저장
- 커널 모드로 전환
- 페이지 폴트 핸들러 주소로 이동
5. OS 페이지 폴트 핸들러가 원인 판별
- 접근한 VA, 접근 종류(읽기/쓰기/실행), 권한 위반 여부 확인
- 해당 VA가 프로세스 주소공간에 유효한 매핑인지 확인
- 유효하지 않으면 보통 프로세스 종료(SEGFAULT 등)
6. 유효한 페이지인데 RAM에 없었다면, 물리 페이지 확보
- 빈 프레임이 있으면 사용
- 없으면 페이지 교체 알고리즘(LRU 근사 등)으로 공간 확보
7. 필요한 페이지를 디스크에서 RAM으로 읽어옴
- 스왑 영역/파일(페이지파일) 또는 실행 파일/메모리맵 파일에서 I/O 요청
- 프로세스는 보통 Block 상태로 잠들고, 다른 프로세스가 실행됨 (Context Switching)
8. I/O 완료 인터럽트 발생
- 디스크 -> 메모리 로드 완료
- OS가 대기 중이던 폴트 처리 재개
9. 페이지 테이블(PTE) 갱신
- 새 물리 프레임 번호 기록
- Present bit = 1로 세팅
10. 예외에서 복귀
- CPU가 사용자 모드로 돌아감
- Page Fault를 발생시킨 명령을 재실행
한 줄 요약
접근 → (TLB/페이지테이블 확인) Present=0 → 트랩 → 커널이 유효성 검사 → 프레임 확보/교체 → 디스크에서 로드 → PTE/TLB 갱신 → 원래 명령 재실행
페이지 교체 알고리즘
페이지 교체 알고리즘은 프레임이 꽉 찼을 때, 어떤 페이지를 내보낼지 고르는 규칙.
대표 종류와 핵심 아이디어는 다음과 같음.
1. OPT(Optimal)
- 앞으로 가장 늦게 다시 사용될 페이지를 교체
- 이론적으로 최적이지만 미래를 알아야 해서 실제 구현은 불가 (비교 기준)
2. FIFO (First In First Out)
- 가장 먼저 들어온 페이지부터 교체
- 구현은 쉽지만, '오래 있었다'가 '안 쓴다'는 뜻이 아니라서 성능이 흔들릴 수 있음
3. LRU (Least Recently Used)
- 가장 오래 전에 사용된 페이지를 교체
- 성능은 좋지만 정확한 LRU는 관리 비용이 커서 OS는 보통 그대로 구현하지 않음
4. Clock (Second-Chance)
- LRU의 대표적인 근사 알고리즘
- CPU를 점유 중인 프로세스로부터 참조되면 R(Referenced) 비트가 1로 올라감
- 페이지 교체 시 원형으로 돌면서 R 비트가 1이면 한 번 봐주고 0으로 내린 뒤 넘김, R=0이면 교체
- 실무/OS에서 가장 흔한 축 중 하나
5. Enhanced Clock
- Clock에 Dirty(M) 비트까지 고려한 알고리즘
- 가능하면 (R=0, M=0) 같은 '안 쓰고, 수정도 안 된' 페이지를 우선 교체
- 디스크 write-back 비용을 줄여서 현실적으로 유리