Paging과 Segmentation
Paging & Segmentation
📝 Segmentation
개념
가상 주소 공간을 세그먼트 단위로 실제 메모리에 독립적으로 매핑
목적:
- Heap과 Stack 사이의 사용하지 않는 공간 해결
- 메모리 효율성 향상
등장 배경
문제:
┌──────────┐
│ Code │
├──────────┤
│ Heap │
├──────────┤
│ (Free) │ ← 낭비!
├──────────┤
│ Stack │
└──────────┘
- Heap과 Stack 사이 사용하지 않는 공간 낭비
- 큰 주소 공간 지원 어려움
- Code 중복 발생
Segmentation 장점
Code → [Code Segment]
Heap → [Heap Segment]
Stack → [Stack Segment]
✅ 메모리 낭비 제거 ✅ 더 많은 주소 공간 지원 ✅ Code 공유로 메모리 절약
주소 변환
가상 주소 = Segment ID + Offset
예시:
Virtual Address: 0x4068
→ Segment ID: 01 (Heap)
→ Offset: 0x068 = 104
Segment Table:
Segment | Base | Bound
00 | 32KB | 2KB (Code)
01 | 26KB | 2KB (Heap)
10 | 36KB | 3KB (Stack)
Physical Address = Base + Offset
= 26KB + 104
Stack 처리
Stack은 거꾸로 확장
Physical Address = Base - Offset
예시:
Virtual Address: 0xA00
→ Segment ID: 10 (Stack)
→ Offset: 0xA00 = 2560
Physical Address = 36KB - 2560
Code Sharing
여러 프로세스가 Code 세그먼트 공유
Process A → [Code Segment] ← Process B
(Read/Execute Only)
특징: ✅ 읽기/실행 가능 ❌ 수정 불가
Segmentation 문제점
외부 단편화 (External Fragmentation)
문제:
[16KB] [Free 4KB] [Free 4KB]
→ 20KB 요청 시 할당 불가 (총 24KB 여유 있지만 불연속)
해결:
-
Compaction: 세그먼트 재배치
- ❌ 비용 높음, 성능 저하
-
Paging: 고정 크기로 분할
- ✅ 외부 단편화 제거
📄 Paging
개념
프로세스의 가상 주소 공간을 고정 크기(Page)로 나누어 메모리에 할당
용어:
- Page: 가상 메모리의 고정 크기 단위
- Page Frame: 실제 메모리의 고정 크기 단위
Paging 장점
✅ Flexibility
- Heap/Stack 크기 고민 불필요
✅ Simplicity
- 여유 공간 관리 쉬움
- 할당 쉬움
예시
64-byte Address Space, 16-byte Pages
Virtual Memory:
Page 0 [0-15]
Page 1 [16-31]
Page 2 [32-47]
Page 3 [48-63]
Physical Memory (128-byte):
Frame 0, 1, 2, 3, 4, 5, 6, 7
Page Table
가상 Page가 실제 메모리 어디에 위치하는지 기록
특징:
- Per-process structure (프로세스별)
- OS 메모리 영역에 저장
구조:
VPN | PFN
0 | 7
1 | 3
2 | 5
3 | 2
주소 변환
가상 주소 = VPN + Offset
예시:
Virtual Address: 21 (64-byte space)
Binary: 010101
→ VPN: 01 (상위 2 bits)
→ Offset: 0101 = 5 (하위 4 bits)
Page Table[1] = 7 (PFN)
Physical Address = (7 * 16) + 5 = 117
Page Table Entry (PTE)
각 Page의 정보
┌─────────────────────────────────┐
│ PFN | Flags │
└─────────────────────────────────┘
Flags:
- Present bit: 메모리/디스크 존재 여부
- Read/Write bit: 쓰기 허용 여부
- User/Supervisor bit: User Mode 접근 가능 여부
- Accessed bit: 최근 참조 여부 (페이지 교체에 사용)
- Dirty bit: 수정 여부
Paging 문제점
1. 메모리 오버헤드
예시:
32-bit Address Space, 4KB Page
→ VPN: 20 bits (2^20 pages)
→ Page Table Size: 2^20 * 4 bytes = 4MB
각 프로세스마다 4MB Page Table 필요!
2. 성능 저하
메모리 접근 2번 필요:
- Page Table 접근
- 실제 데이터 접근
해결: TLB (Translation Lookaside Buffer) 사용
3. 내부 단편화 (Internal Fragmentation)
문제:
15KB 요청 → 8KB * 2 = 16KB 할당
→ 1KB 낭비
📊 Paging vs Segmentation
| 특징 | Paging | Segmentation | |------|--------|--------------| | 크기 | 고정 | 가변 | | 단편화 | 내부 | 외부 | | 주소 변환 | Page Table | Segment Table | | 공유 | 어려움 | 쉬움 (Code 공유) | | 보호 | Page 단위 | Segment 단위 | | 관리 | 간단 | 복잡 |
💡 현대 OS의 선택
Paging 채택
이유: ✅ 외부 단편화 없음 ✅ 관리 간단 ✅ TLB로 성능 개선
단점 보완:
- 내부 단편화는 작은 크기 (최대 Page 크기)
- Page 크기 조절로 최적화
❓ 면접 질문 예시
Q1. Segmentation이란 무엇인가요?
답변: 가상 주소 공간을 세그먼트 단위(Code, Heap, Stack)로 나누어 실제 메모리에 독립적으로 매핑하는 방식입니다. Heap과 Stack 사이의 사용하지 않는 공간을 제거하여 메모리 효율성을 높이고, Code 공유로 메모리를 절약할 수 있습니다.
Q2. Paging이란 무엇인가요?
답변: 프로세스의 가상 주소 공간을 고정 크기(Page)로 나누어 메모리의 고정 크기 공간(Page Frame)에 할당하는 방식입니다. 외부 단편화를 제거하고 여유 공간 관리가 쉬우며, Heap과 Stack 크기에 대한 고민이 불필요합니다.
Q3. Segmentation의 문제점과 해결 방법은?
답변: 외부 단편화가 발생합니다. 세그먼트 크기가 가변적이어서 메모리에 불연속적인 여유 공간이 생기면 큰 세그먼트를 할당할 수 없습니다. 해결 방법으로 Compaction(재배치)이 있지만 비용이 높아, 결국 고정 크기의 Paging 기법을 사용하게 되었습니다.
Q4. Paging과 Segmentation의 차이는?
답변: Paging은 고정 크기로 분할하여 내부 단편화가 발생하지만 관리가 간단합니다. Segmentation은 가변 크기로 분할하여 외부 단편화가 발생하지만 Code 공유가 쉽습니다. 현대 OS는 외부 단편화가 더 심각하므로 Paging을 주로 사용합니다.
Q5. Page Table이란 무엇인가요?
답변: 가상 메모리의 Page가 실제 메모리의 어디에 위치하는지 기록하는 자료구조입니다. VPN(Virtual Page Number)을 인덱스로 사용하여 PFN(Physical Frame Number)을 찾고, Offset을 더하여 실제 물리 주소를 계산합니다. 프로세스별로 존재하며 OS 메모리 영역에 저장됩니다.
📚 원본 참고 자료
출처: 2023-CS-Study
- 파일: os_segmentation.md
- 파일: os_paging.md
- 내용: Segmentation, Paging, 주소 변환, 단편화