1.시스템&인프라/개발 입문자를 위한 운영체제

11편. 단편화란 무엇인가? – 메모리는 남는데 왜 실행이 안 될까?

쿼드큐브 2025. 11. 20. 20:17
반응형
반응형

11편. 단편화란 무엇인가? – 메모리는 남는데 왜 실행이 안 될까?

 

📚 목차
1. 단편화란 무엇인가? - 메모리는 남는데 실행이 안 되는 이유
2. 내부 단편화 vs 외부 단편화 - 메모리 낭비는 어디서 생길까?
3. 단편화의 원인 - 고정 분할과 가변 분할 방식의 한계
4. 운영체제는 어떻게 단편화를 해결할까? - 세가지 전략
✔ 마무리 - 구조를 알면 병목이 보인다

 

개발을 시작하면서 흔히 듣게 되는 말 중 하나는 "메모리가 부족하다"는 표현입니다.

하지만 실제로 시스템을 사용하다 보면, 메모리는 남아 있는데도 프로그램이 실행되지 않는 이상한 상황을 경험할 수 있습니다.

이 문제의 핵심에는 바로 단편화(fragmentation)라는 개념이 숨어 있습니다.

 

단편화는 운영체제가 메모리를 프로그램에게 나눠주는 과정에서 발생하는 공간 낭비 문제입니다.

이는 단순한 낭비를 넘어, 시스템 성능 저하, 프로그램 실행 실패, 서버 불안정 등의 원인이 되기도 합니다.

메모리 단편화 개념
메모리 단편화 개념


이번 글에서는 단편화가 무엇인지, 어떤 종류가 있으며 왜 생기는지, 그리고 이를 줄이기 위한 운영체제의 전략까지 단계적으로 살펴보겠습니다.

 

1. 단편화란 무엇인가 - 메모리는 남는데 실행이 안 되는 이유

개발을 시작하고 나면 자주 듣게 되는 말 중 하나는 "메모리가 부족하다"는 표현입니다.

그런데 이상한 경험을 하게 됩니다. 시스템에 남은 메모리 용량은 충분한데도, 어떤 프로그램은 실행되지 않습니다. 과연 이유가 뭘까요?

이 문제의 핵심에는 단편화(fragmentation)라는 운영체제의 구조적 이슈가 숨어 있습니다.

 

🔷 단편화란?

단편화는 운영체제가 메모리를 프로그램에게 나눠주는 과정에서, 사용할 수 없는 공간 낭비가 발생하는 현상을 말합니다.

표면적으로는 RAM 사용량이 낮은데도 실행이 안 되는 현상, 혹은 프로그램이 느려지는 이유가 바로 이 단편화 때문일 수 있습니다.

 

📌 단편화는 "전체 메모리 용량은 충분하지만, 연속된 공간을 확보하지 못해 실행에 실패하는 상황"을 만들어냅니다.


🔷 왜 실행이 안 되는 걸까?

운영체제는 메모리 공간을 효율적으로 활용하려고 하지만, 프로그램이 자주 실행되고 종료되면서 메모리에는 여러 크기의 빈칸들이 불규칙하게 남게 됩니다. 이로 인해, 어떤 프로그램이 일정한 크기의 ‘연속된 메모리’를 요구할 때, 운영체제가 이를 제공하지 못하는 상황이 발생할 수 있습니다.

 

🔷 [예시 시나리오] 메모리는 충분한데 실행이 안 되는 이유

다음은 외부 단편화가 실제로 어떤 식으로 문제를 일으키는지를 보여주는 예시입니다

메모리 상태:
[사용 중: 2GB][빈 공간: 1.5GB][사용 중: 2GB][빈 공간: 1.5GB]

이 상태에서 새로운 프로그램이 3GB 크기의 연속된 메모리를 필요로 한다고 가정해 봅시다.

🔸 시스템 전체적으로는 1.5GB + 1.5GB = 총 3GB의 여유 공간이 존재합니다.
🔸 하지만 이 두 공간은 서로 떨어져 있기 때문에, 운영체제는 연속된 3GB 공간을 확보하지 못합니다.
결과: 메모리는 충분한데도 실행 불가 → 이것이 바로 외부 단편화(External Fragmentation) 현상입니다.

 

