295. 외부 단편화 (External Fragmentation)

핵심 인사이트 (3줄 요약)

  1. 본질: 외부 단편화 (External Fragmentation)는 가변 크기 연속 할당 방식에서 크기가 제각각인 프로세스들이 메모리에 들어왔다 나갔다를 반복하면서, 메모리 중간중간에 생겨나는 사용 불가능한 미세 빈틈들을 말한다.
  2. 가치: 전체 빈 공간의 합은 새로운 프로그램을 수용하기에 충분함에도 불구하고, 그 공간들이 불연속적으로 파편화되어 있어 큰 덩어리의 프로세스를 적재하지 못하는 치명적인 메모리 고갈 상태를 유발한다.
  3. 융합: 이를 해결하기 위해 메모리를 한쪽으로 밀어 빈 공간을 합치는 압축(Compaction) 기법이 있으나 오버헤드가 너무 커서, 현대 OS는 아예 외부 단편화가 발생하지 않는 페이징 (Paging) 기법을 통해 이 문제를 근본적으로 해결했다.

Ⅰ. 개요 및 필요성

  • 개념: 총 빈 메모리 공간은 요청을 만족하기에 충분하지만, 조각난 빈 공간들이 너무 작아서 하나의 연속적인 블록으로 할당할 수 없는 현상이다.

  • 필요성: 세그멘테이션이나 초창기 연속 할당 시스템에서는 프로그램의 크기만큼만 딱 맞춰서 메모리를 줬다. 문제는 프로그램이 종료되어 나갔을 때 그 자리에 정확히 똑같은 크기의 프로그램이 들어오지 않는다는 점이다. 이 오차가 수만 번 반복되면 메모리는 마치 벌집처럼 구멍이 뚫려, 8GB 램이 꽂혀있는데도 10MB짜리 프로그램을 실행하지 못하는 촌극이 벌어진다.

  • 💡 비유: 냉장고에 반찬통 10개를 넣었다 뺐다 하다 보니 중간중간 좁은 빈틈들이 생겼습니다. 빈틈의 부피를 다 합치면 수박 한 통(큰 프로그램)을 넣을 수 있지만, 수박을 쪼개지 않고 통째로 넣어야 하기 때문에 결국 수박을 넣지 못하는 억울한 상황과 같습니다.

  • 등장 배경: 1960년대 멀티프로그래밍이 시작되면서 가변 분할 할당 방식의 고질적인 한계로 대두되었다. 이 문제를 해결하지 못하면 하이엔드 컴퓨터라도 자원 낭비가 심각하여 제대로 된 서버 운영이 불가능했다.

┌──────────────────────────────────────────────────────────────┐
│              외부 단편화(External Fragmentation) 발생 과정           │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  [ 초기 상태 ]           [ 할당 후 ]           [ 해제 후 ]        │
│  ┌────────────┐        ┌────────────┐        ┌────────────┐  │
│  │            │        │  프로세스 A │        │  프로세스 A │  │
│  │            │        ├────────────┤        ├────────────┤  │
│  │   Empty    │        │  프로세스 B │ ──▶    │   (빈틈)   │  │
│  │            │        ├────────────┤        ├────────────┤  │
│  │            │        │  프로세스 C │        │  프로세스 C │  │
│  └────────────┘        └────────────┘        └────────────┘  │
│                                                              │
│   * 문제: 빈틈의 크기가 5MB이고 끝단 빈 공간이 5MB일 때,            │
│          총 10MB는 비어있지만 7MB짜리 D는 들어갈 자리가 없음!       │
└──────────────────────────────────────────────────────────────┘
  • 📢 섹션 요약 비유: 주차장에 경차와 대형차가 제멋대로 주차했다가 빠져나가기를 반복하면, 중간중간 좁은 칸들만 남아서 정작 커다란 버스가 들어올 자리가 없는 난장판 주차장이 되는 현상입니다.

Ⅱ. 아키텍처 및 핵심 원리

가변 분할 방식의 할당 전략 (Placement Algorithms)

