운영체제 따라잡기

페이징

meellon 2026. 6. 30. 05:00

학습 목표

논리 주소페이지 번호 + 오프셋으로 나누고 페이지 테이블로 물리 주소를 구하는 과정을 설명할 수 있다.

페이지 테이블 엔트리(PTE) 의 valid·frame·protection 비트 역할을 설명할 수 있다.

TLB가 주소 변환 비용을 줄이는 원리와 TLB miss 시 동작을 설명할 수 있다.

다단계 페이징이 큰 주소 공간에서 테이블 크기 문제를 완화하는 이유를 설명할 수 있다.

문제 상황

  • 프로세스마다 페이지 테이블이 수 MB인데, 매 메모리 접근마다 테이블을 읽으면 너무 느리다
    • TLB·캐시 계층 필요
  • 64비트 주소 공간에 단일 수준 페이지 테이블을 두면 엔트리 수가 천문학적
    • 다단계·역페이징 등 구조적 완화
  • segfault / SIGSEGVvalid=0 페이지 접근, 보호 위반
    • PTE 비트와 직결
  • perf에서 dTLB load misses 가 높다
    • TLB 미스·페이지 walk 비용

앞 편에서 페이징 개요를 봤다. 이번엔 MMU가 실제로 어떻게 변환하는지 — 테이블·TLB·다단계다.

1. 논리 주소 분해와 페이지 테이블

페이지 크기가 4KB(2¹²)이면 하위 12비트는 페이지 내부 오프셋, 상위 비트는 페이지 번호다.

단계 동작
1 CPU가 논리 주소 생성
2 MMU가 페이지 번호페이지 테이블 인덱싱
3 PTE에서 프레임 번호 읽기 (valid 확인)
4 물리 주소 = (프레임 번호 × 페이지 크기) + 오프셋

PTE에 자주 들어가는 필드:

필드 역할
valid 페이지가 메모리에 있고 매핑 유효한지
frame # 물리 프레임 번호
protection 읽기/쓰기/실행 허용 (R/W/X)
dirty 페이지가 수정됐는지 (스왑·백업 시)
referenced 최근 접근 여부 (교체 알고리즘 힌트)
  • OS는 프로세스마다 페이지 테이블 베이스 레지스터(PTBR) 를 갖고, 컨텍스트 스위치 시 갱신
  • 페이지 테이블 자체도 물리 메모리에 저장 — 접근마다 추가 메모리 읽기 발생

2. TLB (Translation Lookaside Buffer)

페이지 테이블 walk는 매번 메모리 접근이 추가된다. CPU 옆 TLB는 최근 (페이지#, 프레임#) 쌍을 캐시한다.

경우 동작 비용
TLB hit PTE 없이 TLB에서 프레임 번호 획득 낮음
TLB miss 메모리에서 페이지 테이블 walk → TLB에 적재 높음
  • TLB는 완전 연관(fully associative) 또는 세트 연관 — 하드웨어·아키텍처마다 다름
  • 컨텍스트 스위치 시 TLB flush — 다른 프로세스 PTE와 섞이면 안 됨
  • ASID(Address Space ID)로 프로세스별 TLB 엔트리 구분 → flush 완화 (일부 CPU)
  • 큰 배열 순회·포인터 체이스는 TLB 미스가 쌓여 느려질 수 있음 — perf stat -e dTLB-load-misses

3. 페이지 테이블의 크기 문제

32비트·4KB 페이지·4B PTE라면 엔트리 약 2²⁰개 → 테이블만 4MB. 64비트에 단일 수준을 그대로 쓰면 비현실적.

완화 전략:

방식 아이디어
다단계 페이징 상위 인덱스로 하위 테이블만 필요할 때 할당
역페이징 물리 프레임마다 엔트리 (프레임 수가 적을 때)
해시 페이지 테이블 해시로 PTE 탐색 (64비트 등)

Linux x86-64는 4단계 페이지 테이블(PGD → PUD → PMD → PTE)을 쓴다. 개념은 2단계로 이해하면 충분하다.

4. 다단계 페이징

논리 주소를 외부 인덱스 | 내부 인덱스 | 오프셋 으로 나눈다. 외부 페이지 테이블 엔트리가 내부 페이지 테이블 주소를 가리킨다.

장점 설명
희소 할당 쓰지 않는 상위 영역의 내부 테이블을 만들지 않음
크기 절감 전체 주소 공간을 한 테이블로 덮지 않음
단점 변환 시 메모리 접근 2~4회 — TLB·캐시가 더 중요
  • 내부 테이블도 페이지 단위로 물리 메모리에 올라감
  • 페이지 폴트로 테이블 페이지 자체를 디스크에서 올리는 경우도 있음 (가상 메모리 편)

5. 하드웨어와 OS 역할

주체 역할
MMU 페이지 번호 추출, 테이블 walk, TLB, 보호 검사
OS 페이지 테이블·프레임 할당, PTE 갱신, page fault 처리
컴파일러/런타임 논리 주소 생성 — 프로세스는 물리 주소를 모름
  • mmap, mprotect는 결국 PTE 비트·매핑 변경
  • 컨테이너·VM은 별도 페이지 테이블(또는 중첩)로 격리

6. 정리

  • 논리 주소 = 페이지 번호 + 오프셋, PTE가 프레임 번호·보호 제공
  • TLB는 변환 캐시 — hit는 빠르고, miss는 테이블 walk
  • 다단계 페이징은 큰 주소 공간에서 테이블을 희소하게 유지
  • 다음: 가상 메모리, 요구 페이징, 페이지 폴트, 교체 알고리즘

다음에 다룰 것

  • 가상 메모리
  • 요구 페이징, 페이지 폴트, 교체 알고리즘

해당 내용은 Operating System Concepts, 10/E (Avraham Silberschatz, Peter Baer Galvin, Greg Gagne) 의 내용을 기반으로 합니다.

'운영체제 따라잡기' 카테고리의 다른 글

세그멘테이션과 군집화  (0) 2026.07.02
가상 메모리  (0) 2026.07.01
메모리 관리 기초  (0) 2026.06.29
동시성 문제 사례  (0) 2026.06.28
데드락 해결  (0) 2026.06.27