개념
페이지 폴트는 운영체제가 가상 메모리(virtual memory)를 사용하는 시스템에서 발생하는 이벤트이다.
'프로세스가 접근하려는 메모리 페이지가 현재 물리 메모리에 없는 경우'에 발생한다.
페이지 폴트가 언제 어떻게 발생하기 이전에 '가상 메모리'가 무엇인지 짧게 알아보자.
가상 메모리란 메모리 관리 기법중 하나로, 실제 물리적 메모리(RAM)의 크기에 관계없이 프로그램이 사용할 수 있는 메모리 공간을 확장하는 기술이다. 쉽게 말하면 RAM이 8GB라도 GTA(40GB이상?)을 돌릴 수 있는 이유가 가상 메모리 기술 덕분이다.
(RAM의 용량이 부족하기 때문에 프로그램 전체를 RAM에 다 올리지 않는다.)

운영체제는 물리 메모리에 적재되어 있는 메모리를 세그먼트라는 단위로 관리하고 가상 메모리에 있는 메모리는 페이지 단위로 관리한다.
이 때 페이지의 최소 단위는 보통 4KB이고 직접 설정하지 않는 이상 세그먼트의 단위도 4KB이다.
이렇게 가상 메모리 주소는 MMU를 통해 물리주소로 변환되어 CPU가 데이터를 쓰거나 읽을 수 있는 것이다.
문제는 운영체제는 모든 프로세를 로드하지 않기 때문에 페이지가 물리 메모리에 부재할 수 있는데 이것을
'페이지 폴트(page fault)'라고 한다.
페이지 폴트가 발생하면 해당 페이지를 가상 메모리에서 찾아야하는데 이 때 운영체제가 페이지 폴트를 해결하는 과정을
'요구 페이징(Demand Paging)'이라고 한다.
요구페이징은 프로그램 실행 시 필요한 데이터만 RAM에 로드하는 기술이다.
요구 페이징의 과정은 다음과 같다.
1. CPU가 물리 메모리에서 필요한 데이터를 찾는다.
2. 데이터가 없으면 운영체제에 인터럽트를 발생시켜 페이지 폴트가 발생했음을 알린다.
3. 운영 체제는 페이지 테이블을 확인하여 해당 데이터가 보조기억 장치에 있는지 확인한다.
4. 데이터가 보조기억 장치에 있으면 해당 데이터를 RAM으로 로드한다.
5. 필요에 따라 RAM에서 사용하지 않는 데이터를 보조기억 장치로 옮기는 스와핑이 발생할 수 있다.
6. 데이터 로드가 완료되면 CPU는 중단되었던 작업을 다시 시작한다.
물리 메모리에 사용할 수 있는 공간을 찾는 과정에서 (비어있는 프레임을 찾는과정에서) 성능을 조금더 향상 시키기 위하여 여러 페이지 교체 알고리즘들이 사용되는데 대표적인 3가지는 다음과 같다.
1. FIFO : 가장 먼저 물리 메모리에 적재된 페이지를 선택하는 방식
2. LRU : 가장 오랫동안 사용되지 않았던 page를 선택하는 방식
3. LRU Approximation : LRU와 같지만, 페이지에 Second-Chance를 준다.
페이지 폴트 종류

- 유효 페이지 폴트 (Minor Page Fault) : 페이지가 메모리에 있지만 다른 위치에 있는 경우
- 무효 페이지 폴트 (Major Page Fault) : 페이지가 아예 메모리에 없어 디스크에서 불러와야 하는 경우
- 잘못된 페이지 폴트 (Invalid Page Fault) : 프로세스가 접근해서는 안 되는 잘못된 주소게 접근하는 경우 -> 예외 발생
3번째 잘못된 페이지 폴트가 좀 중요한데 프로그래밍을 하다가 'segmentation fault' 라는 문구를 본적 있을 것이다.
가상 메모리 페이징에 대한 여러 자료를 찾다보니까 이해가 되었는데 물리 메모리를 세그먼트 단위로 관리하는데
이때 유효하지 않은 세그먼트에 접근하려니까 segmentation fault문구가 예외로 발생하는 것이다.
정리
페이지 폴트는 어떤 주소의 데이터를 읽거나 쓰려고 할 때, 해당 주소가 현재 물리 메모리에 없는 경우에 발생한다.
이때 운영체제는 디스크(보조 기억장치)에 있는 해당 페이지를 물리 메모리로 로딩한다.
이 과정에서 잠깐 해당 프로세스는 중단 되고, 페이지를 로드한 뒤 다시 실행을 재개한다.
페이지 폴트는 정상적인 가상 메모리 동작의 일부로, 너무 자주 발생하면 성능저하가 발생한다.
이를 줄이기 위해 페이지 교체 알고리즘(LRU, FIFO등)이 사용된다.
참고자료
'CS' 카테고리의 다른 글
스레드란? (1) | 2024.09.18 |
---|---|
Stack Frame과 함수 호출 규약(__stdcall) (1) | 2024.04.28 |
[CS] 가상 메모리와 페이징 (0) | 2023.08.15 |
[CS] 스와핑(Swapping) (0) | 2023.08.09 |
[CS] 논리주소와 물리주소 (0) | 2023.08.07 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!