컴퓨터공학

메모리 단편화(Internal & External Fragmentation)와 해결 방법

nyambu 2025. 3. 7. 19:00

메모리 단편화
메모리 단편화

1. 메모리 단편화란?

  • 운영체제(OS)는 CPU가 프로세스를 실행할 때 필요한 메모리(RAM)를 할당하고, 사용이 끝나면 반환하는 방식으로 메모리를 관리한다. 하지만, **메모리 할당 및 해제가 반복되면서 사용하지 못하는 자투리 공간이 발생하는 현상을 "메모리 단편화(Memory Fragmentation)"**라고 한다.
  • 이러한 단편화가 심해지면 RAM에 여유 공간이 있음에도 불구하고 새로운 프로세스를 실행할 수 없는 문제가 발생할 수 있다. 즉, 전체적인 시스템 성능 저하 및 메모리 낭비가 심화되는 원인이 된다.

1-1. 메모리 단편화가 발생하는 이유

메모리 단편화는 운영체제가 메모리를 할당하고 반환하는 과정에서 블록이 불규칙하게 배치되면서 발생한다.
다음과 같은 경우에 메모리 단편화 문제가 발생할 가능성이 높다.

 

고정된 크기의 메모리 할당

  • 운영체제가 프로세스 크기와 관계없이 고정된 크기의 블록을 할당할 때, 일부 공간이 낭비됨
  • 예를 들어, 10KB의 데이터를 저장하려 하는데 운영체제가 12KB 블록 단위로 할당한다면 2KB의 낭비가 발생

프로세스의 종료 및 새로운 프로세스의 실행

  • 여러 개의 프로세스가 실행되고 종료되면서 메모리 블록이 불규칙하게 분포
  • 예를 들어, 프로세스 A(30MB), B(40MB), C(50MB)가 실행되었다가 B가 종료되면 40MB의 빈 공간이 남음
  • 이후 45MB의 새로운 프로세스를 실행하려 하면, 40MB 공간이 있지만 연속된 공간이 부족하여 실행되지 않음

동적 메모리 할당 및 해제 반복

  • 프로그램이 실행 중에 필요한 만큼 메모리를 동적으로 할당하고 해제하는 과정에서 크기가 다른 블록이 남게 됨
  • 예를 들어, 웹 브라우저가 여러 개의 탭을 열고 닫는 과정에서 동적 메모리 할당이 계속되면서 단편화가 증가

1-2. 메모리 단편화가 시스템 성능에 미치는 영향

메모리 단편화는 단순한 공간 낭비를 넘어, 시스템 성능 저하 및 응용 프로그램의 실행 속도 감소로 이어질 수 있음

 

RAM 사용 효율 감소

  • 사용하지 못하는 메모리 블록이 증가하면서, 실제 사용할 수 있는 메모리 공간이 줄어듦
  • 전체 메모리 공간이 충분해도 프로세스가 필요한 크기의 연속된 공간이 없으면 실행 불가능

페이지 폴트(Page Fault) 증가

  • 메모리가 단편화되면 프로세스가 필요한 데이터를 연속된 공간에서 찾지 못하고, 가상 메모리(Swap)로 이동
  • 디스크에서 데이터를 로드하는 시간이 길어지면서 시스템 성능이 저하됨

CPU 및 메모리 관리 부하 증가

  • 운영체제가 단편화된 메모리를 효율적으로 활용하기 위해 메모리 재배치(Compaction) 또는 페이지 교체(Page Replacement) 수행
  • 이 과정에서 CPU 사용률이 증가하고, 실행 중인 프로세스의 성능이 저하될 수 있음

📌 실생활 예시: "창고 정리 문제"

  • 창고에 여러 개의 상자를 쌓아두었는데, 불규칙하게 배치되어 있어 새로운 물건을 넣을 공간이 부족한 상황
  • 총 공간은 충분하지만, 연속된 빈 공간이 없으면 더 큰 상자를 넣을 수 없음
  • 창고를 정리(=메모리 압축)하지 않으면 공간을 효율적으로 활용할 수 없음

1-3. 메모리 단편화의 종류 개요

메모리 단편화는 크게 **"내부 단편화(Internal Fragmentation)"**와 **"외부 단편화(External Fragmentation)"**로 나뉜다.

 

내부 단편화(Internal Fragmentation)란?

  • 운영체제가 고정된 크기의 메모리 블록을 할당할 때, 실제 필요한 크기보다 더 큰 공간이 할당되면서 낭비되는 현상
  • 사용자는 접근할 수 없는 공간이므로 활용이 불가능함

외부 단편화(External Fragmentation)란?

  • 여러 개의 프로세스가 실행되었다가 종료되면서, 연속된 공간이 부족해 새로운 프로세스를 실행하지 못하는 현상
  • 전체적인 메모리 공간은 충분하지만, 작은 조각으로 나누어져 있어 사용이 어려움

1-4. 메모리 단편화 문제를 해결해야 하는 이유

운영체제에서 메모리 단편화를 해결하지 않으면, 장기적으로 시스템 성능 저하와 리소스 낭비가 심해질 수 있음

 

새로운 프로세스 실행 불가 문제

  • 메모리 블록이 조각나 있으면, 실제로는 여유 공간이 있어도 새로운 프로세스를 실행할 수 없음
  • 특히, 대용량 애플리케이션 실행 시 메모리 부족 오류가 발생할 가능성이 커짐

시스템 속도 저하

  • 가상 메모리(Swap)를 과도하게 사용하면 디스크 I/O가 증가하면서 전체적인 속도가 저하됨
  • 데이터가 여러 위치에 분산되면 CPU가 데이터를 검색하는 데 더 많은 시간이 소요됨

