페이징과 세그먼테이션 (Paging and Segmentation)
한눈에 보기
프로세스 주소 공간을 물리 메모리에 비연속적으로 배치하는 페이징과 세그먼테이션을 다룬다. 주소 변환과 TLB, 다단계 페이지 테이블, 두 기법의 단편화와 보호 관점 비교까지 정리한다.
최종 업데이트 2026.09.17
페이징(Paging)과 세그먼테이션(Segmentation)은 프로세스의 논리 주소 공간을 물리 메모리에 비연속적으로 배치하기 위한 두 가지 메모리 관리 기법이다. 페이징은 주소 공간을 고정 크기 조각으로, 세그먼테이션은 코드나 스택 같은 의미 단위의 가변 크기 조각으로 나눈다. 현대 운영체제는 사실상 페이징을 중심으로 동작하며, 세그먼테이션의 의미 구분은 페이지 단위 권한 설정으로 흡수되었다.
페이징의 원리
페이징은 논리 주소 공간을 페이지(page)라는 고정 크기 블록으로, 물리 메모리를 같은 크기의 프레임(frame)으로 나눈다. 페이지 크기는 보통 4KB다. 논리 주소는 페이지 번호와 페이지 내 오프셋(offset)으로 쪼개지고, 페이지 테이블(page table)이 페이지 번호를 프레임 번호로 바꿔 준다. 어떤 페이지든 어떤 프레임에나 들어갈 수 있으므로 외부 단편화(external fragmentation)가 사라진다. 대신 마지막 페이지가 꽉 차지 않아 생기는 내부 단편화(internal fragmentation)는 평균 페이지 절반만큼 발생한다. 페이지 테이블 항목에는 프레임 번호 외에 유효 비트(valid bit), 읽기와 쓰기와 실행 권한 비트, 참조 비트, 수정 비트가 들어 있어 보호와 가상 메모리 운영에 함께 쓰인다.
페이지 크기 4KB(2^12), 32비트 논리 주소라면
논리 주소 = [ 페이지 번호 20비트 | 오프셋 12비트 ]
물리 주소 = 페이지테이블[페이지 번호].프레임번호 * 4096 + 오프셋
예: 논리 주소 0x00003ABC
페이지 번호 = 0x3, 오프셋 = 0xABC
페이지 3이 프레임 7에 매핑되어 있으면
물리 주소 = 7 * 0x1000 + 0xABC = 0x7ABC
TLB: 주소 변환의 캐시
페이지 테이블은 메모리에 있으므로, 순진하게 구현하면 데이터 접근 한 번에 메모리 접근이 두 번(테이블 조회와 실제 접근) 필요하다. 이를 줄이기 위해 MMU 안에 최근 변환 결과를 담는 변환 색인 버퍼(TLB, Translation Lookaside Buffer)를 둔다. TLB에 항목이 있으면(TLB hit) 추가 메모리 접근 없이 즉시 변환되고, 없으면(TLB miss) 페이지 테이블을 걸어 내려가 항목을 채운다. 프로그램의 지역성 덕분에 적중률이 매우 높아 실효 접근 시간은 거의 한 번 접근 수준으로 유지된다. 문맥 교환 시에는 다른 프로세스의 변환이 섞이면 안 되므로 TLB를 비우거나, 항목에 주소 공간 식별자(ASID)를 붙여 구분한다.
페이징은 공유와 보호에도 활용된다. 여러 프로세스의 페이지 테이블이 같은 물리 프레임을 가리키게 하면 C 라이브러리 같은 공유 라이브러리의 코드를 메모리에 한 벌만 두고 모두가 쓸 수 있다. fork의 쓰기 시 복사(copy-on-write)도 부모와 자식이 같은 프레임을 읽기 전용으로 공유하다가 쓰기가 일어난 페이지만 복사하는 페이징 기반 기법이다. 반대로 페이지 항목의 실행 금지 비트(NX bit)는 스택이나 힙에 주입된 코드의 실행을 하드웨어 수준에서 차단해 보안에 기여한다.
페이지 테이블의 크기 문제와 다단계 구조
32비트 주소 공간에 4KB 페이지라면 페이지가 백만 개이고, 프로세스마다 수 MB의 테이블이 필요하다. 64비트에서는 단일 테이블이 아예 불가능하다. 그래서 페이지 테이블 자체를 페이지 단위로 쪼개고 상위 테이블이 하위 테이블을 가리키게 하는 다단계 페이지 테이블(multi-level page table)을 쓴다. 실제로 쓰는 주소 영역의 테이블만 만들면 되므로 희소한 주소 공간에서 메모리가 크게 절약된다. 현재 x86-64는 4단계(확장 시 5단계) 구조를 쓴다. 단계가 늘수록 TLB 미스 시 밟아야 할 메모리 접근도 늘어나므로, 데이터베이스처럼 큰 메모리를 다루는 워크로드는 2MB나 1GB의 거대 페이지(huge page)로 TLB 부담을 줄이기도 한다. 이 밖에 해시 페이지 테이블과, 프레임 기준으로 관리해 테이블 크기를 물리 메모리에 비례시키는 역페이지 테이블(inverted page table)도 있다.
세그먼테이션의 원리
세그먼테이션은 주소 공간을 코드, 데이터, 스택, 힙처럼 프로그래머가 인식하는 의미 단위인 세그먼트(segment)로 나눈다. 논리 주소는 세그먼트 번호와 오프셋의 쌍이고, 세그먼트 테이블의 각 항목은 시작 물리 주소(base)와 길이(limit)를 가진다. 오프셋이 길이를 넘으면 트랩이 발생해 잘못된 접근을 잡아낸다. 세그먼트 단위로 공유와 권한 설정이 자연스럽다는 장점이 있지만, 세그먼트가 가변 크기라서 연속 할당이 필요하고 외부 단편화가 다시 나타난다는 근본적 약점이 있다. 과거에는 세그먼트를 다시 페이지로 나누는 혼합 방식(segmented paging)도 쓰였으나, x86-64에서는 세그먼테이션이 사실상 평탄화되어 페이징만 실질적으로 동작한다.
페이징과 세그먼테이션 비교
| 구분 | 페이징 | 세그먼테이션 |
|---|---|---|
| 분할 단위 | 고정 크기(예: 4KB) | 가변 크기 의미 단위 |
| 단편화 | 내부 단편화 발생 | 외부 단편화 발생 |
| 사용자 관점 | 분할이 보이지 않는다 | 코드, 스택 등 논리 구조가 드러난다 |
| 주소 형태 | 페이지 번호 + 오프셋(하드웨어가 자동 분해) | 세그먼트 번호 + 오프셋(2차원 주소) |
| 보호와 공유 | 페이지 단위 권한 비트 | 세그먼트 단위로 자연스러움 |
| 현대 사용 | 가상 메모리의 표준 | 단독 사용은 거의 사라짐 |
면접에서 이렇게 물어본다
- 페이징이 외부 단편화를 없애는 원리와 그 대가로 생기는 내부 단편화를 설명해 보라.
- TLB가 없다면 메모리 접근 성능이 어떻게 되는지, TLB 미스 시 무슨 일이 일어나는지 말해 보라.
- 다단계 페이지 테이블이 단일 테이블보다 메모리를 절약하는 이유는 무엇인가.
- 페이징과 세그먼테이션을 단편화, 보호, 사용자 관점에서 비교해 보라.
- 논리 주소가 주어졌을 때 물리 주소로 변환되는 과정을 페이지 크기와 함께 계산해 보라.
운영체제에서 같이 읽기
- CPU 스케줄링 (CPU Scheduling)운영체제가 준비 상태의 여러 프로세스 중 다음에 CPU를 쓸 프로세스를 고르는 CPU 스케줄링을 다룬다. 선점과 비선점, FCFS부터 라운드 로빈과 MLFQ까지 알고리즘 비교, 리눅스 CFS와 EEVDF까지 정리한다.
- 교착 상태 (Deadlock)둘 이상의 프로세스가 서로가 점유한 자원을 기다리며 영원히 멈추는 교착 상태를 다룬다. 네 가지 필요조건, 예방과 회피와 탐지 회복 전략, 기아와 라이브락의 구분, 데이터베이스 데드락 실무 사례까지 정리한다.
- 파일 시스템 (File System)저장 장치 위에 파일과 디렉터리라는 추상화를 만드는 파일 시스템을 다룬다. 슈퍼블록과 아이노드 구조, 연속과 연결과 색인 할당 비교, 저널링과 쓰기 시 복사, VFS 계층까지 정리한다.
- 인터럽트 (Interrupt)CPU가 하던 일을 멈추고 긴급한 사건을 먼저 처리하게 하는 인터럽트를 다룬다. 폴링과의 비교, 하드웨어 인터럽트와 예외와 트랩의 구분, 처리 절차와 상반부 하반부, 타이머 인터럽트와 멀티태스킹의 관계를 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기