Programming theory/Computer science

[Computer science]메모리 단편화(Fragmentation)

CodingGom 2022. 4. 9. 01:12

이 글은 이전에 운영하던 깃 블로그에서 옮겨온 글입니다.

 

서론

냉장고 정리를 해본 적이 있나요? 저 같은 경우에는 예전에 자취를 하면서, 꽉 찬 냉장고를 정리한 적이 있습니다. 냉장고 정리를 하고 나니(버린 것이 아닌 내용물들의 재배치만 했습니다.) 꽉 차 보였던 냉장고에 여유공간이 생기게 됐죠.

냉장고 전체를 메모리라고 보고, 냉장고에 들어있는 내용물들을 메모리를 차지하는 데이터라고 생각해보죠. 분명 더이상 들어갈 자리가 없는 냉장고인데 재배치를 하고 나니 여유 공간이 생겼습니다. 이는 애초에 수치적인 공간이 부족했던 게 아니라 일정 크기의 내용물이 들어갈 연속된 공간이 없던 것입니다.

냉장고의 빈곳 일부일부를 다 합치면 김치통 하나 더 들어갈 자리는 있지만, 각각의 부분에는 한 번에 넣을 수 없다는 말이죠. 김치통을 여러 조각으로 분리하지 않는 한 말입니다.


단편화

단편화의 사전적 정의는 다음과 같습니다.

분열된 것

메모리의 단편화라고 한다면 ‘메모리가 분열된 것’ 이라고 생각하면 됩니다. 위의 냉장고 이야기처럼, 분명 절대적인 사용량은 충분하지만 질 제로 사용할 수 있는 공간이 없다는 것입니다. 메모리의 빈 공간에 존재해야 할 데이터들이 여러 조각으로 나뉘어, 저장되는 현상이기 때문에 사용할 수 있는 공간이 점차 사라지게 됩니다. 이러한 단편화는 발생하는 현상에 따라 크게 두 가지로 나뉩니다. 외부/내부 단편화로 말이죠.


외부 단편화

[그림 1. 외부 단편화]

외부단편화는 메모리 할당과 해제가 반복되면서 위 그림처럼 중간중간 빈 공간이 생깁니다. 저렇게 빈 공간을 다 합치면 충분한 공간이 있지만, 한 공간단 크기가 작아 메모리가 더 이상 할당되지 못하는 현상이 바로 외부 단편화입니다.

가장 처음에 이야기한 냉장고 이야기가 외부 단편화의 사례라고 볼 수 있겠네요.


내부 단편화

[그림 2. 내부 단편화]

내부 단편화는 메모리가 할당될 때 필요한(실제 사용될) 크기보다 더 크게 할당되어 생기는 현상입니다. 패딩 데이터를 생각하면 쉽겠습니다. 패딩 데이터에 관해서는 다른 글에서 자세히 다뤄보겠습니다.


단편화 해결법

그럼 단편화를 해결하는 방법은 무엇일까요? 제가 냉장고를 정리해서 여유 공간을 창출했듯이, 단편화도 해결법이 있을 겁니다. 아래는 몇 가지 대표적인 해결법을 적어보겠습니다.

 

압축(Compaction)

메모리를 재배치하여 분산되어있던 메모리 공간을 하나로 합치는(압축하는) 해결법.
냉장고의 내용물들을 정리(재배치)하여 더 넣을 공간을 만든 것이 이 방법입니다.

 

통합(Coalecing)

압축과 헷갈리기 쉽지만, 압축과 다르게 인접한 것끼리 합치는(통합) 것입니다. 그럼 어떻게 다를까요?
통합 방식은, 크기를 줄이는 게 아닌 하나의 메모리를 기준으로 근처에 있던 것끼리 뭉쳐서 큰 메모리 덩어리로 만들어 줍니다. 그러므로, 재배치가 일어나는 압축과는 성격이 다릅니다.

페이징(Paging)

가상 메모리(보조기억장치 이용)를 일정 크기의 블록(페이지)으로 나누어 줍니다. 주기억장치에서 이 페이지와 같은 크기로(프레임) 나뉘게 됩니다. 사용하는 데이터는 프레임에, 사용하지 않는 것은 페이지 옮겨서 단편화를 해결합니다.
단 이는 외부 단편화만을 해결해줍니다.

 

세그멘테이션(Segmentaion)

이 또한 역시 가상 메모리를 이용하며 페이징과 다르게 같은 크기인 페이지가 아닌 서로 다른 크기로 나눕니다. 이렇게 나뉜 영역을 세그먼트라고 합니다. 세그먼트는 논리적 단위로 나뉘며, 논리 주소로 물리 메모리를 맵핑하여 사용하는 방식입니다. 페이징과 다르게 내부 단편화만을 해결해준다. 

 

메모리풀(Memory pool)

미리 일정 크기, 개수의 메모리를 할당해놓고 필요할 때마다 미리 할당된 메모리를 빌려주고 사용이 끝나면 풀에 반납하는 방식입니다. 기기(전자 킥보드, 자전거 등) 대여 서비스를 생각하면 쉽겠네요.
메모리 할당 / 해제 비용이 들지 않아 서버에서도 많이 쓴다고 한다. 유니티에서도 객체를 할당 / 해제하는 것보다 오브젝트를 미리 생성해놓고 SetActive()로 활성화 / 비활성화하는 방식인 오브젝트 풀이 이와 같은 방식입니다.


리소스 출처

[그림 1~2] : 나를위한노트, https://developer-mac.tistory.com/21

반응형
LIST