🔷 실무에서 마주칠 수 있는 단편화 사례

🔸 웹 서버 운영 중:

RAM 8GB 중 5GB는 캐시 및 기타 백그라운드 서비스가 사용 중이고, 3GB 정도의 빈 공간이 여기저기 흩어져 있음.

이 상태에서 고화질 영상 처리 프로그램(3GB 필요)을 실행하려고 하면 실패함.

🔸 게임 실행 시 오류:

시스템에는 여유 RAM이 있지만, 게임 로딩 중 필요한 대용량 연속 공간이 확보되지 않아 오류 발생.

 

2. 내부 단편화 vs 외부 단편화 - 메모리 낭비는 어디서 생길까?

메모리 단편화는 단순한 낭비를 넘어서 프로그램 실행을 방해하는 구조적인 문제로 발전할 수 있습니다.

이 현상은 발생하는 위치와 방식에 따라 크게 두 가지 유형, 즉 내부 단편화와 외부 단편화로 나뉘며, 각각의 원리와 영향이 다릅니다.

 

🟦 내부 단편화 (Internal Fragmentation)

"할당받은 블록 내부에서 발생하는 낭비"

 

내부 단편화란, 메모리를 일정한 크기의 블록으로 고정해서 나누는 방식에서 발생하는 낭비입니다.

운영체제가 128KB 단위의 고정된 블록을 사용하고 있는데, 프로그램이 100KB만 필요로 하는 경우에도 전체 128KB 블록 전체를 할당받게 됩니다.

내부 단편화 예시
내부 단편화 예시

이때 나머지 28KB는 사용되지 않고 그대로 남게 되며, 다른 프로그램에서 재사용할 수도 없습니다. 이처럼 블록 내부에 발생하는 비어 있는 공간이 바로 내부 단편화입니다.

 

✔️ 예시 : 놀이터 벤치

놀이터에 4인용 벤치만 있다고 가정해 보겠습니다.

🔸두 명이 온 팀은 4인용 벤치 하나를 사용하지만, 2자리는 비어 있게 됩니다.

🔸한 명이 혼자 앉으면 3자리가 빈 채로 낭비되죠.

이처럼 실제 필요한 사람 수보다 더 큰 고정 크기의 공간을 할당했을 때, 남는 자리가 다른 사람에게 사용되지 않고 그대로 낭비되는 현상은, 운영체제에서 발생하는 내부 단편화(Internal Fragmentation)와 매우 유사합니다.

내부 단편화 예시 - 놀이터 벤치
내부 단편화 예시 - 놀이터 벤치

 

🟦 외부 단편화 (External Fragmentation)

"연속되지 않은 빈 공간들이 흩어져 발생하는 낭비"

 

외부 단편화는 운영체제가 프로그램이 요청한 만큼의 메모리를 정확히 할당하지만, 프로그램이 종료되거나 메모리를 반환하는 과정에서 빈 공간이 여기저기 흩어져 남게 되는 현상입니다.


이때 메모리의 총 여유 공간은 충분하지만, 새로운 프로그램이 요구하는 연속된 공간을 확보하지 못해 실행이 불가능해집니다.

 

✔️ 예시 1: 주차장

여러 개의 작은 주차 공간이 주차장에 흩어져 있다고 가정해 봅니다.

각각의 공간은 승용차 한 대씩은 들어갈 수 있지만, 이 공간들이 서로 붙어 있지 않아 트럭 한 대를 댈 수는 없습니다.

전체적으로는 주차 공간이 충분해 보여도, 트럭이 들어설 수 있는 연속된 공간이 없기 때문에 쓸 수 없는 것이죠.

외부 단편화도 이와 유사한 원리로 발생합니다.

외부 단편화 예시 - 주차장
외부 단편화 예시 - 주차장

✔️ 예시 2: 컴퓨터 메모리

10KB, 5KB, 20KB처럼 작게 남은 메모리 조각들이 메모리 공간에 흩어져 있다고 가정해 봅니다.

