운영체제의 가상 메모리 & 페이징

HanJu Han·2026년 4월 29일

1단계: 물리 메모리(Physical Memory)와 주소의 이해

1. 정의

  • 물리 메모리(RAM): 컴퓨터 안에서 실제로 데이터와 프로그램이 저장되는 하드웨어 부품입니다.
  • 물리 주소(Physical Address): 메모리라는 거대한 아파트의 '실제 호수(주소)'입니다. 메모리는 1바이트(Byte) 단위로 고유한 번호(주소)를 가집니다.

2. 왜 알아야 하는가?

프로그램(예: 게임, 카카오톡)이 실행되려면 반드시 하드디스크에서 물리 메모리(RAM)로 올라와야 합니다. 이를 '프로세스가 메모리에 적재되었다'고 표현합니다. 메모리의 공간은 한정되어 있기 때문에, 이 공간을 어떻게 효율적으로 나눠 쓸 것인가가 운영체제의 최대 고민입니다.


2단계: 연속 메모리 할당과 단편화 (과거의 방식과 문제점)

질문해주신 내용 중 "외부 단편화 제거"라는 말이 있었죠? 페이징을 이해하려면 이 '외부 단편화'가 무엇인지 뼈저리게 느껴야 합니다.

1. 연속 메모리 할당 (Contiguous Allocation)의 정의

과거의 운영체제는 아주 단순했습니다. 프로그램이 실행되면, 프로그램 전체를 메모리의 빈 공간에 '통째로(연속적으로)' 집어넣었습니다.

2. 왜 그렇게 사용했는가?

  • 구현의 단순함: 프로그램이 100번지부터 시작한다면, 그 뒤로 쭉 이어서 저장하면 되니까 운영체제가 관리하기 너무 편했습니다.
  • 빠른 접근: 데이터가 한곳에 모여 있으니 순서대로 읽기만 하면 되었습니다.

3. 치명적인 문제점: 외부 단편화 (External Fragmentation)

프로그램들이 켜지고 꺼지기를 반복하다 보면, 메모리 중간중간에 '빈 공간(Hole)'들이 생겨납니다.
외부 단편화란, "남은 메모리 공간을 다 합치면 충분히 큰데, 공간이 조각조각 흩어져 있어서 새로운 프로그램을 실행하지 못하는 현상"을 말합니다.

4. 예시 데이터로 하나하나 풀어보기 (Step-by-Step)

선생님이 아주 쉬운 예시를 가져왔습니다.

  • 우리의 전체 물리 메모리 크기: 100MB
  • 운영체제(OS)가 차지하는 공간: 20MB (항상 0~20MB 구간을 차지한다고 가정)
  • 사용 가능한 메모리: 80MB

[상황 1] 프로그램 A, B, C가 순서대로 실행됩니다.

  • 프로그램 A (크기: 30MB) 실행
  • 프로그램 B (크기: 20MB) 실행
  • 프로그램 C (크기: 10MB) 실행

현재 메모리 상태는 다음과 같습니다. (연속적으로 차곡차곡 쌓입니다)

  • 0~20MB: OS
  • 20~50MB: 프로그램 A (30MB)
  • 50~70MB: 프로그램 B (20MB)
  • 70~80MB: 프로그램 C (10MB)
  • 80~100MB: 빈 공간 (20MB)

[상황 2] 프로그램 B가 종료되었습니다.
프로그램 B가 메모리에서 빠져나가면서 중간에 구멍(Hole)이 생깁니다.

  • 0~20MB: OS
  • 20~50MB: 프로그램 A (30MB)
  • 50~70MB: 빈 공간 (20MB) 👈 구멍 발생!
  • 70~80MB: 프로그램 C (10MB)
  • 80~100MB: 빈 공간 (20MB)

[상황 3] 새로운 프로그램 D (크기: 30MB)를 실행하려고 합니다.
자, 여기서 문제가 발생합니다!

  • 현재 남은 빈 공간의 총합 = 50~70MB 구간(20MB) + 80~100MB 구간(20MB) = 총 40MB
  • 프로그램 D의 크기 = 30MB
  • 결과: 총 빈 공간(40MB)이 프로그램 D(30MB)보다 크지만, 연속된 30MB 공간이 없기 때문에 프로그램 D를 실행할 수 없습니다!

이것이 바로 외부 단편화(External Fragmentation)입니다. 메모리가 낭비되는 아주 끔찍한 상황이죠.


시각적으로 이해하기


컴퓨터는 "프로그램을 무조건 통째로, 연속해서 넣어야 한다"(연속 할당 방식)는 규칙 때문에, 빈 공간이 충분함에도 불구하고 프로그램을 실행하지 못하는 외부 단편화라는 심각한 병에 걸려 있었습니다.

