프로그램(예: 게임, 카카오톡)이 실행되려면 반드시 하드디스크에서 물리 메모리(RAM)로 올라와야 합니다. 이를 '프로세스가 메모리에 적재되었다'고 표현합니다. 메모리의 공간은 한정되어 있기 때문에, 이 공간을 어떻게 효율적으로 나눠 쓸 것인가가 운영체제의 최대 고민입니다.
질문해주신 내용 중 "외부 단편화 제거"라는 말이 있었죠? 페이징을 이해하려면 이 '외부 단편화'가 무엇인지 뼈저리게 느껴야 합니다.
과거의 운영체제는 아주 단순했습니다. 프로그램이 실행되면, 프로그램 전체를 메모리의 빈 공간에 '통째로(연속적으로)' 집어넣었습니다.
프로그램들이 켜지고 꺼지기를 반복하다 보면, 메모리 중간중간에 '빈 공간(Hole)'들이 생겨납니다.
외부 단편화란, "남은 메모리 공간을 다 합치면 충분히 큰데, 공간이 조각조각 흩어져 있어서 새로운 프로그램을 실행하지 못하는 현상"을 말합니다.
선생님이 아주 쉬운 예시를 가져왔습니다.
100MB20MB (항상 0~20MB 구간을 차지한다고 가정)80MB[상황 1] 프로그램 A, B, C가 순서대로 실행됩니다.
현재 메모리 상태는 다음과 같습니다. (연속적으로 차곡차곡 쌓입니다)
0~20MB: OS20~50MB: 프로그램 A (30MB)50~70MB: 프로그램 B (20MB)70~80MB: 프로그램 C (10MB)80~100MB: 빈 공간 (20MB)[상황 2] 프로그램 B가 종료되었습니다.
프로그램 B가 메모리에서 빠져나가면서 중간에 구멍(Hole)이 생깁니다.
0~20MB: OS20~50MB: 프로그램 A (30MB)50~70MB: 빈 공간 (20MB) 👈 구멍 발생!70~80MB: 프로그램 C (10MB)80~100MB: 빈 공간 (20MB)[상황 3] 새로운 프로그램 D (크기: 30MB)를 실행하려고 합니다.
자, 여기서 문제가 발생합니다!
50~70MB 구간(20MB) + 80~100MB 구간(20MB) = 총 40MB이것이 바로 외부 단편화(External Fragmentation)입니다. 메모리가 낭비되는 아주 끔찍한 상황이죠.


컴퓨터는 "프로그램을 무조건 통째로, 연속해서 넣어야 한다"(연속 할당 방식)는 규칙 때문에, 빈 공간이 충분함에도 불구하고 프로그램을 실행하지 못하는 외부 단편화라는 심각한 병에 걸려 있었습니다.
이 병을 치료하기 위해 천재적인 컴퓨터 공학자들이 모여서 낸 아이디어가 바로 질문해주신 "가상 메모리(Virtual Memory)"와 "페이징(Paging)"입니다.
"프로그램을 꼭 통째로 연속해서 넣어야 해? 일정한 크기로 잘게 쪼개서(Paging), 빈 공간 아무 데나 흩뿌려 넣고, 프로세스한테는 연속된 것처럼 거짓말(Virtual Memory)을 치면 되잖아!"
가상 메모리는 운영체제가 프로세스(실행 중인 프로그램)에게 제공하는 '거대한 가짜 메모리 공간'입니다.
프로세스에게 "너 혼자 이 넓은 메모리를 다 쓰고 있고, 네 데이터는 아주 예쁘게 연속적으로 저장되어 있어!"라고 완벽한 거짓말(추상화)을 하는 기술입니다.
가상 메모리라는 '거짓말'을 현실로 만들어주는 핵심 기술이 바로 페이징입니다.
메모리를 통째로 할당하지 않고, 아주 작은 '고정된 크기'로 똑같이 깍둑썰기를 하는 방식입니다.
이때 두 가지 중요한 용어가 등장합니다. (반드시 기억하세요!)
프로세스 P1은 자신의 데이터가 '페이지 0 -> 1 -> 2' 순서로 연속해 있다고 믿습니다. 하지만 실제 물리 메모리에는 빈 공간에 마구잡이로 흩어져 있죠.
이 가짜 주소(페이지)와 진짜 주소(프레임)를 연결해 주는 지도(Map)가 바로 페이지 테이블입니다.
질문자님의 예시 데이터를 보면 지도는 다음과 같습니다.
Page Table = {0 → 2, 1 → 0, 2 → 3}

오프셋은 영어로 '떨어진 거리'를 의미합니다. 컴퓨터 공학에서는 "해당 페이지(또는 프레임)의 시작점으로부터 몇 칸이나 떨어져 있는가?"를 나타냅니다.
쉽게 아파트 주소로 비유
가상 메모리(101동)가 물리 메모리(105동)로 이사를 가더라도, 방의 구조와 크기(페이지 크기 = 프레임 크기)가 똑같기 때문에 '302호'라는 호수(오프셋)는 절대 변하지 않습니다. 이것이 페이징 주소 변환의 핵심입니다
컴퓨터는 가상 주소(숫자) 하나만 딱 주어지면, 아래의 간단한 산수(나눗셈과 나머지)를 통해 위치를 찾아냅니다.
(우리의 예시에서 페이지 크기는 4칸입니다.)
가상 주소 // 페이지 크기 (몫)가상 주소 % 페이지 크기 (나머지)(물리 프레임 번호 × 프레임 크기) + 오프셋목표: 프로세스가 "가상 주소 5번 칸에 있는 데이터 가져와!"라고 명령했습니다. 실제 물리 메모리의 몇 번 칸으로 가야 할까요?
Step 1: 가상 주소 분리하기 (페이지 번호와 오프셋 구하기)
541 (몫) 👉 "아하, 1번 페이지구나!"1 (나머지) 👉 "1번 페이지의 시작점으로부터 1칸 떨어져 있구나!"Step 2: 페이지 테이블(지도) 확인하기
{0→2, 1→0, 2→3}프레임 0으로 가야 합니다.Step 3: 실제 물리 주소 계산하기
0번 칸11결론: 가상 주소 5번은 실제 물리 메모리의 1번 칸에 있습니다!
목표: 프로세스가 "가상 주소 9번 칸에 있는 데이터 가져와!"라고 명령했습니다.
Step 1: 가상 주소 분리하기
942 (몫) 👉 "2번 페이지구나!"1 (나머지) 👉 "2번 페이지의 시작점으로부터 1칸 떨어져 있구나!"Step 2: 페이지 테이블(지도) 확인하기
{0→2, 1→0, 2→3}프레임 3으로 가야 합니다.Step 3: 실제 물리 주소 계산하기
12번 칸113결론: 가상 주소 9번은 실제 물리 메모리의 13번 칸에 있습니다!