이들을 모두 합치면 총 35KB의 여유 공간이 있지만, 만약 하나의 프로그램이 30KB의 연속된 메모리 공간을 필요로 한다면 할당이 불가능합니다.

메모리는 충분한 것처럼 보여도, 실제로는 사용할 수 없는 상황이 발생하는 것입니다.

외부단편화 예시 - 컴퓨터 메모리
외부단편화 예시 - 컴퓨터 메모리

이처럼 단편화는 메모리 공간이 낭비되거나, 필요한 메모리를 확보하지 못하게 만드는 중요한 문제입니다. 운영체제는 이를 해결하기 위해 다양한 메모리 관리 기법(예: 페이징, 세그멘테이션 등)을 사용합니다.

반응형

 

3. 단편화는 왜 생길까 - 고정 분할 vs 가변 분할 방식의 한계

단편화는 단순한 우연이 아닙니다. 운영체제가 메모리를 어떻게 나누고, 프로세스에 어떻게 할당하느냐에 따라 구조적으로 발생하는 문제입니다.

이때 중요한 기준이 바로 고정 분할 방식과 가변 분할 방식입니다.

 

🟦 고정 분할 방식 (Fixed Partitioning) → 내부 단편화 발생

고정 분할 방식은 메모리를 미리 정해진 고정 크기의 블록으로 나누고, 각 프로그램에게 그 중 하나를 할당하는 방식입니다.

예전의 단순한 운영체제에서 주로 사용된 방식이며, 구조는 간단하지만 메모리 낭비가 많습니다.

 

✔️ 예시

▸ 운영체제는 메모리를 128KB 단위의 고정 블록으로 나눠 놓았다고 가정해 봅시다.

▸ 이때 한 프로그램이 70KB만 필요하더라도, 운영체제는 128KB 블록 전체를 할당합니다.

▸ 결과적으로 남은 58KB는 그대로 버려지는 셈입니다.

[사용: 70KB][남음: 58KB] → 내부 단편화

이와 같은 상황이 반복되면, 전체 메모리의 상당 부분이 사용되지 않고 남는 블록들로 채워지게 되며,

이는 시스템 자원의 심각한 낭비로 이어질 수 있습니다.

 

✔️ 비유: 고정된 칸막이 벤치
놀이터에 모두 4인용 벤치만 있다고 가정해 봅시다.
2명이 앉아도 4자리를 쓰게 되고
1명이 앉아도 3자리는 그대로 비어 있게 됩니다.
다른 사람이 중간에 끼어 앉을 수는 없기 때문에 빈 자리들이 낭비되는 것이죠.

이게 바로 내부 단편화와 동일한 원리입니다.

 

🟦 가변 분할 방식 (Dynamic Partitioning) → 외부 단편화 발생

가변 분할 방식은 프로세스가 요청한 크기만큼 메모리를 정확하게 할당해주는 방식입니다.

필요한 만큼만 나누기 때문에 내부 단편화는 줄어들지만, 다른 새로운 문제가 발생합니다.

 

✔️ 예시

▸ 현재 시스템에 1GB, 1.5GB, 500MB의 빈 공간이 여러 곳에 흩어져 있다고 가정합시다.

▸ 이때 새로운 프로그램이 3GB의 연속된 메모리를 요청하면 어떻게 될까요?

[빈칸: 1GB][사용][빈칸: 1.5GB][사용][빈칸: 500MB]
→ 총 여유 공간: 3GB  
→ 하지만 연속 공간이 없음 → 외부 단편화

총 용량은 충분해 보여도, 흩어져 있기 때문에 할당 불가능합니다.

이처럼 외부 단편화는 메모리를 효율적으로 분배하는 데 큰 제약이 됩니다.

 

✔️ 비유: 트럭이 못 들어오는 주차장

여러 칸이 비어 있는 주차장이 있지만, 큰 트럭을 세우려면 연속된 넓은 공간이 필요합니다.
▸ 승용차 여러 대는 각각의 작은 칸에 들어갈 수 있지만
▸ 트럭은 공간이 나눠져 있으면 들어설 수 없습니다.
이와 같은 상황이 바로 외부 단편화입니다.

 