이 병을 치료하기 위해 천재적인 컴퓨터 공학자들이 모여서 낸 아이디어가 바로 질문해주신 "가상 메모리(Virtual Memory)""페이징(Paging)"입니다.

"프로그램을 꼭 통째로 연속해서 넣어야 해? 일정한 크기로 잘게 쪼개서(Paging), 빈 공간 아무 데나 흩뿌려 넣고, 프로세스한테는 연속된 것처럼 거짓말(Virtual Memory)을 치면 되잖아!"


3단계: 가상 메모리(Virtual Memory)의 탄생

1. 정의

가상 메모리는 운영체제가 프로세스(실행 중인 프로그램)에게 제공하는 '거대한 가짜 메모리 공간'입니다.
프로세스에게 "너 혼자 이 넓은 메모리를 다 쓰고 있고, 네 데이터는 아주 예쁘게 연속적으로 저장되어 있어!"라고 완벽한 거짓말(추상화)을 하는 기술입니다.

2. 왜 사용하는가?

  • 프로그래머의 편리함: 개발자는 물리 메모리가 얼마나 남았는지, 어디가 비어있는지 신경 쓸 필요 없이 0번지부터 연속적으로 코드를 짜면 됩니다.
  • 메모리 크기의 한계 극복: 실제 RAM이 8GB여도, 가상 메모리 기술을 통해 프로세스는 마치 16GB, 32GB를 쓰는 것처럼 착각하게 만들 수 있습니다. (당장 안 쓰는 데이터는 하드디스크에 잠깐 빼놓는 방식을 씁니다.)

4단계: 페이징(Paging) 기법

가상 메모리라는 '거짓말'을 현실로 만들어주는 핵심 기술이 바로 페이징입니다.

1. 정의

메모리를 통째로 할당하지 않고, 아주 작은 '고정된 크기'로 똑같이 깍둑썰기를 하는 방식입니다.
이때 두 가지 중요한 용어가 등장합니다. (반드시 기억하세요!)

  • 페이지(Page): 가상 메모리를 일정한 크기로 자른 블록
  • 프레임(Frame): 물리 메모리를 일정한 크기로 자른 블록
  • ⭐ 핵심 규칙: 페이지의 크기 = 프레임의 크기 (보통 4KB를 많이 씁니다.)

2. 왜 사용하는가?

  • 외부 단편화 완벽 제거: 모든 메모리가 똑같은 크기(예: 4KB)로 잘려 있습니다. 프로그램이 12KB가 필요하다면, 물리 메모리 공간이 연속해 있을 필요 없이 아무 데나 비어있는 프레임 3개를 찾아서 쏙쏙 집어넣으면 됩니다. 블록 장난감(레고)을 끼워 맞추는 것과 같습니다!

5단계 도입: 페이지 테이블과 매핑

예시 데이터 분석

  • 기본 단위: 1칸 = 1KB
  • 페이지/프레임 크기: 4칸 = 4KB
  • 물리 메모리 (실제 RAM): 총 16칸 = 16KB
    • 16KB를 4KB(프레임 크기)로 나누면? 👉 총 4개의 프레임 (프레임 0 ~ 3)
  • 프로세스 P1의 가상 메모리: 총 12칸 = 12KB
    • 12KB를 4KB(페이지 크기)로 나누면? 👉 총 3개의 페이지 (페이지 0 ~ 2)

페이지 테이블 (Page Table) 이란?

프로세스 P1은 자신의 데이터가 '페이지 0 -> 1 -> 2' 순서로 연속해 있다고 믿습니다. 하지만 실제 물리 메모리에는 빈 공간에 마구잡이로 흩어져 있죠.
가짜 주소(페이지)와 진짜 주소(프레임)를 연결해 주는 지도(Map)가 바로 페이지 테이블입니다.

질문자님의 예시 데이터를 보면 지도는 다음과 같습니다.

  • Page Table = {0 → 2, 1 → 0, 2 → 3}
    • 가상 페이지 0은 실제 물리 프레임 2에 있다.
    • 가상 페이지 1은 실제 물리 프레임 0에 있다.
    • 가상 페이지 2은 실제 물리 프레임 3에 있다.

시각적으로 이해하기


5단계 심화: 오프셋(Offset)의 이해와 주소 변환 공식

1. 오프셋(Offset)이란 무엇인가?

오프셋은 영어로 '떨어진 거리'를 의미합니다. 컴퓨터 공학에서는 "해당 페이지(또는 프레임)의 시작점으로부터 몇 칸이나 떨어져 있는가?"를 나타냅니다.

