세그멘테이션(Segmentation)은 프로그램을 논리적 단위(세그먼트)로 나눠 메모리를 관리하는 기법이다. 코드, 데이터, 스택, 힙을 별도 세그먼트로 관리해 보호와 공유를 세밀하게 제어할 수 있다.
핵심 구조
가상 주소: [ Segment Number | Offset ]
세그먼트 테이블: 각 세그먼트의 Base + Limit + 보호 비트
세그먼트 종류:
- .text (코드, 읽기 전용)
- .data (초기화된 전역변수)
- .bss (미초기화 전역변수)
- heap (동적 할당, 위로 성장)
- stack (지역변수·함수콜, 아래로 성장)
주소 변환
물리 주소 = Segment_Base[seg_num] + offset
단, offset < Segment_Limit[seg_num] (범위 초과 시 segfault)
| 페이징 | 세그멘테이션 |
|---|
| 단위 크기 | 고정 (4KB) | 가변 |
| 외부 단편화 | 없음 | 발생 |
| 내부 단편화 | 발생 | 없음 |
| 보호 | 페이지 단위 | 세그먼트 단위 |
| 공유 | 어려움 | 용이 |
세그멘테이션 + 페이징
x86 아키텍처는 두 기법을 결합 사용. Linux는 세그멘테이션을 최소화하고 페이징 중심으로 동작한다.
관련 개념