스왑 아웃 (Swap Out) / 스왑 인 (Swap In)
핵심 인사이트 (3줄 요약)
- 본질: 스왑 아웃(Swap Out)은 현재 당장 실행되지 않는 프로세스(또는 페이지)를 주 메모리(RAM)에서 하드디스크(Backing Store)로 쫓아내는 작업이며, 스왑 인(Swap In)은 다시 실행될 차례가 되었을 때 디스크에서 메모리로 불러오는 왕복 이동 작업이다.
- 가치: 실제 장착된 물리적 메모리의 용량보다 훨씬 많은 수의 프로그램을 동시에 실행할 수 있게 해주는 다중 프로그래밍(Multiprogramming)의 핵심 기반 기술로, '메모리 확장'의 착각을 만들어낸다.
- 융합: 과거에는 프로세스 전체를 통째로 옮기는 표준 스와핑(Standard Swapping)이었으나, 현대 운영체제에서는 디스크 I/O 병목을 피하기 위해 페이징(Paging) 기법과 융합하여 4KB 단위의 세밀한 '페이지 스와핑'으로 진화했다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: 스와핑(Swapping)은 시스템의 물리적 메모리 용량 한계를 극복하기 위해, 프로세스나 메모리 블록을 디스크의 특별한 공간(스왑 영역)과 메인 메모리 사이에서 교환하는 메커니즘이다. 이때 메모리에서 디스크로 가는 방향을 스왑 아웃(Swap Out), 디스크에서 메모리로 오는 방향을 스왑 인(Swap In)이라고 부른다.
-
필요성: CPU는 오직 메인 메모리에 적재된 코드와 데이터만 실행할 수 있다. 16GB 메모리를 가진 컴퓨터에서 10GB짜리 게임 2개를 켜면 메모리가 부족해 시스템이 멈춰야 정상이다. 하지만 OS는 지금 당장 렌더링에 필요 없는 화면 밖의 텍스처나 안 쓰는 백그라운드 크롬 탭을 디스크로 '스왑 아웃'시켜 메모리에 빈 공간을 확보함으로써, 시스템 붕괴를 막고 사용자가 여러 작업을 무한히 띄워놓을 수 있게 해준다.
-
💡 비유: 스와핑은 **도서관 열람실의 책상(메인 메모리)**과 지하 서고(스왑 디스크) 사이의 책 이동과 같다. 책상에 5권밖에 못 올리지만 10권을 봐야 한다면, 지금 안 보는 책은 지하 서고로 내리고(Swap Out), 필요한 책을 지하에서 꺼내오는(Swap In) 과정을 반복하는 것이다.
-
등장 배경 및 병목의 발견:
- 배치 처리의 한계: 초기 컴퓨터는 한 번에 하나의 프로그램만 메모리에 올려 실행했다(메모리보다 큰 프로그램은 오버레이로 해결).
- 다중 프로그래밍의 등장: 여러 사용자가 동시에 접속하는 시분할 시스템(Time-sharing)이 등장하며, 대기 상태에 빠진 프로세스들이 귀한 메모리를 점유하고 있는 것이 심각한 자원 낭비로 인식되었다.
- 디스크 I/O 오버헤드: 스와핑이 도입되었으나, 디스크는 메모리보다 수십만 배 느리다. 100MB짜리 프로세스 전체를 스왑 아웃/인 하는 데 수 초가 걸려 시스템이 멈칫하는 'Stuttering(렉)' 현상이 새로운 과제로 떠올랐다.
┌──────────────────────────────────────────────────────────────────┐
│ 스왑 아웃 (Swap Out) & 스왑 인 (Swap In)의 기본 동작 │
├──────────────────────────────────────────────────────────────────┤
│ │
│ [ 메인 메모리 (RAM) ] [ 백킹 스토어 (Disk) ] │
│ │
│ ┌───────────────┐ 1. 스왑 아웃 (Swap Out) ┌───────────────┐│
│ │ 프로세스 A (대기)├───────────────────────▶│ 프로세스 A 보관 │ │
│ │ (100MB) │ (메모리 공간 확보!) │ (100MB) │ │
│ └───────────────┘ └───────────────┘ │
│ │
│ ┌───────────────┐ 2. 스왑 인 (Swap In) ┌───────────────┐ │
│ │ 프로세스 B (실행)│◀───────────────────────┤ 프로세스 B 보관 │ │
│ │ (100MB) │ (CPU 할당받아 실행 준비) │ (100MB) │ │
│ └───────────────┘ └───────────────┘ │
└──────────────────────────────────────────────────────────────────┘
[다이어그램 해설] 중기 스케줄러(Medium-term Scheduler)가 이 흐름을 관장한다. 메모리가 꽉 찬 상태에서 새로운 프로세스를 실행해야 할 때, OS는 가장 오랫동안 CPU를 쓰지 않았거나(Sleep 상태), 우선순위가 낮은 프로세스 A를 디스크로 내쫓는다. 이 과정(Swap Out)을 통해 생긴 빈자리에, 예전에 디스크로 쫓겨났지만 이제 다시 실행할 준비가 된 프로세스 B를 적재(Swap In)한다.
- 📢 섹션 요약 비유: 작은 주방(메모리)에서 여러 가지 요리를 동시에 할 때, 지금 당장 안 쓰는 프라이팬을 베란다(디스크)로 내다 놓고(스왑 아웃), 도마를 가져와서(스왑 인) 공간을 확보하는 요리사의 동선 정리와 같습니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
구성 요소
| 요소명 | 역할 | 내부 동작 | 관련 기술 | 비유 |
|---|---|---|---|---|
| 중기 스케줄러 (Swapper) | 스와핑의 의사결정 주체 | 어떤 프로세스를 쫓아낼지(Swap Out) 결정 | Medium-term Scheduler | 클럽 입구의 기도 (수용 인원 관리) |
| 스왑 공간 (Backing Store) | 쫓겨난 데이터를 저장하는 디스크 영역 | 일반 파일 시스템과 분리된 고속 I/O 블록 공간 | Swap Partition, pagefile.sys | 클럽 밖의 임시 대기 줄 |
| 디스패처 (Dispatcher) | CPU 제어권 할당 | 스왑 인이 완료된 프로세스의 문맥(Context)을 복원 | Context Switching | 클럽 안으로 손님을 안내하는 직원 |
| MMU (Memory-Management Unit) | 메모리 주소 재배치 지원 | 스왑 인될 때 이전과 다른 주소에 적재되어도 정상 실행되게 변환 | 베이스/한계 레지스터 | 손님이 예전 자리가 아닌 새 자리에 앉아도 되게 하는 명찰 |
스왑 인(Swap In) 시의 동적 재배치(Dynamic Relocation) 필수성
과거의 스와핑은 치명적인 제약이 있었다. 디스크로 스왑 아웃된 프로세스가 다시 메모리로 스왑 인될 때, 반드시 예전에 있던 그 물리 주소 위치로 돌아와야만 했다(정적 재배치 환경). 하지만 현대의 스와핑은 MMU와 베이스 레지스터의 도움으로 메모리 안의 **어떤 빈 공간(Any Available Space)**으로든 들어갈 수 있다.
┌─────────────────────────────────────────────────────────────────────────┐
│ 스왑 아웃/인 과정에서의 물리 주소 동적 재배치 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ [ 1. 최초 적재 시 ] │
│ 물리 주소 1000번지: [프로세스 P1] (Base Register = 1000) │
│ │
│ [ 2. Swap Out ] │
│ 프로세스 P1 ──▶ 백킹 스토어(디스크)로 쫓겨남. 1000번지는 다른 앱이 씀 │
│ │
│ [ 3. Swap In ] │
│ 백킹 스토어 ──▶ 메모리에 남은 빈 공간 '5000번지'로 적재! │
│ (OS가 Base Register 값을 5000으로 자동 수정) │
│ │
│ [ 결과 ] 프로세스 P1은 자신이 위치가 바뀐 줄 모르고 0번지부터 정상 실행!│
└─────────────────────────────────────────────────────────────────────────┘
[다이어그램 해설] 만약 동적 재배치 하드웨어(MMU)가 없다면, 스왑 인을 하기 위해 예전 주소(1000번지)가 빌 때까지 하염없이 기다려야 하므로 시스템 효율이 바닥을 친다. 실행 시간 바인딩(Execution Time Binding)과 베이스 레지스터 덕분에, 운영체제는 디스크에서 올라오는 프로세스를 테트리스처럼 빈 공간 아무 데나 끼워 넣고 레지스터 값만 쓱 바꿔치기하여 완벽한 착시를 만들어낸다.
스와핑과 디스크 I/O 병목
스왑 아웃/인의 가장 큰 적은 '시간'이다.
-
디스크의 데이터 전송 속도(Transfer Rate)는 RAM에 비해 처참하게 느리다.
-
프로세스의 크기가 1GB이고, 디스크 전송 속도가 100MB/s라면, Swap Out에 10초, Swap In에 10초가 걸린다.
-
이 20초 동안 해당 프로세스는 완벽하게 멈춘 상태(Stun)가 되며, 이는 사용자 경험(UX)에 치명적이다.
-
📢 섹션 요약 비유: 이사(스왑)를 할 때마다 가구를 통째로 트럭에 싣고 내리는 시간이 너무 오래 걸려서, 그동안 집에서는 아무런 생활도 할 수 없는 '이사 지연 현상'이 스와핑의 최대 딜레마입니다.
Ⅲ. 융합 비교 및 다각도 분석
비교 1: 스와핑(Swapping) vs 문맥 교환(Context Switching)
둘 다 프로세스의 상태를 멈추고 보관하지만, 스케일과 목적이 다르다.
| 비교 항목 | 문맥 교환 (Context Switching) | 스와핑 (Swapping) |
|---|---|---|
| 저장 위치 | CPU 레지스터 값을 메모리(PCB)에 보관 | 메모리의 코드/데이터를 하드디스크에 보관 |
| 발생 주기 | 수 밀리초(ms) 단위로 매우 빈번함 | 메모리가 고갈될 때만 제한적으로 발생 |
| 소요 시간 | 나노초~마이크로초 수준 (극도로 빠름) | 밀리초~초 단위 (극도로 느림, 시스템 병목 유발) |
| 관여 스케줄러 | 단기 스케줄러 (Short-term) | 중기 스케줄러 (Medium-term) |
비교 2: I/O 대기 중인 프로세스의 스왑 아웃 딜레마
문제: 키보드 입력을 기다리고 있는 프로세스를 메모리 확보를 위해 스왑 아웃시켰다. 이때 DMA(Direct Memory Access) 장치가 입력을 받아 프로세스의 메모리 공간에 데이터를 쏘아주려는데, 해당 프로세스는 이미 디스크로 쫓겨나고 그 자리에 다른 프로그램이 들어와 있다면? 다른 프로그램의 데이터가 파괴된다.
해결책:
- Never Swap Out: I/O 작업이 진행 중인 프로세스는 절대 스왑 아웃시키지 않음 (메모리 낭비 발생).
- OS 커널 버퍼 사용: 입출력 장치는 무조건 OS 커널의 메모리 공간(커널은 절대 스왑 아웃되지 않음)으로만 데이터를 쏘게 하고, 프로세스가 스왑 인되어 돌아오면 커널 버퍼에서 프로세스 공간으로 데이터를 복사해주는 기법(Double Buffering)을 사용한다. (현대 OS의 표준)
┌──────────┬────────────┬────────────┬────────────────────────────────┐
│ I/O 도착 시│ 스왑 아웃 상태│ 데이터 기록 위치│ 시스템 안정성 │
├──────────┼────────────┼────────────┼────────────────────────────────┤
│ 직접 기록 │ 타 앱이 점유 중│ 타 앱 메모리 파괴│ 붕괴 (Kernel Panic)│
│ 커널 버퍼링│ 타 앱이 점유 중│ 안전한 OS 커널 │ 완벽함 (데이터 보존)│
└──────────┴────────────┴────────────┴────────────────────────────────┘
[매트릭스 해설] 스와핑은 단순히 데이터를 옮기는 것을 넘어 입출력(I/O) 서브시스템과 매우 복잡하게 얽혀있다. 하드웨어(DMA)는 논리 주소를 모르고 물리 주소로만 쏘기 때문에, 스와핑으로 인해 메모리의 주인이 바뀐 사실을 인지하지 못한다. 이를 방어하기 위해 현대 운영체제는 커널 공간이라는 든든한 '버퍼(방파제)'를 두어 스와핑의 부작용을 원천 차단한다.
- 📢 섹션 요약 비유: 택배를 시킨 사람이 잠시 외출(스왑 아웃)했을 때, 택배 기사가 빈집에 물건을 던져놓고 가면 다음 세입자의 물건과 섞여 분실되므로, 아파트 경비실(OS 커널 버퍼)에서 안전하게 대신 맡아주는 것과 같습니다.
Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)
실무 시나리오: 메모리 누수와 OOM(Out of Memory) 킬러
- 상황: 리눅스 서버에서 자바(Spring) 애플리케이션이 메모리 누수(Memory Leak)를 일으켜 물리 RAM 32GB를 모두 소진했다.
- 스와핑의 개입:
- 시스템은 죽지 않기 위해 안 쓰는 데이터들을 미친 듯이 스왑 파티션(디스크)으로 밀어낸다(Swap Out).
- 하드디스크의 I/O 램프가 불타듯이 깜빡이며(Thrashing 현상), 서버에 SSH 접속조차 1분이 넘게 걸릴 정도로 시스템이 마비된다.
- 의사결정 플로우:
- 실무 환경(특히 쿠버네티스/도커)에서는 이 치명적인 디스크 I/O 병목으로 인한 '좀비 서버' 상태를 막기 위해, 아예 서버의 스왑(Swap) 기능을 강제로 꺼버린다(Disable).
- 스왑이 꺼진 상태에서 메모리가 꽉 차면, 리눅스 커널의 OOM(Out of Memory) Killer가 즉시 가장 메모리를 많이 먹는 범인 프로세스를 찾아 강제 종료(Kill)시킨다.
- 서버가 느려터진 상태로 버티는 것(스와핑)보다, 차라리 빨리 죽고 재시작(Fail-fast)하는 것이 MSA 환경에서는 훨씬 이득이기 때문이다.
모바일 환경 (Android / iOS) 에서의 스와핑
-
모바일 기기의 저장장치(플래시 메모리, eMMC/UFS)는 쓰기(Write) 횟수에 수명 제한이 있다. 잦은 스왑 아웃은 스마트폰 저장소의 수명을 급격히 갉아먹는다.
-
따라서 iOS나 안드로이드는 전통적인 스왑을 쓰지 않고, 배경으로 간 앱을 압축해서 메모리 내에 보관하거나(zRAM), 아예 앱을 죽여버리고(Kill) 나중에 다시 켤 때 처음부터 재부팅시키는 공격적인 메모리 관리를 채택했다.
-
📢 섹션 요약 비유: 산소마스크(스와핑)를 씌워 뇌사 상태로 식물인간처럼 서버를 살려두느니, 차라리 심폐소생술(OOM 킬러 강제 종료)을 포기하고 새로운 복제 인간(오토 스케일링)을 깨우는 것이 현대 클라우드의 생존 방식입니다.
Ⅴ. 기대효과 및 결론 (Future & Standard)
정량/정성 기대효과
| 구분 | 내용 |
|---|---|
| 가용 다중 프로그래밍 한계 돌파 | 16GB 물리 메모리로 100GB 규모의 여러 프로세스를 띄우는 메모리 가상화의 기반 제공 |
| 유휴 자원 회수 | Sleep 상태나 대기 상태인 앱이 점유한 메모리를 강제 환수하여 활성 앱에 몰아줌 (성능 최적화) |
| 시스템 크래시 유예 | 메모리가 100% 찼을 때 시스템이 즉각 멈추지 않고 버퍼링할 수 있는 최후의 생명연장 장치 |
결론 및 미래 전망
스왑 아웃(Swap Out)과 스왑 인(Swap In)은 물리 메모리의 절대적 부족을 디스크의 광활한 용량으로 메꾸려는 인류의 눈물겨운 꼼수이자 혁신이었다. 과거 덩어리째 옮기던 비효율적인 '표준 스와핑'은 오늘날 4KB 단위로 잘게 쪼개어 옮기는 '요구 페이징(Demand Paging)' 시스템으로 완전히 진화하여 디스크 병목을 극적으로 줄였다. 앞으로 NVMe SSD와 CXL 인터페이스 등 저장장치의 속도가 RAM의 속도를 턱밑까지 추격함에 따라, 스와핑 I/O 오버헤드는 점차 체감하기 어려워질 것이며, 디스크와 메모리의 경계가 허물어지는 스토리지 클래스 메모리(SCM) 아키텍처로 나아가는 과도기적 기술로 역사에 기록될 것이다.
- 📢 섹션 요약 비유: 주머니(메모리)가 작아서 지폐 몇 장밖에 못 넣을 때, 커다란 배낭(디스크)에 돈을 보관해두고 필요할 때마다 꺼내 쓰는 지혜로운 자산 관리의 근본 원리입니다.
📌 관련 개념 맵 (Knowledge Graph)
- 문맥 교환 (Context Switch) | 스왑 과정 전후에 CPU 레지스터 상태를 백업하고 복구하는 단기 스케줄링 작업
- 요구 페이징 (Demand Paging) | 프로세스 전체를 스왑하지 않고, 꼭 필요한 4KB 페이지 단위로만 스왑 인/아웃 하는 현대적 기법
- 중기 스케줄러 (Medium-term Scheduler) | 메모리 부족 시 어떤 프로세스를 스왑 아웃시킬지 결정하는 커널 모듈
- OOM Killer (Out Of Memory Killer) | 스왑 공간마저 꽉 찼을 때 시스템 붕괴를 막기 위해 프로세스를 강제 사살하는 리눅스의 방어 기제
- 스레싱 (Thrashing) | 스왑 아웃과 스왑 인이 너무 빈번하게 발생하여 CPU가 연산은 못하고 디스크 I/O만 하느라 시스템이 멈추는 현상
👶 어린이를 위한 3줄 비유 설명
- 스왑 아웃/스왑 인이 무엇인가요? 책상(메모리)이 좁아서 지금 안 가지고 노는 로봇 장난감을 잠시 서랍장(디스크)에 치워두는 게 '스왑 아웃'이고, 다시 놀고 싶을 때 꺼내오는 게 '스왑 인'이에요.
- 왜 그렇게 하나요? 책상 위에 모든 장난감을 다 올려놓으면 책상이 꽉 차서 그림 그릴 공간이 없어지잖아요. 치워둬야 새로운 놀이를 할 수 있어요.
- 어떤 효과가 있나요? 작은 책상 하나만 있어도 서랍장을 왔다 갔다 하면서 세상에 있는 수천 개의 장난감을 모두 가지고 놀 수 있는 마법 같은 효과가 생깁니다.