외부 단편화를 조금이라도 줄여보려고 아키텍트들이 고안한 필사적인 전략들이다.

  1. 최초 적합 (First-Fit): 메모리 처음부터 뒤지다가 들어갈 만한 첫 번째 빈칸에 바로 넣는다. 가장 빠르지만 작은 조각들을 많이 남긴다.
  2. 최적 적합 (Best-Fit): 전체 빈칸 중 가장 크기가 딱 맞는(남는 공간이 제일 적은) 칸을 골라 넣는다. 공간은 아끼지만, 아주 쓸모없는 '미세 구멍'들을 양산한다.
  3. 최악 적합 (Worst-Fit): 가장 큰 빈칸에 넣는다. 남는 공간이 넉넉해서 나중에 다른 프로그램이 들어오기 좋게 만들려는 의도지만, 큰 구멍을 빨리 소진시킨다.

해결책 1: 압축 (Compaction)

메모리에 흩어진 사용 중인 블록들을 한쪽으로 싹 밀어버리고, 빈 조각들을 하나로 합쳐 거대한 빈 공간을 만드는 '대청소' 작업이다.

  • 치명적 단점: 압축하는 동안 CPU는 아무 일도 못 하고 데이터 이동만 해야 하며, 모든 주소 정보를 업데이트해야 하므로 엄청난 오버헤드가 발생한다.

해결책 2: 페이징 (Paging)

이것이 진정한 해답이다. "수박을 통째로 못 넣으면, 깍두기 모양으로 썰어서 빈틈마다 채워 넣자!"는 발상의 전환이다. 모든 할당 단위를 고정 크기(4KB)로 통일함으로써 외부 단편화 자체를 물리적으로 소멸시켰다.

  • 📢 섹션 요약 비유: 책상 위가 지저분할 때 모니터와 책들을 한쪽으로 낑낑대며 미는 것이 압축(Compaction)이라면, 아예 모든 물건을 똑같은 크기의 상자(Paging)에 담아 빈 서랍 칸마다 쏙쏙 집어넣는 것이 현대식 정리법입니다.

Ⅲ. 비교 및 연결

외부 단편화 vs 내부 단편화

비교 항목외부 단편화 (External)내부 단편화 (Internal)
발생 원인가변 크기 할당 (연속 할당)고정 크기 할당 (페이징)
낭비 위치할당된 블록들 사이의 빈틈할당된 블록 내부의 빈틈
심각성매우 높음 (할당 실패 유발)낮음 (미세한 공간 낭비)
해결 방법페이징 도입, 압축페이지 크기 최적화

세그멘테이션과 외부 단편화의 악연

세그멘테이션은 프로그램의 논리적 단위를 보존하기 위해 가변 크기 할당을 택했다. 그 대가로 외부 단편화라는 고질병을 앓게 되었고, 결국 순수 세그멘테이션 아키텍처가 페이징에게 왕좌를 내어주게 된 결정적인 이유가 되었다.

  • 📢 섹션 요약 비유: 세그멘테이션은 옷 사이즈를 S, M, L, XL로 다양하게 준비해줬더니 재고가 꼬여서 가게 망하는 꼴이고, 페이징은 무조건 '프리사이즈' 티셔츠 하나만 팔아서 재고 관리 대박 난 동대문 옷가게와 같습니다.

Ⅳ. 실무 적용 및 기술사 판단

실무 시나리오

  1. Linux 커널의 슬랩 할당자 (Slab Allocator) 활용 커널 내부에서 아주 작은 객체(수십 바이트)를 수만 번 할당하고 해제할 때 발생하는 외부 단편화 방지. 커널은 물리 메모리를 4KB 페이지 단위로 받지만, 그 내부에서 동일한 크기의 객체들을 미리 묶어서 관리하는 Slab 할당자를 쓴다. 객체가 빠진 자리에 똑같은 크기의 객체만 다시 들어오게 강제함으로써, 커널 내부 메모리 구멍이 숭숭 뚫리는 것을 하드웨어 수준에서 방어한다.

  2. C++ 게임 엔진의 메모리 풀 (Memory Pool) 설계 수천 발의 총알 객체가 매 프레임 생성되고 사라지는 상황. 표준 malloc/free를 쓰면 힙 메모리에 외부 단편화가 심해져 나중에 큰 텍스처를 로드할 때 메모리 부족으로 튕길 수 있다. 개발자는 미리 큰 배열을 할당받아놓고 그 안에서 총알을 돌려쓰는 메모리 풀을 직접 구현하여 외부 단편화의 저주를 소프트웨어 레벨에서 사전에 차단해야 한다.

도입 체크리스트

  • 기술적: 시스템이 24시간 365일 돌아가는가? (그렇다면 단편화가 누적되는 가변 할당은 위험)
  • 성능적: 메모리 압축(Compaction)이 일어날 때 시스템 레이턴시 스파이크를 감당할 수 있는 서비스인가?

