운영체제 메모리 관리 기법과 주소 공간 설계
연속·비연속 할당, 페이징, 세그멘테이션, 가상 메모리와 보호·공유 기법을 운영체제 관점에서 정리한다.
2026-08-14 · 최초 발행 2026-01-04
메모리를 배분하면서 격리와 재배치를 보장하는 일
기억장치 관리는 제한된 메모리를 여러 프로세스에 배분하는 데서 끝나지 않는다. 운영체제는 프로세스 간 침범을 막고, 필요하면 영역을 안전하게 공유하며, 프로그램을 메모리의 어느 위치에든 적재할 수 있어야 한다. 프로그래머에게는 사용하기 편한 논리 주소 공간도 제공해야 한다.
관리 대상은 실행 중인 프로그램이 놓이는 주기억장치(RAM)뿐이 아니다. 영구 데이터를 보관하는 디스크, CPU와 메모리 사이의 속도 차이를 줄이는 캐시, CPU 내부의 레지스터, 물리 메모리보다 큰 논리 주소 공간을 제공하는 가상 메모리까지 연결된다.
연속 공간을 나누는 방식의 한계와 장점
단일 연속 할당은 운영체제 영역과 사용자 프로그램 영역을 분리하고, 한 번에 단일 프로세스가 사용자 영역을 차지하는 구조다.
구조가 단순해 복잡한 할당 알고리즘이 필요 없고, 운영체제 영역만 보호하면 된다. 반면 프로세스 크기가 작아도 전체 사용자 영역을 점유하므로 메모리 낭비가 생기며, 멀티태스킹에는 맞지 않는다. 초기 운영체제에서 사용된 방식이다.
고정 분할 할당은 메모리를 미리 정해진 크기의 파티션으로 나눈다. 모든 파티션을 같은 크기로 둘 수도 있고, 서로 다른 크기의 파티션을 섞을 수도 있다. 할당과 해제는 빠르고 단순하지만, 프로세스보다 큰 파티션을 배정하면 내부 단편화가 발생한다.
가변 분할 할당은 프로세스 크기에 맞춰 메모리를 동적으로 잡는다. 이 방식에서는 작은 가용 공간이 메모리 전체에 흩어지는 외부 단편화가 문제가 된다. 압축(Compaction)을 통해 재배치할 수 있으며, 가용 블록 리스트를 관리하면서 First Fit, Best Fit, Worst Fit 같은 할당 알고리즘을 적용한다.
페이지와 세그먼트가 주소를 해석하는 방법
페이징은 논리 메모리를 같은 크기의 페이지로, 물리 메모리를 고정 크기 프레임으로 분할한다. 논리 주소의 페이지 번호는 페이지 테이블을 거쳐 프레임 번호로 바뀌고, 페이지 오프셋과 결합해 물리 주소를 만든다.
비연속 할당이 가능하므로 외부 단편화는 제거된다. 내부 단편화는 페이지 크기만큼만 발생하며 평균 1/2 페이지다. 페이지 테이블은 페이지와 프레임의 매핑 정보를 보관한다.
세그멘테이션은 코드, 데이터, 스택처럼 프로그램의 논리적 구분을 기준으로 주소 공간을 나눈다. 세그먼트마다 크기가 다르고, 세그먼트 테이블에는 기준 주소와 한계가 저장된다. 세그먼트별 접근 권한을 두기 쉬운 대신 가변 크기 할당 때문에 외부 단편화가 생길 수 있다.
세그먼트-페이징 결합 방식은 두 방식을 함께 사용한다. 주소는 세그먼트에서 페이지를 거쳐 프레임으로 변환되며, Intel x86에서 실제로 사용된 메모리 관리 기법이다. 주소 변환 오버헤드가 늘어날 수 있어 변환 속도를 높이기 위한 하드웨어 캐시인 TLB를 활용한다.
디스크까지 확장한 논리 주소 공간
가상 메모리는 디스크를 메모리처럼 활용해 물리 메모리 크기보다 큰 프로그램을 실행하게 한다. 요구 페이징(Demand Paging)은 필요한 페이지만 메모리에 올리며, 참조한 페이지가 메모리에 없으면 페이지 폴트(Page Fault)가 발생한다. 스왑핑(Swapping)은 프로세스 또는 페이지를 디스크로 옮기는 방식이다.
빈 프레임이 없을 때는 페이지 교체 알고리즘이 희생 페이지를 선택한다.
FIFO(First-In-First-Out)는 가장 오래된 페이지를 바꾸며 구현이 간단하다. LRU(Least Recently Used)는 가장 오래 사용하지 않은 페이지를, LFU(Least Frequently Used)는 참조 빈도가 낮은 페이지를 교체한다. NRU(Not Recently Used)는 참조 비트와 변경 비트를 사용하고, Clock Algorithm은 LRU를 근사해 효율적으로 구현한다.
보호와 공유가 같은 주소 공간에서 만나는 지점
보호는 경계 레지스터(Boundary Register) 또는 기준/한계 레지스터로 프로세스가 접근할 수 있는 주소 범위를 검사하는 방식에서 시작한다. 페이징에서는 페이지 테이블 엔트리에 읽기·쓰기·실행 권한 비트를 둘 수 있고, 세그멘테이션에서는 세그먼트별 접근 권한을 설정할 수 있다. 이 검증은 MMU(Memory Management Unit)가 지원한다.
공유 라이브러리처럼 여러 프로세스가 동일한 코드를 함께 쓰거나, 프로세스 간 통신(IPC)을 위해 공유 메모리 영역을 사용할 수도 있다. 읽기 전용 코드 영역은 공유 페이지로 둘 수 있으며, Copy-On-Write는 수정 전까지 페이지를 공유하다가 수정 시 복사한다. 공유 메모리에 접근할 때는 상호배제를 보장하는 동기화가 필요하다.
계층 구조와 배치 정책까지 넓어진 관리 범위
현대 시스템의 메모리 계층은 레지스터, 캐시, 메모리, 디스크가 속도와 용량의 균형을 이룬다. 다중 코어 환경에서는 캐시 일관성(Cache Coherence)을 유지해야 하며, NUMA(Non-Uniform Memory Access) 환경에서는 프로세서별 로컬 메모리 배치가 성능에 영향을 준다. 데이터센터에서는 메모리 풀링으로 자원을 공유하고, 영구 메모리(Persistent Memory)는 NVM을 메모리처럼 사용한다.
운영체제와 하드웨어는 프리페칭(Prefetching)으로 필요한 데이터를 미리 올리고, 대형 페이지(Huge Pages)로 TLB 미스를 줄여 성능을 높일 수 있다. 사용하지 않는 페이지는 압축 저장할 수 있으며, 가상화 환경에서는 바룬 메모리(Balloon Memory)로 메모리를 회수한다. NUMA 인식 할당은 로컬 메모리를 우선 배정해 성능을 높이는 방식이다.