페이지 폴트
프로세스가 접근하려는 페이지가 물리 메모리에 없을 때 발생하는 인터럽트
동작 과정
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 GC | Full GC 시 대량 폴트 가능 |
| 컨테이너 메모리 제한 | OOMKiller 발동 |
Q.페이지 폴트란 무엇이고 어떻게 처리되나요?
접근한 주소의 매핑이 페이지 테이블에 없어 예외가 발생한 상황입니다.
| 순서 | 하는 일 |
|---|
| 1 | MMU 가 변환에 실패해 예외를 올린다. 명령어는 완료되지 않았다 |
| 2 | 커널이 정당한 접근인지 판단한다. 아니면 종료시킨다 |
| 3 | 빈 프레임을 확보한다. 없으면 교체 정책으로 하나를 내보낸다 |
| 4 | 필요하면 디스크에서 읽어온다 |
| 5 | 페이지 테이블을 갱신한다 |
| 6 | 실패한 명령어를 다시 실행한다 |
6번이 성립하려면 그 명령어가 아무 흔적도 남기지 않았어야 합니다. 그래서 CPU 는 폴트가 날 수 있는 명령어를 중간 상태 없이 처리하도록 설계됩니다.
폴트가 모두 비싼 것은 아닙니다. 내용이 이미 메모리에 있고 매핑만 없는 경우가 흔하고, 그때는 4번이 없어 마이크로초 단위로 끝납니다.
흔한 실수: 폴트를 오류로 이해하는 것. 정상 동작의 일부이고, 지연 할당과 쓰기 시 복사가 이 구조 위에서 동작합니다.
Q.페이지 폴트의 비용이 큰 이유는?
디스크를 읽어야 하는 폴트가 메모리 접근보다 수천 배 느리기 때문입니다.
| 접근 | 시간 |
|---|
| 메모리 | 100ns 안팎 |
| SSD | 100마이크로초 안팎. 약 1,000배 |
| HDD | 10ms 안팎. 약 10만 배 |
여기에 부수 비용이 붙습니다.
| 비용 | 내용 |
|---|
| 모드 전환 | 사용자 모드에서 커널로, 다시 돌아온다 |
| 문맥 교환 | 대기하는 동안 다른 프로세스가 실행된다 |
| 캐시 오염 | 그 사이 다른 프로세스가 캐시를 덮어쓴다 |
| 교체 비용 | 내보낼 페이지가 수정됐으면 먼저 디스크에 쓴다 |
그래서 폴트율이 조금만 올라도 평균 접근 시간이 크게 나빠집니다.
흔한 실수: 모든 폴트를 비싸다고 보는 것. 매핑만 연결하면 되는 폴트는 디스크를 건드리지 않아 훨씬 쌉니다. 지표를 볼 때 둘을 나눠야 합니다.
Q.빈 프레임이 없을 때 어떻게 처리하나요?
교체 정책으로 하나를 골라 내보냅니다.
| 순서 | 하는 일 |
|---|
| 1 | 교체 정책으로 희생자를 고른다 |
| 2 | 그 페이지가 수정됐으면 디스크에 먼저 쓴다 |
| 3 | 페이지 테이블에서 매핑을 지운다. TLB 항목도 무효화한다 |
| 4 | 그 프레임에 필요한 페이지를 올린다 |
2번이 있어서 수정된 페이지를 내보내는 것이 두 배 비쌉니다. 그래서 교체 정책은 수정 여부를 함께 보고, 수정되지 않은 페이지를 우선 고릅니다.
미리 확보해 두는 방식도 씁니다. 빈 프레임이 일정 수 아래로 떨어지면 백그라운드에서 미리 내보내, 폴트가 났을 때 기다리지 않게 합니다.
흔한 실수: 교체를 항상 디스크 쓰기로 설명하는 것. 읽기 전용 페이지(코드, 파일 캐시)는 원본이 디스크에 있으므로 그냥 버리면 됩니다.
Q.페이지 폴트율이 성능에 미치는 영향을 계산해보세요.
평균 접근 시간으로 계산하면 영향이 드러납니다.
평균 접근 시간 = (1 - 폴트율) x 메모리 접근 + 폴트율 x 폴트 처리 시간
메모리 100ns, 폴트 처리 100마이크로초(100,000ns) 라고 하면
| 폴트율 | 평균 접근 시간 | 배수 |
|---|
| 0 | 100ns | 1배 |
| 0.001 (0.1%) | 약 200ns | 2배 |
| 0.01 (1%) | 약 1,100ns | 11배 |
| 0.1 (10%) | 약 10,100ns | 101배 |
폴트가 1,000번에 한 번만 나도 평균이 두 배가 됩니다. 폴트 처리가 메모리보다 1,000배 비싸기 때문입니다.
그래서 폴트율 목표는 아주 낮게 잡습니다. 성능을 10% 이내로 유지하려면 0.0001 수준이어야 합니다.
흔한 실수: 폴트율 1%를 낮다고 보는 것. 비율만 보면 작아 보이지만 비용 배수를 곱하면 성능이 10분의 1로 떨어집니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
운영체제 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.