스와핑 (Swapping)
핵심 인사이트 (3줄 요약)
- 본질: 스와핑 (Swapping)은 메모리 부족 시 실행 중인 프로세스 전체(또는 페이지 단위)를 디스크의 백킹 스토어 (Backing Store)로 이동시켜 메모리를 확보하는 OS 메모리 관리 기법이다.
- 가치: 스와핑은 물리 메모리를 초과하는 총 프로세스 메모리를 실행 가능하게 하는 다중 프로그래밍 (Multiprogramming)의 핵심 메커니즘으로, 물리 메모리 한계를 SW적으로 초월한다.
- 융합: 현대 OS는 전체 프로세스 스와핑 대신 **페이지 단위 스와핑 (Paging-based Swapping)**을 사용하며, 스왑 공간, 스왑 데몬 (kswapd), OOM Killer와 연동하여 메모리 압박을 자동으로 관리한다.
Ⅰ. 개요 및 필요성
물리 메모리 (DRAM) 크기는 유한하다. 동시에 실행되는 프로세스들의 총 메모리 요구량이 물리 메모리를 초과하면, OS는 일부 프로세스를 디스크로 내보내야 한다.
💡 비유: 작은 책상(RAM)에 올려둔 책(프로세스)들이 너무 많으면, 지금 안 보는 책은 서랍(디스크 스왑 영역)에 잠시 넣는 것.
┌──────────────────────────────────────────────────────────────┐
│ 스와핑 동작 흐름 │
├──────────────────────────────────────────────────────────────┤
│ │
│ [메모리 부족 감지] │
│ │ │
│ ▼ │
│ [스왑 아웃 (Swap Out)] │
│ ● OS가 희생 프로세스(Victim) 선택 │
│ ● 프로세스 메모리 전체를 디스크 스왑 공간으로 복사 │
│ ● 해당 프레임들을 비워 다른 프로세스에 할당 │
│ │
│ [실행 준비된 스왑 아웃 프로세스] │
│ │ │
│ ▼ │
│ [스왑 인 (Swap In)] │
│ ● 스왑 공간에서 프로세스를 메모리로 복원 │
│ ● 주소 바인딩 재수행 (실행 시간 바인딩 필요) │
│ ● CPU 스케줄러가 레디 큐에 배치 │
│ │
│ 스왑 오버헤드 (HDD 기준): │
│ 100MB 프로세스 스왑 아웃: 100MB / 50MB/s = 2초 │
│ 스왑 인: 추가 2초 → 총 4초 오버헤드! │
│ (NVMe SSD: ~200ms로 단축) │
└──────────────────────────────────────────────────────────────┘
📢 섹션 요약 비유: 스와핑은 좁은 주방(RAM)에서 지금 안 쓰는 냄비(프로세스)를 창고(디스크)로 잠시 옮기는 것 — 새 냄비를 올릴 공간이 생기지만, 다시 꺼내오는 데 시간이 걸립니다.
Ⅱ. 아키텍처 및 핵심 원리
표준 스와핑 vs 페이징 기반 스와핑
| 항목 | 표준 스와핑 (전체 프로세스) | 페이징 기반 스와핑 (현대) |
|---|---|---|
| 단위 | 전체 프로세스 | 페이지 (4KB) |
| I/O 크기 | 수십~수백MB | 최소 4KB |
| 오버헤드 | 매우 큼 | 작음 |
| 유연성 | 낮음 | 높음 (워킹 셋 유지) |
| 현대 OS | 거의 사용 안 함 | 기본 사용 |
Linux kswapd 데몬 동작
┌──────────────────────────────────────────────────────────────┐
│ Linux 메모리 회수 흐름 (kswapd + OOM Killer) │
├──────────────────────────────────────────────────────────────┤
│ │
│ 메모리 사용량 임계값: │
│ ● min / low / high 워터마크 │
│ │
│ [high 이상]: 정상 운영 │
│ [low ~ high]: kswapd 백그라운드 회수 시작 │
│ ● 파일 캐시(file-backed) 페이지 먼저 제거 │
│ ● 익명(anonymous) 페이지는 스왑 공간으로 │
│ [min 미만]: 직접 회수 (Synchronous Direct Reclaim) │
│ → 메모리 할당 요청 스레드가 직접 페이지 회수 │
│ → 심각한 레이턴시 유발 │
│ [완전 고갈]: OOM Killer 발동 │
│ → oom_score 기반으로 희생 프로세스 선택 후 SIGKILL │
│ │
│ 명령어: │
│ swapon -s # 스왑 사용 현황 │
│ free -h # RAM·스왑 전체 현황 │
│ vmstat 1 # 스왑 인/아웃 속도 모니터링 │
└──────────────────────────────────────────────────────────────┘
📢 섹션 요약 비유: kswapd는 청소부 — 방(메모리)이 너무 꽉 차기 전에 미리 안 쓰는 물건을 창고(스왑)로 옮겨요. OOM Killer는 창고마저 꽉 찼을 때 가장 큰 짐을 들고 있는 사람(프로세스)에게 나가달라고 하는 보안 요원이에요.
Ⅲ. 융합 비교 및 다각도 분석
스왑 공간 종류
| 종류 | 특성 | 설정 |
|---|---|---|
| 스왑 파티션 | 전용 디스크 파티션, 빠름 | /dev/sda2 swap |
| 스왑 파일 | 일반 파일시스템 파일, 유연 | fallocate + swapon |
| zRAM | RAM을 압축해 스왑 공간으로 | modprobe zram |
| zswap | 압축 후 스왑 파티션으로 | 쓰기 전 압축 캐시 |
zRAM은 Android 스마트폰에서 널리 사용. 실제 디스크 I/O 없이 RAM 내 압축 공간을 스왑으로 사용하여 빠른 스와핑을 지원한다.
📢 섹션 요약 비유: zRAM은 서랍에 진공 압축팩으로 옷을 넣는 것 — 작은 서랍에 더 많은 옷(프로세스)을 넣을 수 있어요.
Ⅳ. 실무 적용 및 기술사적 판단
실무 시나리오:
- SSD 기반 서버: NVMe SSD로 스왑하면 HDD 대비 10~50배 빠름. 단, SSD 수명(TBW) 소모 주의.
- 클라우드 VM 메모리 과도할당: Hypervisor가 VM들의 총 메모리를 물리 메모리보다 많이 할당하고 스와핑으로 관리 (Balloon Driver + Swap).
안티패턴:
- 스왑 없는 서버: OOM 상황에서 즉시 프로세스 종료 위험. 작은 스왑 버퍼(2~4GB)라도 유지 권장.
- 과도한 스와핑 (Thrashing): 프로세스가 실행될 때마다 스왑 인/아웃이 반복되어 CPU가 스와핑에만 95% 소비 → 전체 처리량 급락.
📢 섹션 요약 비유: 스래싱(Thrashing)은 좁은 책상에 책을 계속 서랍에서 꺼내고 넣기를 반복하다 실제 공부는 못 하는 상황 — 이사 자체가 일이 돼버린 비효율입니다.
Ⅴ. 기대효과 및 결론
| 구분 | 스와핑 없음 | 스와핑 적용 |
|---|---|---|
| 다중 프로그래밍 수준 | 물리 메모리에 제한 | 물리 메모리 초과 실행 가능 |
| 메모리 부족 시 | 즉시 OOM/크래시 | 스왑으로 완충 |
| I/O 오버헤드 | 없음 | 스왑 I/O 레이턴시 |
스와핑은 OS의 메모리 초과 할당을 가능하게 하는 필수 메커니즘이다. 현대에는 페이지 단위 스와핑+zRAM으로 오버헤드를 최소화하며, kswapd의 선제적 회수와 OOM Killer의 최후 방어선으로 메모리 관리 안전망을 구성한다.
📌 관련 개념 맵
| 개념 | 관계 |
|---|---|
| 백킹 스토어 (Backing Store) | 스왑 아웃된 데이터를 저장하는 디스크 공간 |
| 요구 페이징 (Demand Paging) | 페이지 단위 스와핑의 발전 형태 |
| kswapd | Linux 커널 스왑 데몬 |
| OOM Killer | 메모리 완전 고갈 시 프로세스 종료 |
| 스래싱 (Thrashing) | 과도한 스와핑으로 처리량이 급감하는 현상 |
👶 어린이를 위한 3줄 비유 설명
- 스와핑은 책상(RAM)이 꽉 찼을 때 안 보는 책(프로세스)을 서랍(디스크)에 잠깐 넣는 것이에요.
- 나중에 그 책이 필요하면 서랍에서 다시 꺼내서 책상 위에 올리는데 — 이게 스왑 인이에요!
- 서랍이 너무 느려서 책 넣었다 꺼냈다만 반복하면 공부(연산)는 하나도 못 해요 — 이를 스래싱이라고 해요!