오늘날 대부분의 운영체제(Linux, Windows, macOS)는 가변 분할 기반 구조 위에 페이징이나 세그멘테이션 같은 고급 메모리 관리 기법을 결합해 사용합니다.

즉, 단편화 문제를 회피하기 위해 구조 자체를 다르게 설계한 것입니다. 이에 대해서는 다음 절에서 자세히 다룹니다.

 

4. 운영체제는 단편화를 어떻게 해결할까 - 세 가지 전략

운영체제는 내부 단편화와 외부 단편화로 인해 발생하는 공간 낭비와 성능 저하 문제를 줄이기 위해 여러 전략을 사용합니다.

이 전략들은 단순한 조치가 아닌, 시스템 설계 차원에서 매우 정교하게 적용되며 현대 운영체제의 핵심 구성 요소로 자리 잡고 있습니다.


이번에는 실제로 사용되는 세 가지 대표 전략을 구체적인 예시와 함께 살펴보겠습니다.

 

🟦 1) 메모리 압축 (Compaction) – 빈 공간을 한 곳으로 밀어 모으기

외부 단편화는 메모리 곳곳에 흩어진 빈 공간 때문에 발생합니다.

이때 가장 직관적인 해결책은 흩어진 공간을 한 곳으로 모으는 것입니다. 이를 메모리 압축(compaction)이라고 합니다.


운영체제가 메모리에 존재하는 여러 프로세스들을 한쪽으로 몰아 정렬하면, 중간에 끼어 있던 빈 공간이 뒤쪽으로 모여 큰 연속 공간이 만들어집니다.

Before: [P1][빈칸][P2][빈칸][P3]
After : [P1][P2][P3][빈칸][빈칸]

각 프로세스(P1, P2, P3)가 한쪽으로 이동되고, 빈칸이 뒤쪽에 연속적으로 정리된 모습입니다.

 

🔸 실무 사례
Windows 10 이후에는 "메모리 압축(Memory Compression)" 기능이 실제 도입되어, 사용 중인 페이지 중 일부를 압축함으로써 여유 공간을 확보합니다. 이는 하드웨어 업그레이드 없이도 성능을 개선할 수 있는 방법 중 하나입니다.

 

🔸 한계

▸ 실행 중인 프로그램의 메모리를 이동시켜야 하기 때문에, CPU 자원을 많이 소모하고 시간이 오래 걸립니다

▸ 실시간 응답이 중요한 시스템(예: 의료기기, 산업 제어 시스템)에서는 사용이 제한적입니다.

 

🟦 2) 메모리 할당 전략 – 빈 공간을 잘 골라 쓰는 기술

단편화는 어디에 프로그램을 배치하느냐에 따라 줄일 수 있습니다. 운영체제는 다음과 같은 할당 알고리즘을 통해 빈 공간을 선택합니다.

🔸 First Fit(퍼스트 핏)

메모리의 앞쪽부터 탐색하여 가장 먼저 발견한, 요청 크기 이상인 빈 공간에 프로그램을 배치하는 방식입니다.

이 방법은 빠르게 할당이 가능하다는 장점이 있지만, 앞부분에 작은 조각들이 계속 쌓이면서 단편화가 누적되는 경향이 있습니다.

 

🔸 Best Fit(베스트 핏)

이는 프로그램이 요청한 크기에 가장 근접한, 즉 낭비가 최소화되는 크기의 빈 공간을 찾아 할당하는 방식입니다.

메모리 낭비를 줄일 수 있다는 장점이 있으나, 그에 따른 검색 비용이 크고, 너무 잘 맞는 크기의 공간을 반복적으로 사용하다 보면 오히려 조각화가 가속되는 경우도 있습니다.

 

🔸 Worst Fit(워스트 핏)

가장 큰 빈 공간에 프로그램을 넣는 방식입니다.

이 전략은 남은 공간이 다시 활용될 가능성을 고려한 것이지만, 실제로는 너무 큰 공간을 쪼개면서 오히려 자투리 메모리만 많이 남아 비효율적인 결과를 낳는 경우가 많습니다.

 

