학습 공간 개념 · 판단 · 실험

Frontend Performance Lab

운영체제

주소 공간과 메모리 배치

프로그램이 바라보는 가상 주소의 연속성과 실제 물리 RAM 프레임의 배치는 서로 다를 수 있습니다.

이럴 때 필요해요

가상 메모리 예약 크기와 실제 RAM 점유량, 그리고 내부·외부 단편화 현상을 섞어 오해하지 않고 정확히 진단하기 위해 필요합니다.

어떻게 동작하나요?

우리가 프로그램을 짤 때는 코드, 전역 데이터, 동적 할당을 위한 힙(Heap), 함수 호출을 위한 스택(Stack)이 깔끔하게 나뉜 하나의 연속된 메모리 공간을 쓰는 것처럼 생각합니다. 이는 운영체제가 각 프로세스에 제공하는 가상 주소 공간(Virtual Address Space)이라는 추상화 덕분이며, 실제 실행 환경에는 공유 라이브러리와 메모리 매핑 파일(mmap), 여러 스레드의 스택도 함께 배치됩니다.

이 가상 주소를 실제 물리 RAM에 연결하는 대표적인 두 방식이 페이징(Paging)과 세그멘테이션(Segmentation)입니다. 세그멘테이션은 코드·데이터·힙처럼 논리적 영역별로 가변 크기 구간을 나누는 방식이고, 페이징은 의미와 상관없이 가상 주소와 물리 메모리를 똑같은 고정 크기(예: 4KiB)의 페이지(Page)와 프레임(Frame)으로 잘라 페이지 테이블로 매핑하는 방식입니다. 페이징을 쓰면 가상 주소가 0번, 1번으로 연속되어 있어도 실제 물리 RAM에서는 서로 멀리 떨어진 빈 프레임 어디에나 흩어져 올라갈 수 있습니다.

메모리를 나누어 쓰다 보면 빈 공간이 낭비되는 단편화(Fragmentation)가 나타납니다. 가변 크기로 할당과 해제를 반복하다가 빈 공간들이 잘게 쪼개져, 빈 공간의 총합은 충분한데도 큰 연속 구간 하나를 못 찾는 현상이 외부 단편화입니다. 반대로 페이징처럼 고정 크기 블록으로 나누어 외부 단편화를 해결하더라도, 마지막 페이지 안에서 요청이 다 쓰지 못하고 남는 안쪽 공간인 내부 단편화와 페이지 테이블 관리 비용은 여전히 남게 됩니다.

코드 예제

동작을 설명하는 읽기 전용 예제입니다.

example.txt
페이지 크기 4KiB, 요청 크기 6KiB
필요 페이지: 2개 = 8KiB
마지막 페이지 미사용 공간: 2KiB
가상 페이지 0 → 물리 프레임 9
가상 페이지 1 → 물리 프레임 2
text · 읽기 전용5줄

4KiB 페이지 단위 시스템에서 6KiB를 요청해 2개의 페이지(8KiB)를 배정받은 단순 예시입니다. 가상 페이지 0과 1은 연속되어 있지만 물리 프레임은 9번과 2번으로 떨어져 있을 수 있고, 마지막 페이지 안에는 2KiB의 내부 단편화가 남습니다.

자주 헷갈리는 포인트

  • 프로세스가 예약해 둔 가상 주소 공간 크기(VSZ)를 현재 실제 물리 RAM을 차지하고 있는 상주 크기(RSS)와 같다고 생각하면 안 됩니다.
  • 교과서의 힙·스택 그림만 보고 모든 데이터와 프레임이 물리 RAM에서도 똑같이 연속된 고정 위치에 놓인다고 가정하면 안 됩니다.

내 말로 설명해 보기

시스템의 남아 있는 빈 메모리 총합은 100MB로 충분한데도 10MB짜리 연속된 공간 할당 요청이 실패했다면 이는 어떤 단편화 때문인가요?

함께 읽으면 좋은 개념

관련 면접 질문 4개

프로세스 가상 주소 공간의 코드, 데이터, 힙, 스택 영역은 각각 무엇을 담나요?

전형적인 프로세스 가상 주소 공간은 실행할 명령어를 담는 코드(Code) 영역, 전역·정적 변수를 담는 데이터 영역, 런타임 동적 할당을 위한 힙(Heap) 영역, 함수 호출 프레임을 쌓는 스택(Stack) 영역으로 설명합니다. 실제 환경에는 공유 라이브러리, 메모리 매핑(mmap) 영역과 여러 스레드의 개별 스택도 함께 존재합니다. 이들은 가상 주소 공간의 논리적 구획일 뿐이며, 실제 물리 RAM에 반드시 연속 배치되거나 고정된 방향으로만 자란다고 보장되지는 않습니다.

꼬리질문과 참고자료 →

메모리 관리에서 페이징(Paging)과 세그멘테이션(Segmentation)은 주소 공간을 어떻게 나누나요?

페이징은 가상 주소 공간을 고정 크기 페이지(Page)로 나누어 물리 프레임(Frame)에 매핑하는 방식이고, 세그멘테이션은 코드·데이터·스택처럼 논리적 영역을 가변 크기 구간(Segment)으로 다루는 방식입니다. 페이징은 물리 메모리에 큰 연속 공간이 없어도 배치할 수 있어 외부 단편화를 줄여 주지만 페이지 테이블 관리 비용과 내부 단편화가 따릅니다. 반면 세그멘테이션은 논리 단위 보호와 공유에 직관적이지만 가변 크기 할당에 따른 외부 단편화 문제가 생길 수 있습니다.

꼬리질문과 참고자료 →

메모리의 내부 단편화와 외부 단편화는 무엇이 다르며 각각 왜 발생하나요?

내부 단편화는 할당된 고정 크기 블록 안에서 요청이 다 쓰지 못하고 남는 안쪽 공간이 생기는 현상입니다. 반대로 외부 단편화는 가변 크기 할당·해제가 반복되면서 빈 공간들이 흩어져, 전체 빈 공간 합계는 충분한데도 요청한 크기의 연속 구간을 확보하지 못하는 현상입니다. 페이지 크기나 할당기 크기 등급 조정, 압축(Compaction) 등은 메모리 낭비와 관리 오버헤드 사이의 절충이므로 어느 한 방식으로 모든 낭비를 완전히 없애지는 못합니다.

꼬리질문과 참고자료 →
나머지 질문 1개

공식 참고 자료

← 운영체제