Skip to content

페이징과 세그먼테이션


왜 필요한가?

여러 프로세스를 동시에 실행하면서도, 메모리를 효율적으로 나누고 서로 보호해야 하기 때문이다.


메모리 관리 기법

  1. 연속 메모리 관리

    프로그램 전체가 물리 메모리의 연속된 한 구간에 올라가야 하는 방식

    • 고정 분할: 미리 나눈 파티션에 적재한다. 남는 공간 때문에 내부 단편화가 생기기 쉽다.
    • 동적 분할: 프로세스 크기에 맞춰 공간을 만든다. 빈 공간이 잘게 쪼개져 외부 단편화가 생길 수 있다.

  2. 불연속 메모리 관리

    프로그램을 여러 조각으로 나누어 물리 메모리의 서로 다른 위치에 둘 수 있는 방식

    • 페이지(page): 고정 크기의 가상 메모리 블록
    • 프레임(frame): 페이지와 같은 크기의 물리 메모리 블록
    • 세그먼트(segment): 코드, 데이터, 스택처럼 의미 단위로 나눈 가변 크기 논리 블록

    고정 크기 분할: 페이징(Paging)

    가변 크기 분할: 세그먼테이션(Segmentation)


    • 단순 페이징

      프로세스를 고정 크기 페이지로 나누고, 각 페이지를 아무 프레임에나 적재한다.

      외부 단편화는 거의 없지만, 마지막 페이지 일부가 비어 내부 단편화가 생길 수 있다.

    • 단순 세그먼테이션

      프로세스를 의미 있는 단위의 가변 크기 세그먼트로 나눈다.

      코드/데이터/스택처럼 논리 구조를 그대로 반영하기 쉽고, 보호/공유 단위로 쓰기 좋다.

      다만 세그먼트 크기가 제각각이라 외부 단편화가 생기기 쉽다.

    • 가상 메모리 페이징

      프로세스 전체를 한 번에 적재하지 않고 필요한 페이지를 나중에 불러온다.

      페이지 단위 보호와 공유가 쉽고, 현대 범용 운영체제에서 가장 널리 쓰이는 방식이다.

      페이지 테이블 관리, TLB, page fault 처리 같은 오버헤드가 있다.

    • 가상 메모리 세그먼테이션

      세그먼트 단위로 적재와 보호를 수행하는 방식이다.

      논리 구조 표현에는 좋지만, 외부 단편화와 구현 복잡도 때문에 현대 범용 OS의 주력 방식은 아니다.


현대 운영체제 관점

현대 범용 운영체제는 대체로 페이징 중심이다.

  • Linux, Windows, macOS 같은 시스템은 페이지 테이블과 page fault 처리로 가상 메모리를 구현한다.
  • x86-64 환경에서는 전통적인 세그먼테이션이 대부분 비활성화되어 있고, 사용자 공간 보호와 격리는 거의 전부 페이징이 담당한다.
  • 세그먼테이션은 오늘날에는 교육용 개념, 일부 특수 목적 하드웨어 기능, TLS 같은 제한된 용도로만 남아 있는 경우가 많다.

즉, 면접에서는 "세그먼테이션은 중요한 개념이지만, 실제 현대 OS의 메모리 관리는 대부분 페이징 기반"이라고 설명하면 정확하다.