안티패턴

  • 조각 모음 (Defragmentation)의 오해: SSD 스토리지의 단편화와 RAM의 외부 단편화는 완전히 다른 문제다. SSD 조각 모음은 수명을 깎는 짓이지만, RAM의 외부 단편화는 페이징으로 해결되지 않는 한 시스템을 재부팅(압축의 극단적 형태)하지 않으면 치유되지 않는 불치병에 가깝다.

  • 📢 섹션 요약 비유: 주차장에 빈자리가 많은데도 내 차를 못 대는 상황이 반복되면 주차장 주인을 욕하기 전에, 선을 무시하고 주차한 앞 차들(가변 할당)의 무질서를 먼저 탓해야 합니다.


Ⅴ. 기대효과 및 결론

정량/정성 기대효과

구분효과설명
자원 가용성메모리 활용도 100%연속 공간이 없어도 흩어진 프레임을 모아 쓰기 가능
시스템 신뢰성재부팅 주기 연장단편화 누적으로 인한 OOM 크래시 방지
단순성할당 알고리즘 단순화빈칸 크기 비교할 필요 없이 빈 프레임만 찾으면 끝

미래 전망

  • 비정형 메모리 할당의 지능화: AI가 프로세스의 생존 주기를 예측하여, 곧 나갈 놈과 오래 있을 놈을 구분해 메모리를 배치함으로써 단편화를 물리적으로 억제하는 기술이 연구되고 있다.
  • 보안과 단편화: ASLR(주소 공간 무작위 배치)은 보안을 위해 의도적으로 단편화를 유발하는 측면이 있다. 미래에는 보안과 공간 효율 사이의 접점을 찾는 정교한 알고리즘이 시스템의 핵심이 될 것이다.

결론

외부 단편화는 "연속된 덩어리"를 고집했던 초기 컴퓨터 설계의 거대한 장애물이었다. 이 병목을 뚫기 위해 인류는 '페이징'이라는 위대한 타협안을 찾아냈고, 비로소 물리적 실체에 얽매이지 않는 자유로운 가상 메모리 시대를 열 수 있었다. 외부 단편화에 대한 이해는 우리가 왜 데이터를 쪼개서 관리해야 하는지, 왜 규격화가 효율의 시작인지를 알려주는 가장 기초적인 아키텍처 수업이다.

  • 📢 섹션 요약 비유: 외부 단편화는 블록 놀이를 할 때 큰 블록과 작은 블록을 섞어 쓰다가 중간에 빈틈이 숭숭 생기는 현상입니다. 이 빈틈들을 다 합치면 엄청 큰데, 하나로 이어져 있지 않아서 제일 큰 대왕 블록을 못 꽂게 되죠. 이 문제를 해결하려고 책상을 엎는(압축) 대신, 처음부터 똑같은 크기의 작은 레고 블록(페이징)만 쓰는 지혜를 발휘한 것입니다.

📌 관련 개념 맵

개념 명칭관계 및 시너지 설명
연속 할당프로세스를 메모리에 통째로 넣는 방식으로, 외부 단편화의 근본 원인.
세그멘테이션의미 단위로 쪼개지만 여전히 가변 크기라 외부 단편화에서 벗어나지 못한 비운의 기법.
페이징모든 할당 단위를 고정 크기로 통일하여 외부 단편화를 영원히 퇴출시킨 구세주.
압축메모리 구멍을 메우기 위해 모든 데이터를 한쪽으로 미는 무겁고 원시적인 해결책.
슬랩 할당자커널 내부에서 비슷한 크기의 객체끼리 모아 관리하여 미세한 단편화를 막는 정밀 장치.

👶 어린이를 위한 3줄 비유 설명

  1. 외부 단편화는 큰 책상과 작은 책상을 섞어서 교실을 채우다 보니, 중간중간 좁은 빈틈들만 남아서 큰 책상이 들어올 자리가 없는 상태예요.
  2. 빈틈을 다 합하면 엄청 넓은데, 다 따로따로 떨어져 있어서 쓸 수가 없는 거죠.
  3. 이걸 해결하려고 책상을 낑낑대며 밀어서 합치는 것보다, 아예 모든 책상을 똑같은 1인용 작은 책상(페이징)으로 바꿔버리는 게 훨씬 똑똑한 방법이랍니다!