1. 페이지(Page)와 프레임(Frame)의 차이
페이지(Page)와 프레임(Frame)은 가상 메모리(Virtual Memory) 시스템에서 메모리를 관리하기 위한 핵심적인 개념입니다.
- 페이지(Page): 논리적 주소 공간(Logical Address Space)을 나누는 고정 크기의 블록입니다. 각 프로세스는 자신만의 독립적인 논리적 주소 공간을 가지며, 이 공간이 페이지들로 분할됩니다.
- 프레임(Frame): 물리적 주소 공간(Physical Address Space, RAM)을 나누는 고정 크기의 블록입니다. 실제 하드웨어 메모리인 RAM이 프레임들로 분할됩니다.
핵심은 페이지는 가상적인 단위이고, 프레임은 실체적인 단위라는 점입니다. 운영체제는 프로세스의 페이지들을 물리 메모리의 비어있는 프레임에 불연속적으로(non-contiguous) 할당하고, 이 매핑 정보를 페이지 테이블(Page Table)에 기록하여 관리합니다. 페이지와 프레임의 크기는 항상 동일합니다.
2. 이론
2.1. 페이징(Paging)과 주소 변환
페이징은 프로세스의 논리적 주소 공간을 물리적 주소 공간과 분리하여, 메모리를 보다 효율적으로 사용하고 보호하는 메모리 관리 기법입니다.
2.1.1. 논리적 주소와 물리적 주소
- 논리적 주소(Logical Address) 또는 가상 주소(Virtual Address): 프로세스에 의해 생성되는 주소입니다. 각 프로세스는 0번지부터 시작하는 자신만의 주소 공간을 가집니다.
- 물리적 주소(Physical Address): 실제 메모리(RAM) 상의 주소입니다.
CPU는 논리적 주소를 다루며, 이 주소는 MMU(Memory Management Unit)라는 하드웨어에 의해 물리적 주소로 변환되어 실제 메모리에 접근하게 됩니다.
2.1.2. 주소 변환 과정
논리적 주소는 두 부분으로 구성됩니다.
- 페이지 번호 (Page Number, p): 논리적 주소 공간 내에서 해당 주소가 속한 페이지의 인덱스입니다.
- 변위 (Offset, d): 페이지 내에서 해당 주소의 상대적인 위치입니다.
MMU는 다음 과정을 통해 논리적 주소를 물리적 주소로 변환합니다.
- CPU가 논리적 주소
(p, d)를 생성합니다. - MMU는 해당 프로세스의 페이지 테이블에서 페이지 번호
p에 해당하는 항목(Page Table Entry, PTE)을 찾습니다. - PTE에는 해당 페이지가 저장된 물리 메모리의 프레임 번호(Frame Number, f)가 기록되어 있습니다.
- MMU는 이 프레임 번호
f와 논리적 주소의 변위d를 결합하여 최종적인 물리적 주소(f, d)를 생성합니다. - 이 물리적 주소를 통해 실제 메모리에 접근합니다.
2.2. 페이지 테이블(Page Table)의 구조와 구현
2.2.1. 페이지 테이블 항목 (Page Table Entry, PTE)
PTE는 페이지 하나에 대한 매핑 정보를 담고 있으며, 다음과 같은 주요 필드들로 구성됩니다.
- 프레임 번호 (Frame Number): 페이지가 매핑된 물리 메모리의 프레임 번호. 가장 중요한 정보입니다.
- Present/Absent 비트 (또는 Valid/Invalid 비트): 현재 페이지가 물리 메모리(프레임)에 존재하는지 여부를 나타냅니다.
1이면 존재(Valid),0이면 존재하지 않음(Invalid)을 의미합니다.0일 경우, 해당 페이지에 접근하면 페이지 폴트(Page Fault)가 발생합니다. - Protection 비트: 페이지에 대한 접근 권한(Read, Write, Execute)을 제어합니다. 예를 들어, 코드 영역은 Read/Execute만 가능하도록 설정할 수 있습니다.
- Accessed 비트: 페이지에 접근한 적이 있는지 나타냅니다. 페이지 교체 알고리즘(e.g., LRU)에서 사용됩니다.
- Dirty 비트: 페이지의 내용이 변경되었는지 나타냅니다. 페이지가 메모리에서 내려갈 때, Dirty 비트가
1이면 변경 내용을 디스크(스왑 공간)에 다시 써야 하고,0이면 쓸 필요가 없습니다.
2.2.2. 페이지 테이블 구현 방식
32비트 시스템에서 4KB 페이지를 사용할 경우, 2^20 (약 100만)개의 PTE가 필요합니다. PTE 하나가 4바이트라면 프로세스당 4MB의 페이지 테이블이 필요하게 되어 메모리 낭비가 심합니다. 이를 해결하기 위해 다양한 구현 방식이 사용됩니다.
- 계층적 페이징 (Hierarchical Paging): 페이지 테이블 자체를 페이징하는 방식입니다. 가장 일반적인 2단계 페이징에서는 외부 페이지 테이블(Outer Page Table)과 내부 페이지 테이블(Inner Page Table)로 구성됩니다. 논리 주소의 페이지 번호
p가 다시 외부 페이지 테이블 인덱스p1과 내부 페이지 테이블 인덱스p2로 나뉩니다. 이 방식은 사용되지 않는 페이지들에 대한 내부 페이지 테이블을 아예 생성하지 않음으로써 메모리 공간을 절약합니다. 64비트 시스템에서는 3~4단계 이상의 다단계 페이징이 일반적입니다. - 역 페이지 테이블 (Inverted Page Table): 프로세스별로 페이지 테이블을 두는 대신, 시스템 전체에 물리적 프레임 하나당 하나의 PTE를 두는 방식입니다. 즉, 테이블의 인덱스가 프레임 번호가 됩니다. 논리 주소
(프로세스 ID, 페이지 번호)를 통해 이 테이블을 검색해야 하므로 검색 시간이 오래 걸릴 수 있다는 단점이 있습니다. 이를 보완하기 위해 보통 해시 테이블을 함께 사용합니다.
2.3. TLB (Translation Lookaside Buffer)
페이지 테이블은 메인 메모리에 존재하므로, 주소 변환을 위해 메모리에 한 번 더 접근해야 하는 성능 저하가 발생합니다. (1. 페이지 테이블 접근, 2. 실제 데이터 접근)
이 문제를 완화하기 위해 TLB라는 고속의 주소 변환용 하드웨어 캐시를 사용합니다. TLB는 최근에 사용된 페이지-프레임 매핑 정보를 저장합니다.
- MMU는 주소 변환 시, 메인 메모리의 페이지 테이블을 보기 전에 먼저 TLB를 확인합니다.
- (TLB Hit) 원하는 매핑 정보가 TLB에 있으면, 즉시 물리 주소를 얻어 메모리 접근 오버헤드 없이 주소 변환을 완료합니다.
- (TLB Miss) 정보가 없으면, 메인 메모리의 페이지 테이블을 조회하고, 해당 매핑 정보를 TLB에 새로 저장한 후 주소 변환을 계속합니다.
3. 페이지와 프레임의 비교
| 구분 | 페이지 (Page) | 프레임 (Frame) |
|---|---|---|
| 소속 | 프로세스의 논리적 주소 공간 | 물리적 메모리 (RAM) |
| 역할 | 프로그램을 고정 크기로 분할하는 단위 | 물리 메모리를 고정 크기로 분할하는 단위 |
| 크기 | 시스템에 따라 고정된 크기 (e.g., 4KB, 2MB) | 페이지와 동일한 크기 |
| 식별자 | 페이지 번호 (Page Number) | 프레임 번호 (Frame Number) |
| 관계 | 페이지가 프레임에 매핑되어 적재됨 | 프레임이 페이지를 포함함 |
| 개수 | 프로세스의 크기에 따라 결정됨 | 물리 메모리의 크기에 따라 결정됨 |
3.1. 페이지 크기의 영향 (Trade-off)
- 페이지 크기가 클 경우:
- 장점: 페이지 테이블의 크기가 작아져 메모리 사용량이 줄고, TLB 커버리지(TLB로 접근 가능한 총 메모리 양)가 증가하여 TLB 히트율이 높아집니다. 디스크 I/O 효율도 증가합니다.
- 단점: 내부 단편화(Internal Fragmentation)가 증가합니다. 예를 들어 1KB의 데이터를 4KB 페이지에 할당하면 3KB가 낭비됩니다.
- 페이지 크기가 작을 경우:
- 장점: 내부 단편화가 줄어들어 메모리 활용도가 높아집니다.
- 단점: 페이지 테이블의 크기가 커지고, TLB 히트율이 감소하여 주소 변환 오버헤드가 증가할 수 있습니다.
4. 동작 계층 구조 (CPU부터 물리 메모리까지)
- [User Application]: 사용자 프로세스가
MOV EAX, [주소]와 같은 명령을 실행합니다. 이때[주소]는 논리 주소입니다. - [CPU]: CPU는 이 논리 주소를 MMU로 전달합니다.
- [Hardware: MMU]:
a. MMU는 논리 주소를 페이지 번호p와 변위d로 분리합니다.
b. MMU는 먼저 TLB에서 페이지 번호p를 검색합니다.
c. (TLB Hit)p에 대한 매핑 정보(프레임 번호f)가 TLB에 있으면, 즉시 물리 주소(f, d)를 생성하여 5번으로 갑니다.
d. (TLB Miss)p에 대한 정보가 TLB에 없으면, 메인 메모리의 페이지 테이블을 참조해야 합니다. - [OS Kernel & Page Table]:
a. MMU는 CR3 레지스터(x86 기준)에 저장된 페이지 테이블의 기준 주소를 이용해 페이지 테이블을 탐색합니다.
b. PTE를 찾았으나 Present 비트가 0이면 페이지 폴트(Page Fault) 트랩이 발생하여 CPU 제어권이 OS로 넘어갑니다.
c. PTE를 찾았고 Present 비트가 1이면, MMU는 PTE에서 프레임 번호i. **[OS: Page Fault Handler]**: OS는 해당 페이지를 디스크(스왑 영역)에서 찾습니다. ii. 물리 메모리에서 비어있는 프레임을 찾거나, 페이지 교체 알고리즘(e.g., LRU)을 사용해 기존 페이지를 내리고 프레임을 확보합니다. iii. 페이지를 디스크에서 확보한 프레임으로 로드합니다. iv. 페이지 테이블을 새로운 프레임 번호로 갱신하고 Present 비트를 1로 설정합니다. v. 폴트를 발생시킨 명령어를 다시 실행합니다. (3번부터 재시작)f를 추출합니다.
d. MMU는 이 새로운 매핑 정보(p -> f)를 TLB에 저장합니다. - [Hardware: Memory Bus]:
a. MMU가 최종적으로 계산한 물리 주소(f, d)를 주소 버스(Address Bus)에 보냅니다.
b. 메모리 컨트롤러는 해당 물리 주소의 데이터를 데이터 버스(Data Bus)를 통해 CPU로 전송합니다.
5. 요약
페이지와 프레임은 가상 메모리 시스템의 핵심 구성 요소입니다. 페이지는 프로세스가 사용하는 논리적인 메모리 공간을 나누는 단위이고, 프레임은 실제 물리 메모리(RAM) 공간을 나누는 단위로 둘의 크기는 항상 같습니다.
OS는 프로세스가 요청한 페이지를 비어있는 물리 메모리의 프레임에 할당하고, 이 매핑 정보를 '페이지 테이블'에 기록합니다. CPU가 특정 주소에 접근하려고 하면, MMU라는 하드웨어 장치가 이 페이지 테이블을 참조해서 논리 주소를 실제 물리 주소로 변환해주는 방식으로 동작합니다. 이 과정을 통해 각 프로세스는 자신만의 독립적인 메모리 공간을 가진 것처럼 느끼게 되고, 실제 메모리보다 더 큰 공간을 사용할 수 있게 됩니다.
6. 꼬리 질문
페이지 테이블은 어디에 저장되며, 그로 인해 발생할 수 있는 성능 문제는 무엇인가요?
페이지 테이블은 주로 메인 메모리(RAM)에 저장되기 때문에 CPU가 메모리에 한 번 접근하기 위해,
1) 주소 변환을 위한 페이지 테이블 접근
2) 실제 데이터 접근
총 두 번의 메모리 접근이 필요한 상황이 발생해 메모리 접근 속도를 절반으로 떨어뜨리는 성능 저하를 유발할 수 있습니다.
방금 말씀하신 페이지 테이블 접근으로 인한 성능 저하를 완화하기 위한 방법은 무엇이 있나요?
문제를 해결하기 위해 TLB(Translation Lookaside Buffer)라는 고속 주소 변환용 하드웨어 캐시를 사용합니다. MMU는 주소 변환 시 메인 메모리의 페이지 테이블을 먼저 찾아보기 전에, TLB에 원하는 페이지-프레임 매핑 정보가 있는지 확인합니다. TLB에 정보가 있으면(TLB Hit), 메인 메모리 접근 없이 바로 물리 주소를 얻을 수 있어 성능 저하를 크게 줄일 수 있습니다.
페이지의 크기는 클수록 좋을까요, 작을수록 좋을까요? 각각의 장단점을 설명해주세요.
페이지 크기는 장단점이 명확해 트레이드오프가 존재합니다.
페이지 크기가 크면, 관리해야 할 페이지 수가 줄어들어 페이지 테이블의 크기가 작아지고, TLB의 커버리지(TLB로 접근 가능한 총 메모리 양)가 늘어나 TLB 히트율이 높아지는 장점이 있습니다. 하지만, 페이지 내부에 사용되지 않는 공간이 많아지는 내부 단편화가 심해져 메모리 낭비가 발생할 수 있습니다.
반대로 페이지 크기가 작으면, 내부 단편화가 줄어들어 메모리 효율성이 높아집니다. 하지만, 관리해야 할 페이지 수가 늘어나 페이지 테이블의 크기가 커지고, TLB 히트율이 감소하여 주소 변환에 따른 오버헤드가 커질 수 있습니다.
'Computer Science' 카테고리의 다른 글
| 커널 (Kernel) (0) | 2026.01.15 |
|---|---|
| 렌더링 파이프라인 (0) | 2026.01.08 |
| 다익스트라 (Dijkstra) 알고리즘 (1) | 2025.12.22 |
| 고아 프로세스와 좀비 프로세스 (0) | 2025.12.11 |
| 단위 벡터 (0) | 2025.12.09 |