메모리 할당 최적화 필요

  • 운영체제는 메모리 할당 전략(페이징, 세그멘테이션 등)을 활용하여 단편화를 최소화해야 함
  • 효율적인 메모리 사용이 가능하면, 더 많은 프로세스를 실행할 수 있음

📌 실생활 예시: "비행기 좌석 배치 문제"

  • 비행기 좌석이 군데군데 비어있지만, 한 가족이 함께 앉을 수 있는 연속된 좌석이 부족한 상황
  • 개별적으로 앉을 자리는 있지만, 연속된 공간이 없으면 가족이 함께 앉을 수 없음
  • 이 문제를 해결하려면 좌석을 재배치하거나(메모리 압축), 좌석 예약 방식을 변경해야 함(페이징 기법 적용)

2. 메모리 단편화의 종류

2-1. 내부 단편화(Internal Fragmentation)란?

내부 단편화란?

  • 운영체제가 고정된 크기의 메모리 블록을 할당할 때, 실제 필요 크기보다 더 큰 메모리를 할당하면서 남는 공간이 생기는 현상
  • 할당된 블록 내부에서 발생하므로, 사용자는 접근할 수 없고 활용할 수도 없음

📌 내부 단편화 예시
1️⃣ 운영체제가 메모리를 4KB 단위로 할당한다고 가정
2️⃣ 어떤 프로세스가 6KB의 메모리를 요청
3️⃣ 운영체제는 6KB를 만족하기 위해 4KB 블록 2개(8KB)를 할당
4️⃣ 하지만 2KB의 사용되지 않는 공간이 남음 (이 공간이 내부 단편화)

 

내부 단편화의 문제점

  • 불필요한 메모리 낭비: 프로세스가 실제로 필요로 하는 메모리보다 더 많은 공간을 차지함
  • 프로세스 실행 수 제한: 사용되지 않는 공간이 많아지면, RAM이 충분해도 새로운 프로세스를 실행하지 못하는 경우 발생

📌 실생활 예시: "음식 포장 박스 문제"

  • 작은 음식 포장 용기가 없어 큰 용기에 작은 음식(햄버거 하나)을 담아 포장하는 상황
  • 큰 용기를 사용해야 하므로 포장 공간이 낭비됨

2-2. 외부 단편화(External Fragmentation)란?

외부 단편화란?

  • 프로세스가 메모리를 할당받고 종료되는 과정에서 사용할 수 있는 총 메모리 공간은 충분하지만, 연속된 공간이 부족하여 새로운 프로세스를 실행할 수 없는 현상
  • 메모리 사이사이에 작은 사용 불가능한 조각이 생겨 활용되지 못함

📌 외부 단편화 예시
1️⃣ 100MB의 메모리가 존재하지만, 여러 개의 작은 공간으로 나누어져 있음
2️⃣ 새 프로세스가 50MB의 메모리를 요청
3️⃣ 각 단편화된 공간이 50MB 미만이라, 총합은 100MB가 넘더라도 실행 불가

 

외부 단편화의 문제점

  • 전체 메모리는 충분하지만, 사용할 수 없는 상태가 됨
  • 점점 더 많은 조각난 공간이 생기면서 시스템 성능이 저하됨

📌 실생활 예시: "주차 공간 문제"

  • 주차장에 총 10대의 차를 주차할 공간이 있지만, 차 사이 간격이 일정하지 않아 큰 차는 주차할 공간이 없음
  • 전체적으로 주차 공간이 충분하지만, 연속된 공간이 부족해 실제로 주차할 수 없는 문제 발생

3. 메모리 단편화 해결 방법

3-1. 내부 단편화 해결 방법

1) 가변 크기 메모리 할당(Variable Partitioning)

  • 프로세스가 요청한 크기만큼만 메모리를 할당하여 남는 공간을 줄이는 방식
  • 메모리 블록 크기를 유연하게 변경할 수 있어 내부 단편화를 최소화할 수 있음
  • 단점: 메모리 할당 및 해제 과정에서 외부 단편화가 발생할 가능성이 있음

2) 슬래빙(Slab Allocation) 기법

  • 비슷한 크기의 메모리를 여러 개의 블록(Slab)으로 나누어 관리하는 방식
  • 운영체제가 자주 사용되는 크기의 메모리 블록을 미리 준비하여 할당
  • 메모리 낭비를 줄이면서, 할당 속도를 최적화할 수 있음

📌 실무 적용 사례

  • Linux 커널 메모리 할당 기법에서 Slab Allocator를 사용하여 내부 단편화를 줄임
  • 데이터베이스 시스템에서 특정 크기의 메모리 블록을 미리 준비하여 효율적인 할당 수행

3-2. 외부 단편화 해결 방법

1) 압축(Compaction) 기법

  • 사용 중인 메모리를 한쪽으로 몰아서 연속적인 빈 공간을 확보하는 방식
  • 단점: 데이터를 이동하는 시간이 필요하여 성능이 저하될 수 있음

2) 페이징(Paging) 기법

  • 메모리를 고정된 크기의 페이지로 나누고, 프로세스를 해당 페이지에 배치하는 방식
  • 프로세스가 연속된 공간에 배치될 필요가 없으므로, 외부 단편화를 해결할 수 있음

3) 세그멘테이션(Segmentation) 기법

  • 프로세스를 논리적인 세그먼트(코드, 데이터, 스택 등)로 분리하여 관리하는 방식
  • 페이징과 달리 프로세스의 크기에 따라 유연한 크기의 메모리를 할당 가능

📌 실무 적용 사례

  • Windows 운영체제는 가상 메모리 시스템에서 페이징 기법을 활용하여 외부 단편화를 방지
  • 리눅스(Linux)와 유닉스(Unix)에서는 세그멘테이션과 페이징을 조합한 방식 사용