페이지 폴트: 메모리를 읽다 멈췄다는 것이 오류일까
페이지 폴트는 CPU의 메모리 접근을 현재 매핑과 권한만으로 정상 처리할 수 없어 운영체제의 처리가 필요한 예외다. 이름에 폴트가 들어가지만 반드시 프로그램 버그를 뜻하지 않는다. 필요한 페이지를 처음 준비하거나 복사 시 쓰기를 처리하는 정상적인 실행에서도 발생한다. 반대로 유효하지 않은 주소나 허용되지 않은 접근이라면 오류로 이어질 수 있다.
페이지 폴트는 정상적인 준비 작업일 수도 있고 잘못된 접근의 신호일 수도 있다.
먼저 접근이 합법적인지 확인한다
CPU는 문제가 된 주소와 접근 종류 등의 정보를 남기고 커널의 처리 경로로 들어간다. 운영체제는 그 주소가 프로세스에 허용된 영역인지, 읽기나 쓰기 조건을 만족할 수 있는지 확인한다. 합법적인 접근이면 페이지를 배정하거나 데이터를 준비하고 매핑을 갱신한다. 해결할 수 없다면 프로세스에 오류를 알리는 등의 조치를 취한다.
메모리를 크게 예약한 프로그램이 처음 각 페이지에 쓰는 상황을 생각해 보자. 운영체제는 예약 시점에 모든 RAM을 즉시 연결하지 않고, 실제 접근 시 새 페이지를 배정할 수 있다. 첫 쓰기가 처리된 후 같은 명령을 다시 실행하면 이번에는 매핑이 준비돼 진행된다. 첫 접근의 지연과 이후 접근의 지연이 다를 수 있는 이유다.
RAM에 없다는 경우도 여러 가지다
실행 파일이나 메모리 매핑 파일의 일부가 아직 준비되지 않았다면 파일 내용을 가져와야 할 수 있다. 익명 메모리가 스왑 공간에 나가 있었다면 그 내용을 다시 읽는다. 복사 시 쓰기에서는 공유하던 페이지를 복제하고 새 프레임에 연결한다. OSTEP의 물리 메모리 확장 장은 비상주 페이지를 처리하는 경로를 설명한다.
Linux 등에서는 저장 장치에서 실제 내용을 읽어야 하는 경우와 그렇지 않은 경우를 구분하는 통계를 제공한다. 다만 명칭과 구체적인 집계 조건은 운영체제의 정의를 따라야 한다. 페이지 폴트 수가 늘었다는 사실만으로 디스크가 느려졌다고 결론 내리면, 새 메모리의 첫 접근과 복사 비용을 잘못 해석할 수 있다.
아주 드문 사건도 평균을 바꾼다
설명용으로 평소 접근 시간이 100나노초이고 저장 장치 처리가 필요한 접근이 1밀리초라고 가정해 보자. 그런 사건이 만 번에 한 번만 있어도 평균에 약 100나노초가 추가된다. 실제 비용에는 대기와 스케줄링도 섞이지만, 매우 비싼 사건은 확률이 작아도 평균에 큰 영향을 준다는 계산은 유지된다. 그래서 지연의 분포도 함께 봐야 한다.
페이지 폴트를 줄이는 방법은 원인에 따라 달라진다. 작업이 활발히 사용하는 데이터가 RAM을 넘는다면 작업 집합을 줄이거나 접근 순서를 바꾸는 것이 도움이 된다. 초기 지연이 문제라면 준비 단계에서 필요한 영역을 미리 접근하는 방법을 검토할 수 있다. 그러나 미리 준비한 모든 페이지가 실제로 쓰이지 않으면 메모리와 입출력을 낭비한다.
TLB 미스와 페이지 폴트도 구분해야 한다. 변환 캐시에 항목이 없어도 페이지 테이블에 정상적인 매핑이 있으면 운영체제의 폴트 처리가 필요하지 않을 수 있다. 문제를 진단할 때는 주소 변환, 매핑·권한 처리, 데이터의 저장 위치를 따로 확인해야 한다. 페이지 폴트는 이 세 요소가 만나는 사건이며, 정상적인 메모리 관리와 실제 오류를 구분하는 중요한 관찰 지점이다.