295. 외부 단편화 (External Fragmentation)
핵심 인사이트 (3줄 요약)
- 본질: 외부 단편화 (External Fragmentation)는 가변 크기 연속 할당 방식에서 크기가 제각각인 프로세스들이 메모리에 들어왔다 나갔다를 반복하면서, 메모리 중간중간에 생겨나는 사용 불가능한 미세 빈틈들을 말한다.
- 가치: 전체 빈 공간의 합은 새로운 프로그램을 수용하기에 충분함에도 불구하고, 그 공간들이 불연속적으로 파편화되어 있어 큰 덩어리의 프로세스를 적재하지 못하는 치명적인 메모리 고갈 상태를 유발한다.
- 융합: 이를 해결하기 위해 메모리를 한쪽으로 밀어 빈 공간을 합치는 압축(Compaction) 기법이 있으나 오버헤드가 너무 커서, 현대 OS는 아예 외부 단편화가 발생하지 않는 페이징 (Paging) 기법을 통해 이 문제를 근본적으로 해결했다.
Ⅰ. 개요 및 필요성
-
개념: 총 빈 메모리 공간은 요청을 만족하기에 충분하지만, 조각난 빈 공간들이 너무 작아서 하나의 연속적인 블록으로 할당할 수 없는 현상이다.
-
필요성: 세그멘테이션이나 초창기 연속 할당 시스템에서는 프로그램의 크기만큼만 딱 맞춰서 메모리를 줬다. 문제는 프로그램이 종료되어 나갔을 때 그 자리에 정확히 똑같은 크기의 프로그램이 들어오지 않는다는 점이다. 이 오차가 수만 번 반복되면 메모리는 마치 벌집처럼 구멍이 뚫려, 8GB 램이 꽂혀있는데도 10MB짜리 프로그램을 실행하지 못하는 촌극이 벌어진다.
-
💡 비유: 냉장고에 반찬통 10개를 넣었다 뺐다 하다 보니 중간중간 좁은 빈틈들이 생겼습니다. 빈틈의 부피를 다 합치면 수박 한 통(큰 프로그램)을 넣을 수 있지만, 수박을 쪼개지 않고 통째로 넣어야 하기 때문에 결국 수박을 넣지 못하는 억울한 상황과 같습니다.
-
등장 배경: 1960년대 멀티프로그래밍이 시작되면서 가변 분할 할당 방식의 고질적인 한계로 대두되었다. 이 문제를 해결하지 못하면 하이엔드 컴퓨터라도 자원 낭비가 심각하여 제대로 된 서버 운영이 불가능했다.
┌──────────────────────────────────────────────────────────────┐
│ 외부 단편화(External Fragmentation) 발생 과정 │
├──────────────────────────────────────────────────────────────┤
│ │
│ [ 초기 상태 ] [ 할당 후 ] [ 해제 후 ] │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ │ │ 프로세스 A │ │ 프로세스 A │ │
│ │ │ ├────────────┤ ├────────────┤ │
│ │ Empty │ │ 프로세스 B │ ──▶ │ (빈틈) │ │
│ │ │ ├────────────┤ ├────────────┤ │
│ │ │ │ 프로세스 C │ │ 프로세스 C │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │
│ * 문제: 빈틈의 크기가 5MB이고 끝단 빈 공간이 5MB일 때, │
│ 총 10MB는 비어있지만 7MB짜리 D는 들어갈 자리가 없음! │
└──────────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: 주차장에 경차와 대형차가 제멋대로 주차했다가 빠져나가기를 반복하면, 중간중간 좁은 칸들만 남아서 정작 커다란 버스가 들어올 자리가 없는 난장판 주차장이 되는 현상입니다.
Ⅱ. 아키텍처 및 핵심 원리
가변 분할 방식의 할당 전략 (Placement Algorithms)
외부 단편화를 조금이라도 줄여보려고 아키텍트들이 고안한 필사적인 전략들이다.
- 최초 적합 (First-Fit): 메모리 처음부터 뒤지다가 들어갈 만한 첫 번째 빈칸에 바로 넣는다. 가장 빠르지만 작은 조각들을 많이 남긴다.
- 최적 적합 (Best-Fit): 전체 빈칸 중 가장 크기가 딱 맞는(남는 공간이 제일 적은) 칸을 골라 넣는다. 공간은 아끼지만, 아주 쓸모없는 '미세 구멍'들을 양산한다.
- 최악 적합 (Worst-Fit): 가장 큰 빈칸에 넣는다. 남는 공간이 넉넉해서 나중에 다른 프로그램이 들어오기 좋게 만들려는 의도지만, 큰 구멍을 빨리 소진시킨다.
해결책 1: 압축 (Compaction)
메모리에 흩어진 사용 중인 블록들을 한쪽으로 싹 밀어버리고, 빈 조각들을 하나로 합쳐 거대한 빈 공간을 만드는 '대청소' 작업이다.
- 치명적 단점: 압축하는 동안 CPU는 아무 일도 못 하고 데이터 이동만 해야 하며, 모든 주소 정보를 업데이트해야 하므로 엄청난 오버헤드가 발생한다.
해결책 2: 페이징 (Paging)
이것이 진정한 해답이다. "수박을 통째로 못 넣으면, 깍두기 모양으로 썰어서 빈틈마다 채워 넣자!"는 발상의 전환이다. 모든 할당 단위를 고정 크기(4KB)로 통일함으로써 외부 단편화 자체를 물리적으로 소멸시켰다.
- 📢 섹션 요약 비유: 책상 위가 지저분할 때 모니터와 책들을 한쪽으로 낑낑대며 미는 것이 압축(Compaction)이라면, 아예 모든 물건을 똑같은 크기의 상자(Paging)에 담아 빈 서랍 칸마다 쏙쏙 집어넣는 것이 현대식 정리법입니다.
Ⅲ. 비교 및 연결
외부 단편화 vs 내부 단편화
| 비교 항목 | 외부 단편화 (External) | 내부 단편화 (Internal) |
|---|---|---|
| 발생 원인 | 가변 크기 할당 (연속 할당) | 고정 크기 할당 (페이징) |
| 낭비 위치 | 할당된 블록들 사이의 빈틈 | 할당된 블록 내부의 빈틈 |
| 심각성 | 매우 높음 (할당 실패 유발) | 낮음 (미세한 공간 낭비) |
| 해결 방법 | 페이징 도입, 압축 | 페이지 크기 최적화 |
세그멘테이션과 외부 단편화의 악연
세그멘테이션은 프로그램의 논리적 단위를 보존하기 위해 가변 크기 할당을 택했다. 그 대가로 외부 단편화라는 고질병을 앓게 되었고, 결국 순수 세그멘테이션 아키텍처가 페이징에게 왕좌를 내어주게 된 결정적인 이유가 되었다.
- 📢 섹션 요약 비유: 세그멘테이션은 옷 사이즈를 S, M, L, XL로 다양하게 준비해줬더니 재고가 꼬여서 가게 망하는 꼴이고, 페이징은 무조건 '프리사이즈' 티셔츠 하나만 팔아서 재고 관리 대박 난 동대문 옷가게와 같습니다.
Ⅳ. 실무 적용 및 기술사 판단
실무 시나리오
-
Linux 커널의 슬랩 할당자 (Slab Allocator) 활용 커널 내부에서 아주 작은 객체(수십 바이트)를 수만 번 할당하고 해제할 때 발생하는 외부 단편화 방지. 커널은 물리 메모리를 4KB 페이지 단위로 받지만, 그 내부에서 동일한 크기의 객체들을 미리 묶어서 관리하는 Slab 할당자를 쓴다. 객체가 빠진 자리에 똑같은 크기의 객체만 다시 들어오게 강제함으로써, 커널 내부 메모리 구멍이 숭숭 뚫리는 것을 하드웨어 수준에서 방어한다.
-
C++ 게임 엔진의 메모리 풀 (Memory Pool) 설계 수천 발의 총알 객체가 매 프레임 생성되고 사라지는 상황. 표준
malloc/free를 쓰면 힙 메모리에 외부 단편화가 심해져 나중에 큰 텍스처를 로드할 때 메모리 부족으로 튕길 수 있다. 개발자는 미리 큰 배열을 할당받아놓고 그 안에서 총알을 돌려쓰는 메모리 풀을 직접 구현하여 외부 단편화의 저주를 소프트웨어 레벨에서 사전에 차단해야 한다.
도입 체크리스트
- 기술적: 시스템이 24시간 365일 돌아가는가? (그렇다면 단편화가 누적되는 가변 할당은 위험)
- 성능적: 메모리 압축(Compaction)이 일어날 때 시스템 레이턴시 스파이크를 감당할 수 있는 서비스인가?
안티패턴
-
조각 모음 (Defragmentation)의 오해: SSD 스토리지의 단편화와 RAM의 외부 단편화는 완전히 다른 문제다. SSD 조각 모음은 수명을 깎는 짓이지만, RAM의 외부 단편화는 페이징으로 해결되지 않는 한 시스템을 재부팅(압축의 극단적 형태)하지 않으면 치유되지 않는 불치병에 가깝다.
-
📢 섹션 요약 비유: 주차장에 빈자리가 많은데도 내 차를 못 대는 상황이 반복되면 주차장 주인을 욕하기 전에, 선을 무시하고 주차한 앞 차들(가변 할당)의 무질서를 먼저 탓해야 합니다.
Ⅴ. 기대효과 및 결론
정량/정성 기대효과
| 구분 | 효과 | 설명 |
|---|---|---|
| 자원 가용성 | 메모리 활용도 100% | 연속 공간이 없어도 흩어진 프레임을 모아 쓰기 가능 |
| 시스템 신뢰성 | 재부팅 주기 연장 | 단편화 누적으로 인한 OOM 크래시 방지 |
| 단순성 | 할당 알고리즘 단순화 | 빈칸 크기 비교할 필요 없이 빈 프레임만 찾으면 끝 |
미래 전망
- 비정형 메모리 할당의 지능화: AI가 프로세스의 생존 주기를 예측하여, 곧 나갈 놈과 오래 있을 놈을 구분해 메모리를 배치함으로써 단편화를 물리적으로 억제하는 기술이 연구되고 있다.
- 보안과 단편화: ASLR(주소 공간 무작위 배치)은 보안을 위해 의도적으로 단편화를 유발하는 측면이 있다. 미래에는 보안과 공간 효율 사이의 접점을 찾는 정교한 알고리즘이 시스템의 핵심이 될 것이다.
결론
외부 단편화는 "연속된 덩어리"를 고집했던 초기 컴퓨터 설계의 거대한 장애물이었다. 이 병목을 뚫기 위해 인류는 '페이징'이라는 위대한 타협안을 찾아냈고, 비로소 물리적 실체에 얽매이지 않는 자유로운 가상 메모리 시대를 열 수 있었다. 외부 단편화에 대한 이해는 우리가 왜 데이터를 쪼개서 관리해야 하는지, 왜 규격화가 효율의 시작인지를 알려주는 가장 기초적인 아키텍처 수업이다.
- 📢 섹션 요약 비유: 외부 단편화는 블록 놀이를 할 때 큰 블록과 작은 블록을 섞어 쓰다가 중간에 빈틈이 숭숭 생기는 현상입니다. 이 빈틈들을 다 합치면 엄청 큰데, 하나로 이어져 있지 않아서 제일 큰 대왕 블록을 못 꽂게 되죠. 이 문제를 해결하려고 책상을 엎는(압축) 대신, 처음부터 똑같은 크기의 작은 레고 블록(페이징)만 쓰는 지혜를 발휘한 것입니다.
📌 관련 개념 맵
| 개념 명칭 | 관계 및 시너지 설명 |
|---|---|
| 연속 할당 | 프로세스를 메모리에 통째로 넣는 방식으로, 외부 단편화의 근본 원인. |
| 세그멘테이션 | 의미 단위로 쪼개지만 여전히 가변 크기라 외부 단편화에서 벗어나지 못한 비운의 기법. |
| 페이징 | 모든 할당 단위를 고정 크기로 통일하여 외부 단편화를 영원히 퇴출시킨 구세주. |
| 압축 | 메모리 구멍을 메우기 위해 모든 데이터를 한쪽으로 미는 무겁고 원시적인 해결책. |
| 슬랩 할당자 | 커널 내부에서 비슷한 크기의 객체끼리 모아 관리하여 미세한 단편화를 막는 정밀 장치. |
👶 어린이를 위한 3줄 비유 설명
- 외부 단편화는 큰 책상과 작은 책상을 섞어서 교실을 채우다 보니, 중간중간 좁은 빈틈들만 남아서 큰 책상이 들어올 자리가 없는 상태예요.
- 빈틈을 다 합하면 엄청 넓은데, 다 따로따로 떨어져 있어서 쓸 수가 없는 거죠.
- 이걸 해결하려고 책상을 낑낑대며 밀어서 합치는 것보다, 아예 모든 책상을 똑같은 1인용 작은 책상(페이징)으로 바꿔버리는 게 훨씬 똑똑한 방법이랍니다!