전략 선택한 공간 설명
First Fit 1.2GB 앞에서부터 1.2GB가 가장 먼저 맞음
Best Fit 1.2GB 1.2GB가 1.1GB에 가장 근접
Worst Fit 2GB 가장 큰 공간에 배치

 

🔸 한계

▸ 어떤 전략을 쓰더라도 시간이 지남에 따라 단편화는 필연적으로 발생할 수 있습니다.

이 때문에 이 전략들은 단편화를 예방하는 보조적 수단으로 쓰이며, 구조적 해결을 위해 다른 방식과 함께 사용됩니다.

 

🟦 3) 고급 메모리 관리 기법 도입 – 구조 자체를 바꾸기

운영체제는 단편화를 구조적으로 줄이기 위해 메모리 관리 방식 자체를 개선합니다.

대표적인 기법이 페이징(Paging)과 세그멘테이션(Segmentation)입니다.

 

🔸페이징 (Paging) - 메모리를 작게 쪼개서 나눠쓰기

운영체제가 메모리를 고정 크기의 페이지(Page) 단위로 나누어 관리하는 방식입니다.
이 방식에서는 프로그램이 연속된 메모리 공간을 요구하지 않아도 되며, 비연속적인 페이지 조각들을 모아 실행이 가능합니다.

✔ 장점
▸ 외부 단편화가 구조적으로 발생하지 않음
▸ 각 페이지는 독립적으로 배치되어 관리 유연성이 높음

 

✔ 단점
▸ 고정 크기 때문에 내부 단편화는 일부 발생할 수 있음
▸ 페이지 테이블이라는 추가 데이터 구조가 필요해 메모리 소모 증가

 

🔸세그멘테이션 (Segmentation) - 미 단위로 나눠 할당하기

세그멘테이션은 프로그램을 의미 있는 논리 단위(코드, 데이터, 스택 등)인 세그먼트(Segment)*로 나누어 각각에 메모리를 할당하는 방식입니다.

예를 들어:

▸ 세그먼트 1: 코드
세그먼트 2: 전역 변수
세그먼트 3: 스택

 

✔ 장점:
▸ 사용자 입장에서 메모리 구조가 직관적이고 관리하기 쉬움
▸ 각 세그먼트가 프로그램 구조와 밀접하게 연결되어 있음

 

✔ 단점:
▸ 세그먼트의 크기가 유동적이므로 외부 단편화는 여전히 발생 가능
▸ 세그먼트 테이블이 필요함

 

 

🟦 실무 팁: 운영체제는 이 전략들을 조합해 사용합니다

현대 운영체제는 단일 기법만 사용하는 것이 아니라, 상황에 따라 여러 전략을 혼합해 단편화를 최소화합니다.

예를 들어,
🔸 Linux는 페이징 기반 메모리 관리를 기본으로 하며,
🔸 Windows는 압축 메모리 + 페이징을 동시에 사용하고,
🔸 모바일 OS는 실시간성 고려로 압축보다는 세그멘테이션/페이징 조합을 채택하기도 합니다.

 

✔ 마무리 - 구조를 알면 메모리 병목이 보인다

단편화는 단순한 공간 낭비를 넘어, 시스템 성능 저하와 프로그램 실행 실패의 원인이 될 수 있는 구조적 병목입니다.
🔸 내부 단편화는 고정 크기 블록 내의 낭비,
🔸 외부 단편화는 연속된 공간 부족으로 인한 실행 실패를 초래합니다.

운영체제는 이를 해결하기 위해 압축, 할당 전략, 페이징, 세그멘테이션 같은 기법을 활용합니다.


💡 실무 팁

서버가 느려지거나 앱이 실행되지 않을 때, 단순한 'RAM 부족'이 아닌 단편화 현상을 의심해볼 필요가 있습니다.

단편화는 눈에 띄지 않지만 시스템 성능을 은근히 갉아먹는 보이지 않는 병목입니다.

 

운영체제의 메모리 관리 구조를 이해하면, 성능 문제를 더 정확하게 진단하고 대응할 수 있습니다.

 

 

※ 게시된 글 및 이미지 중 일부는 AI 도구의 도움을 받아 생성되거나 다듬어졌습니다.

반응형

 

반응형