287. 내부 단편화 (Internal Fragmentation)
핵심 인사이트 (3줄 요약)
- 본질: 내부 단편화 (Internal Fragmentation)는 페이징 기법처럼 고정된 크기 단위로 메모리를 할당할 때, 할당된 공간 안에 다 채우지 못한 잉여 공간이 발생하여 버려지는 메모리 낭비 현상이다.
- 가치: 주로 프로세스의 마지막 페이지를 할당할 때 발생하며, 페이지 크기가 클수록 버려지는 공간(내부 단편화)도 커지는 트레이드오프가 존재한다.
- 융합: 과거 메모리가 귀했던 시절에는 큰 골칫거리였으나, 기가바이트 단위의 현대 메모리 환경에서는 시스템 성능(TLB 효율 등)을 위해 기꺼이 감수할 만한 미미한 수준의 비용으로 취급된다.
Ⅰ. 개요 및 필요성
-
개념: 메모리 할당 시 요청한 크기보다 더 큰 고정된 블록이 할당되어, 블록 내부에서 사용되지 않고 남는 빈 공간을 의미한다.
-
필요성: 페이징 시스템은 외부 단편화를 없애기 위해 "무조건 정해진 규격(예: 4KB 페이지)으로만 자른다"는 규칙을 세웠다. 이 규칙을 지키려면 프로그램의 마지막 조각이 단 1바이트일지라도 무조건 한 페이지(4KB) 전체를 줘야만 한다. 규격화라는 거대한 질서를 위해 지불해야 하는 최소한의 '세금'인 셈이다.
-
💡 비유: 피자(메모리)를 무조건 한 판(4KB) 단위로만 파는데, 내가 1.2판만 먹고 싶다면 어쩔 수 없이 2판을 결제하고 남은 0.8판은 그냥 쓰레기통에 버려야 하는 억울한 상황과 같습니다.
-
등장 배경: 1960년대 페이징 기법이 도입되면서, 고질적인 외부 단편화 문제를 해결하는 과정에서 파생된 부작용으로 처음 정의되었다. 당시에는 램 용량이 매우 부족했기에 이 몇 KB의 낭비도 심각하게 다뤄졌으나, 현대에는 큰 문제가 되지 않는다.
┌──────────────────────────────────────────────────────────────┐
│ 내부 단편화(Internal Fragmentation) 발생 메커니즘 │
├──────────────────────────────────────────────────────────────┤
│ │
│ [ 프로그램 전체 크기: 9KB ] │
│ [ 페이지 규격: 4KB ] │
│ │
│ 1. Page 0 (4KB) ──▶ Frame 5에 할당 (꽉 참, 낭비 0) │
│ 2. Page 1 (4KB) ──▶ Frame 2에 할당 (꽉 참, 낭비 0) │
│ 3. Page 2 (1KB) ──▶ Frame 8에 할당 (1KB 사용, 3KB 남음!) │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────┐ │
│ │ 내부 단편화 (3KB 발생) │ │
│ │ * 이 3KB는 남이 쓸 수 없음 │ │
│ └───────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: 귤 한 개를 입에 쏙 넣으려다 입이 작아 절반만 베어 물고 나머지는 껍질째 버리는 작은 낭비가 내부 단편화라면, 냉장고 정리를 너무 못해서 빈 자리가 많은데도 정작 큰 수박 한 통을 못 넣는 심각한 공간 낭비는 외부 단편화입니다.
Ⅱ. 아키텍처 및 핵심 원리
페이지 크기(Page Size)와의 상관관계
내부 단편화의 크기는 페이지 크기와 정비례한다.
- 작은 페이지 (예: 1KB): 마지막 조각의 낭비가 최대 1KB 미만으로 줄어든다. 하지만 주소 장부(Page Table)가 너무 많아져 관리 오버헤드가 커진다.
- 큰 페이지 (예: 2MB): 주소 변환은 빠르지만, 재수 없으면 프로그램 하나당 무려 2MB 가까운 램을 생으로 날릴 수 있다.
- 결론: 현대 시스템은 통계적으로 한 프로세스당 평균
페이지 크기 / 2만큼의 낭비가 발생한다고 보고, 4KB를 가장 합리적인 표준으로 삼고 있다.
외부 단편화 vs 내부 단편화
| 구분 | 외부 단편화 (External) | 내부 단편화 (Internal) |
|---|---|---|
| 발생 원인 | 가변 크기 할당 (연속 할당) | 고정 크기 할당 (페이징) |
| 위치 | 할당된 블록들 사이의 빈틈 | 할당된 블록 내부의 빈틈 |
| 심각성 | 메모리 전체에 구멍 (치명적) | 프로그램 끝자락의 미세 낭비 (미미) |
| 해결 | 페이징 도입으로 해결 | 페이지 크기 최적화로 완화 |
- 📢 섹션 요약 비유: 신발을 살 때 '무조건 10 단위로만 파는 신발가게'에서 내 발이 233mm라면, 240mm 신발을 사서 앞코에 7mm의 빈 공간이 생기는 것과 같습니다. 이 7mm에는 내 발도 안 들어가고 남의 발도 못 들어갑니다.
Ⅲ. 비교 및 연결
Huge Page와 내부 단편화의 딜레마
성능을 위해 1GB짜리 Huge Page를 쓰는 경우 내부 단편화는 재앙이 될 수 있다.
-
만약 프로그램이 1.1GB를 사용한다면, 2개의 Huge Page(2GB)를 할당받아야 한다.
-
이때 버려지는 내부 단편화는 무려 900MB에 달한다.
-
실무 아키텍트는 TLB 적중률 향상이라는 '속도'의 이득이 이 거대한 '낭비'보다 큰지를 정밀하게 계산하여 Huge Page 도입 여부를 결정해야 한다.
-
📢 섹션 요약 비유: 짐을 쌀 때 아주 작은 성냥갑(작은 페이지)을 쓰면 낭비는 없지만 성냥갑 수만 개를 관리하느라 머리가 터집니다. 반면 대형 컨테이너(Huge Page)를 쓰면 관리는 편한데 안에 짐이 조금만 들어있어도 전체 공간을 다 차지하는 딜레마입니다.
Ⅳ. 실무 적용 및 기술사 판단
실무 시나리오
-
마이크로 서비스 (MSA) 환경에서의 낭비 누적 하나의 서버에 수천 개의 아주 작은 컨테이너(Docker)를 띄우는 상황. 각 컨테이너 내부의 프로세스마다 마지막 페이지에서 4KB의 내부 단편화가 발생한다면, 1000개의 프로세스에서 총 4MB가 낭비된다. 이는 수십 GB의 램을 가진 서버에서 고작 0.01%의 손실이므로 무시해도 좋다는 판단을 내릴 수 있다.
-
임베디드 시스템의 메모리 최적화 램이 고작 1MB인 초저사양 MCU에서 페이징을 구현할 때. 4KB 페이지를 쓰면 내부 단편화로 10% 이상의 램이 날아갈 수 있다. 이럴 때는 페이지 크기를 1KB 이하로 줄여서 낭비를 최소화하거나, 아예 단편화가 없는 세그멘테이션 방식을 혼합하는 전략적 설계가 필요하다.
도입 체크리스트
- 기술적: 우리 시스템의 주된 연산이 대용량 배열인가, 아니면 수많은 작은 객체인가? (큰 데이터 위주면 Huge Page 고려)
- 성능적: 내부 단편화를 줄이기 위해 페이지 크기를 줄였을 때, 그로 인해 늘어난 페이지 테이블 검색 시간이 시스템 성능을 저하시키지 않는가?
안티패턴
-
단편화 무시한 거대 페이지 고집: 램 용량은 4GB뿐인데 성능을 올리겠다고 1GB Huge Page를 남발하는 것. 몇 개의 프로그램만 띄워도 내부 단편화 때문에 램이 꽉 차서 정작 다른 필수 프로세스들이 실행되지 못하는 자원 고갈 사태를 부른다.
-
📢 섹션 요약 비유: 피자를 한 조각만 먹고 싶은데 무조건 한 판 단위로만 파는 가게(Huge Page)에 가서 돈을 낭비하지 마세요. 배가 많이 고픈 날에만 그 가게에 가는 것이 똑똑한 소비입니다.
Ⅴ. 기대효과 및 결론
정량/정성 기대효과
| 구분 | 고정 할당 (내부 단편화) | 가변 할당 (외부 단편화) |
|---|---|---|
| 메모리 활용률 | 상대적 높음 | 매우 낮음 |
| 관리 복잡도 | 매우 낮음 (단순함) | 매우 높음 (압축 작업 필요) |
| 시스템 속도 | 빠름 | 느림 (빈틈 찾느라 고생) |
미래 전망
- 가변적 페이지 크기: 앞으로는 프로그램의 성격에 따라 어떤 조각은 4KB로, 어떤 조각은 2MB로 알아서 쪼개주는 지능형 메모리 관리 기술이 더욱 정교해질 것이다.
- 소프트웨어적 보안: 내부 단편화로 남은 텅 빈 공간에 해커가 악성 코드를 심지 못하도록, 잉여 공간을 0으로 채우거나(Zeroing) 접근을 차단하는 보안 기술이 강화되고 있다.
결론
내부 단편화는 "효율적인 관리를 위해 지불하는 최소한의 낭비"다. 외부 단편화라는 거대한 암종을 제거하기 위해 페이징이라는 수술을 택했고, 그 수술 흉터로 남은 것이 내부 단편화다. 현대의 아키텍트들은 이 작은 흉터를 없애려 노력하기보다, 이를 감수하면서 얻는 고속 주소 변환과 시스템 안정성이라는 열매를 취하는 실용적인 길을 걷고 있다.
- 📢 섹션 요약 비유: 내부 단편화는 맛있는 사과를 깎을 때 껍질과 함께 조금 잘려 나가는 사과 살점과 같습니다. 아깝긴 하지만, 사과를 깎지 않고(단편화 방치) 껍질째 먹다가 배탈이 나는 것보다는 훨씬 현명한 선택입니다.
📌 관련 개념 맵
| 개념 명칭 | 관계 및 시너지 설명 |
|---|---|
| 페이징 | 내부 단편화를 유발하는 근본적인 고정 크기 메모리 할당 기법. |
| 외부 단편화 | 내부 단편화와 반대되는 개념으로, 가변 크기 할당 시 발생하는 치명적 낭비. |
| 페이지 크기 | 내부 단편화의 양을 결정하는 핵심 변수 (클수록 단편화 증가). |
| Huge Page | 내부 단편화를 대량으로 허용하는 대신 TLB 성능을 얻는 하이엔드 기술. |
| 메모리 압축 | 단편화로 조각난 공간을 모으는 작업 (주로 외부 단편화 해결용). |
👶 어린이를 위한 3줄 비유 설명
- 내부 단편화는 신발을 살 때 '무조건 10 단위로만 파는 가게'에서 벌어지는 일이에요.
- 내 발은 233mm인데 240mm 신발을 사야 해서, 신발 앞코에 7mm의 빈 공간(낭비)이 생겨버리는 거죠.
- 이 빈 공간은 아깝지만, 신발이 없으면 발이 아프니까 어쩔 수 없이 참고 신는 거랍니다! 그래도 큰 구멍이 숭숭 뚫린 것보다는 훨씬 나아요!