메모리 단편화란 주기억장치 (RAM)에서 메모리 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 총합으로는 충분하지만 연속된 공간에 할당하지 못하는 상태를 말한다. 여기서 말하는 메모리 공간은 메모리의 공간중 Heap공간이다.

이는 내부단편화와 외부단편화로 나뉘어진다.

내부 단편화

메모리를 할당 할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비되는 현상

예시 ) int A[100000]을 Heap 공간에 동적할당하고 실제로는 다 사용하지 않는 경우를 예를 들수 있겠다.

외부 단편화

메모리가 할당 및 해제의 반복으로 작은 메모리가 중간 중간 조각나있는 상태를 말한다. 메모리의 할당은 연속적인 공간이여야 하는데 그렇지 못한 상황

해결 방법

  1. 페이징(Paging) 기법 - 가상 메모리 사용, 외부 단편화 해결, 내부 단편화 존재

    보조기억장치 (HDD, SDD)를 이용한 가상메모리를 같은 크기의 블록으로 나눈 것을 페이지라고 하고, RAM과 같은 페이지와 같은 크기로 나눈 것을 프레임이라고 할 때,

    사용하지 않는 프레임을 페이지에 옮기고, 필요한 메모리를 페이지 단위로 프레임에 옮기는 기법

    페이지와 프레임을 대응시키기 위해 Page Mapping 과정이 필요해서 Paging Table을 만든다.

    이 페이징 기법을 활용하면 연속적이지 않은 공간도 활용할 수 있기 때문에 외부 단편화 문제를 해결 할 수 있다.

    하지만 페이지 단위에 알맞게 꽉채워서 쓰는게 아니므로 내부 단편화 문제는 여전히 존재한다.

    페이지 단위를 세세하게 나누면 해결할수도 있겠지만 중간에 매핑과정이 많아지므로 효율이 떨어진다.

  2. 세그멘테이션(Segmentation) 기법 - 가상메모리 사용, 내부 단편화 해결, 외부 단편화 존재

    페이징 기법에서 가상메모리를 같은 크기의 단위로 분할 했지만, 세그멘테이션 기법에서는 가상메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할해서 메모리를 할당하여, 실제 메모리 주소로 변환한다.

    세그먼트들의 크기가 다르기 때문에 미리 분할해 둘 수 없고, 메모리에 적재될 때 빈 공간을 찾아 할당하는 기법이다. 마찬가지로 Segmentation Mapping 과정이 필요해서 Segment Table이 필요한다. 프로세스가 필요한 만큼 메모리를 할당하기 때문에 내부단편화는 일어나지 않으나, 중간에 해제하면 메모리 단편화 문제는 여전히 존재한다.

  3. 메모리 풀 (Memory Pool)

    필요한 메모리 공간을 필요한 크기, 개수 만큼 사용자가 직접 지정하여 미리 할당 받아 놓고 사용하고 반납하고를 하는 기법

    미리 미래에 사용할 공간을 할당하고 사용하는 것이기 때문에 이로 인해 공간이 조각나는 내부 단편화는 발생하지 않는다. 그리고 필요한 만큼 할당해놓기 때문에 내부 단편화도 생기지 않는다.

    하지만 필요한 메모리양이 커질 경우는 사용하지 말아야한다. 그리고 사용안해도 그만큼의 공간은 미리 할당 받았기 때문에 메모리 낭비가 생길수도 있다.