Foundry
운영체제
중급
핵심

페이지 폴트

페이지가 메모리에 없을 때 발생하는 인터럽트

페이지 폴트

프로세스가 접근하려는 페이지가 물리 메모리에 없을 때 발생하는 인터럽트

동작 과정

1. CPU: 가상 주소 접근
2. 페이지 테이블 확인
   → Valid bit = 0 (메모리에 없음!)
3. 페이지 폴트 발생 (트랩)
4. OS: 디스크에서 해당 페이지 로드
5. 빈 프레임에 적재
6. 페이지 테이블 업데이트
7. 중단된 명령 재실행
[페이지 테이블]
Page 0 → Frame 2 (V=1)
Page 1 → Frame 5 (V=1)
Page 2 → Disk    (V=0) ← 폴트!
Page 3 → Frame 1 (V=1)

페이지 폴트의 비용

메모리 접근: ~100ns
디스크 접근: ~10ms

디스크는 메모리보다 약 100,000배 느림!
→ 페이지 폴트 = 큰 성능 저하
항목시간
TLB 히트~1ns
메모리 접근~100ns
페이지 폴트~10ms
비율100,000배

페이지 폴트율과 성능

페이지 폴트율 p = 0.001 (1000번에 1번)

유효 접근 시간 =
  (1-p) × 메모리 접근 + p × 폴트 처리
= 0.999 × 100ns + 0.001 × 10ms
= 99.9ns + 10,000ns
= 10,099ns (100배 느려짐!)

→ 폴트율 0.1%만 되어도 큰 영향

빈 프레임이 없으면?

모든 프레임이 사용 중
→ 하나를 골라 쫓아냄 (Victim)
→ 페이지 교체 알고리즘 필요
  (LRU, FIFO, Clock 등)

Dirty page라면:
→ 디스크에 먼저 기록 후 교체
→ 추가 I/O 발생

실무 연결

상황영향
메모리 부족폴트 빈발 → Thrashing
대용량 데이터 처리순차 접근 패턴 활용
JVM GCFull GC 시 대량 폴트 가능
컨테이너 메모리 제한OOMKiller 발동
면접에서 이렇게 나옵니다

Q.페이지 폴트란 무엇이고 어떻게 처리되나요?

접근한 주소의 매핑이 페이지 테이블에 없어 예외가 발생한 상황입니다.

순서하는 일
1MMU 가 변환에 실패해 예외를 올린다. 명령어는 완료되지 않았다
2커널이 정당한 접근인지 판단한다. 아니면 종료시킨다
3빈 프레임을 확보한다. 없으면 교체 정책으로 하나를 내보낸다
4필요하면 디스크에서 읽어온다
5페이지 테이블을 갱신한다
6실패한 명령어를 다시 실행한다

6번이 성립하려면 그 명령어가 아무 흔적도 남기지 않았어야 합니다. 그래서 CPU 는 폴트가 날 수 있는 명령어를 중간 상태 없이 처리하도록 설계됩니다.

폴트가 모두 비싼 것은 아닙니다. 내용이 이미 메모리에 있고 매핑만 없는 경우가 흔하고, 그때는 4번이 없어 마이크로초 단위로 끝납니다.

흔한 실수: 폴트를 오류로 이해하는 것. 정상 동작의 일부이고, 지연 할당과 쓰기 시 복사가 이 구조 위에서 동작합니다.

Q.페이지 폴트의 비용이 큰 이유는?

디스크를 읽어야 하는 폴트가 메모리 접근보다 수천 배 느리기 때문입니다.

접근시간
메모리100ns 안팎
SSD100마이크로초 안팎. 약 1,000배
HDD10ms 안팎. 약 10만 배

여기에 부수 비용이 붙습니다.

비용내용
모드 전환사용자 모드에서 커널로, 다시 돌아온다
문맥 교환대기하는 동안 다른 프로세스가 실행된다
캐시 오염그 사이 다른 프로세스가 캐시를 덮어쓴다
교체 비용내보낼 페이지가 수정됐으면 먼저 디스크에 쓴다

그래서 폴트율이 조금만 올라도 평균 접근 시간이 크게 나빠집니다.

흔한 실수: 모든 폴트를 비싸다고 보는 것. 매핑만 연결하면 되는 폴트는 디스크를 건드리지 않아 훨씬 쌉니다. 지표를 볼 때 둘을 나눠야 합니다.

Q.빈 프레임이 없을 때 어떻게 처리하나요?

교체 정책으로 하나를 골라 내보냅니다.

순서하는 일
1교체 정책으로 희생자를 고른다
2그 페이지가 수정됐으면 디스크에 먼저 쓴다
3페이지 테이블에서 매핑을 지운다. TLB 항목도 무효화한다
4그 프레임에 필요한 페이지를 올린다

2번이 있어서 수정된 페이지를 내보내는 것이 두 배 비쌉니다. 그래서 교체 정책은 수정 여부를 함께 보고, 수정되지 않은 페이지를 우선 고릅니다.

미리 확보해 두는 방식도 씁니다. 빈 프레임이 일정 수 아래로 떨어지면 백그라운드에서 미리 내보내, 폴트가 났을 때 기다리지 않게 합니다.

흔한 실수: 교체를 항상 디스크 쓰기로 설명하는 것. 읽기 전용 페이지(코드, 파일 캐시)는 원본이 디스크에 있으므로 그냥 버리면 됩니다.

Q.페이지 폴트율이 성능에 미치는 영향을 계산해보세요.

평균 접근 시간으로 계산하면 영향이 드러납니다.

평균 접근 시간 = (1 - 폴트율) x 메모리 접근 + 폴트율 x 폴트 처리 시간

메모리 100ns, 폴트 처리 100마이크로초(100,000ns) 라고 하면
폴트율평균 접근 시간배수
0100ns1배
0.001 (0.1%)약 200ns2배
0.01 (1%)약 1,100ns11배
0.1 (10%)약 10,100ns101배

폴트가 1,000번에 한 번만 나도 평균이 두 배가 됩니다. 폴트 처리가 메모리보다 1,000배 비싸기 때문입니다.

그래서 폴트율 목표는 아주 낮게 잡습니다. 성능을 10% 이내로 유지하려면 0.0001 수준이어야 합니다.

흔한 실수: 폴트율 1%를 낮다고 보는 것. 비율만 보면 작아 보이지만 비용 배수를 곱하면 성능이 10분의 1로 떨어집니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

더 깊이 공부하기

읽었으면 문제로 확인해보세요

운영체제 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.