페이징과 세그먼테이션 (Paging and Segmentation)

한눈에 보기

프로세스 주소 공간을 물리 메모리에 비연속적으로 배치하는 페이징과 세그먼테이션을 다룬다. 주소 변환과 TLB, 다단계 페이지 테이블, 두 기법의 단편화와 보호 관점 비교까지 정리한다.

최종 업데이트 2026.09.17

페이징(Paging)과 세그먼테이션(Segmentation)은 프로세스의 논리 주소 공간을 물리 메모리에 비연속적으로 배치하기 위한 두 가지 메모리 관리 기법이다. 페이징은 주소 공간을 고정 크기 조각으로, 세그먼테이션은 코드나 스택 같은 의미 단위의 가변 크기 조각으로 나눈다. 현대 운영체제는 사실상 페이징을 중심으로 동작하며, 세그먼테이션의 의미 구분은 페이지 단위 권한 설정으로 흡수되었다.

페이징의 원리

페이징은 논리 주소 공간을 페이지(page)라는 고정 크기 블록으로, 물리 메모리를 같은 크기의 프레임(frame)으로 나눈다. 페이지 크기는 보통 4KB다. 논리 주소는 페이지 번호와 페이지 내 오프셋(offset)으로 쪼개지고, 페이지 테이블(page table)이 페이지 번호를 프레임 번호로 바꿔 준다. 어떤 페이지든 어떤 프레임에나 들어갈 수 있으므로 외부 단편화(external fragmentation)가 사라진다. 대신 마지막 페이지가 꽉 차지 않아 생기는 내부 단편화(internal fragmentation)는 평균 페이지 절반만큼 발생한다. 페이지 테이블 항목에는 프레임 번호 외에 유효 비트(valid bit), 읽기와 쓰기와 실행 권한 비트, 참조 비트, 수정 비트가 들어 있어 보호와 가상 메모리 운영에 함께 쓰인다.

페이징 원리: 논리 주소를 페이지 번호와 오프셋으로 나누고 페이지 테이블에서 프레임 번호를 찾아 물리 주소로 바꾸는 과정
프로세스는 페이지 0·1·2·3이 이어져 있다고 믿지만 실제로는 프레임 5·2·7·0에 흩어져 있다. 이 «착각»을 만들어 주는 것이 페이지 테이블이고, 외부 단편화가 사라지는 대신 마지막 페이지의 남는 공간(내부 단편화)과 테이블 자체의 크기가 비용이 된다.
페이지 크기 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 미스 시 무슨 일이 일어나는지 말해 보라.
  • 다단계 페이지 테이블이 단일 테이블보다 메모리를 절약하는 이유는 무엇인가.
  • 페이징과 세그먼테이션을 단편화, 보호, 사용자 관점에서 비교해 보라.
  • 논리 주소가 주어졌을 때 물리 주소로 변환되는 과정을 페이지 크기와 함께 계산해 보라.
운영체제 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기