운영체제가 가상 메모리(Virtual Memory) 를 사용하는 환경에서, 필요한 페이지가 물리 메모리에 존재하지 않을 때 발생하는 예외 상황이다.
프로세스가 어떤 주소에 접근했을 때, 해당 주소가 현재 메모리에 없는 경우 운영체제는 Page Fault 를 발생시키고, 필요한 페이지를 디스크에서 메모리로 가져온다.
페이지 폴트는 다음과 같은 경우 발생한다:
페이지 폴트가 발생하면 운영체제는 다음 절차로 처리한다:
CPU가 Trap(예외) 을 발생시켜 커널 모드로 전환
Page Fault 핸들러 실행
해당 주소가 유효한지 확인
디스크(보조기억장치) 에서 해당 페이지를 읽어옴
프레임 할당
페이지 테이블 및 TLB 업데이트
프로세스를 다시 실행 (중단 지점부터 재시작)
아니다.
Page Fault는 흔히 발생하는 정상적인 동작 흐름의 일부다.
운영체제는 메모리를 효율적으로 사용하기 위해 "필요할 때만" 페이지를 로딩하는 지연 로딩(lazy loading) 기법을 사용한다. 이로 인해 페이지 폴트는 성능을 최적화하기 위한 자연스러운 현상이다.
| 종류 | 설명 |
|---|---|
| Minor Page Fault | 페이지가 메모리에는 없지만, 디스크가 아닌 페이지 캐시 등에서 가져올 수 있는 경우 |
| Major Page Fault | 해당 페이지가 메모리에 전혀 없고, 디스크에서 읽어와야 하는 경우 |
| Invalid Page Fault | 접근 자체가 불법적인 주소 공간일 경우 (→ Segmentation Fault 발생) |
Major Page Fault는 디스크 I/O가 발생하므로 매우 느리다.
즉, 페이지 폴트가 자주 발생하면 프로그램 성능이 급격히 저하된다.
이를 방지하기 위해 다음과 같은 기법이 사용된다:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = malloc(sizeof(int) * 100000000); // 매우 큰 배열 할당
arr[99999999] = 1; // 실제 접근할 때 페이지 폴트 발생 가능
printf("%d\n", arr[99999999]);
free(arr);
return 0;
}
malloc호출만으로는 물리 메모리가 할당되지 않고,arr[99999999]접근 시 페이지 폴트가 발생하여 실제 메모리 할당이 이뤄진다.