쉽게 아파트 주소로 비유

  • 페이지 번호 / 프레임 번호: 아파트의 '동' (예: 101동, 102동)
  • 오프셋(Offset): 아파트의 '호수' (예: 302호)

가상 메모리(101동)가 물리 메모리(105동)로 이사를 가더라도, 방의 구조와 크기(페이지 크기 = 프레임 크기)가 똑같기 때문에 '302호'라는 호수(오프셋)는 절대 변하지 않습니다. 이것이 페이징 주소 변환의 핵심입니다

2. 주소 변환 마법의 공식

컴퓨터는 가상 주소(숫자) 하나만 딱 주어지면, 아래의 간단한 산수(나눗셈과 나머지)를 통해 위치를 찾아냅니다.
(우리의 예시에서 페이지 크기는 4칸입니다.)

  1. 페이지 번호 (어느 동인가?) = 가상 주소 // 페이지 크기 (몫)
  2. 오프셋 (몇 호인가?) = 가상 주소 % 페이지 크기 (나머지)
  3. 물리 주소 (실제 위치) = (물리 프레임 번호 × 프레임 크기) + 오프셋

예시 데이터로 하나하나 풀어보기

[풀이 1] 가상 주소 5의 변환 과정

목표: 프로세스가 "가상 주소 5번 칸에 있는 데이터 가져와!"라고 명령했습니다. 실제 물리 메모리의 몇 번 칸으로 가야 할까요?

  • Step 1: 가상 주소 분리하기 (페이지 번호와 오프셋 구하기)

    • 가상 주소 = 5
    • 페이지 크기 = 4
    • 페이지 번호 = 5 // 4 = 1 (몫) 👉 "아하, 1번 페이지구나!"
    • 오프셋 = 5 % 4 = 1 (나머지) 👉 "1번 페이지의 시작점으로부터 1칸 떨어져 있구나!"
    • (결과: 가상 주소 5 = 페이지 1, 오프셋 1)
  • Step 2: 페이지 테이블(지도) 확인하기

    • 우리의 페이지 테이블: {0→2, 1→0, 2→3}
    • 1번 페이지는 어디로 가야 하죠? 👉 프레임 0으로 가야 합니다.
  • Step 3: 실제 물리 주소 계산하기

    • 프레임 0의 시작 위치는? = 0번 프레임 × 4칸 = 0번 칸
    • 오프셋(떨어진 거리)은 그대로 유지되므로 = 1
    • 최종 물리 주소 = 0 + 1 = 1

결론: 가상 주소 5번은 실제 물리 메모리의 1번 칸에 있습니다!


[풀이 2] 가상 주소 9의 변환 과정

목표: 프로세스가 "가상 주소 9번 칸에 있는 데이터 가져와!"라고 명령했습니다.

  • Step 1: 가상 주소 분리하기

    • 가상 주소 = 9
    • 페이지 크기 = 4
    • 페이지 번호 = 9 // 4 = 2 (몫) 👉 "2번 페이지구나!"
    • 오프셋 = 9 % 4 = 1 (나머지) 👉 "2번 페이지의 시작점으로부터 1칸 떨어져 있구나!"
    • (결과: 가상 주소 9 = 페이지 2, 오프셋 1)
  • Step 2: 페이지 테이블(지도) 확인하기

    • 우리의 페이지 테이블: {0→2, 1→0, 2→3}
    • 2번 페이지는 어디로 가야 하죠? 👉 프레임 3으로 가야 합니다.
  • Step 3: 실제 물리 주소 계산하기

    • 프레임 3의 시작 위치는? = 3번 프레임 × 4칸 = 12번 칸
    • 오프셋(떨어진 거리)은 그대로 유지되므로 = 1
    • 최종 물리 주소 = 12 + 1 = 13

결론: 가상 주소 9번은 실제 물리 메모리의 13번 칸에 있습니다!


시각적으로 이해하기


  1. 과거의 문제: 메모리를 통째로 연속해서 쓰다 보니 빈 공간이 낭비되는 외부 단편화 발생.
  2. 해결책 (페이징): 메모리를 4KB 단위의 페이지(가상)프레임(물리)으로 깍둑썰기함.
  3. 매핑 (페이지 테이블): 쪼개진 페이지들을 물리 메모리의 빈 프레임 아무 곳에나 흩뿌려 넣고, 그 위치를 페이지 테이블에 기록함.
  4. 주소 변환: 가상 주소가 들어오면 나눗셈으로 페이지 번호오프셋을 구한 뒤, 페이지 테이블을 보고 실제 물리 주소를 계산해 냄.
profile
시리즈를 기반으로 작성하였습니다.

0개의 댓글