본문 바로가기
카테고리 없음

메모리 단편화 memory fragmentation

by RevFactory 2009. 3. 21.

  단편화란 어떠한 공간이나 자료가 여러조각으로 나뉜다는 것을 의미한다. (wiki)
그리고 단편화된 메모리란 "사용할 수 없는 자유메모리"로 설명될 수 있다. (Jan Lindblad) 자유 메모리는 메모리 할당자가 해당 메모리를 적재할 수 없는 상태로 만들때 생겨나며, 이들이 불연속적인 작은 부분에 따로 흩어져 있기 때문에 메모리 단편화 문제가 발생한다. 할당 방법에 따라 메모리 단편화가 문제되기도 하고 그렇지 않을 수도 있으므로, 메모리 할당자는 사용 가능한 리소스의 가용성을 높이는데 중요한 역할을 한다.

  컴파일러 및 링커가 메모리 할당기능을 수행할때에는 메모리 단편화가 일어나지 않는다. 이는 컴파일러가 데이터의 수명을 알고 있기 때문이다. 데이터의 수명을 알고 있으면 스택영역에 배치할 수 있는 이점이 있다. 이런 이유로 메모리 할당자는 메모리 단편화 없이 효율적으로 작업할 수 있는 것이다. 일반적으로 런타임시 메모리 할당은 스택될 수 없다. 그리고 메모리 할당은 시간과는 무관한 측면이 있어서 단편화 문제의 해결을 어렵게 한다.

  메모리 할당자는 기본적으로 오버헤드, 내부 단편화, 외부 단편화 3가지 측면에서 메모리를 낭비한다.
메모리 할당자는 모든 자유 블록의 위치, 크기 소유정보, 그리고 내부 상태와 관련된 정보를 부가적으로 저장하고 있다. 이것은 할당자가 관리하는 자체 메모리에 저장이 되며 이는 기존 메모리 할당 규칙을 따라야 한다. 모든 메모리 할당 작업은 프로세서 아키텍처에 따라 4,8,16으로 나뉠 수 있는 주소에서 시작해야 한다. 예를들어 43바이트 블록을 요청했을때 44,48또는 그 이상의 바이트를 얻게되는데 이때 남게되는 여분의 공간이 바로 내부 단편화이다.

  외부 단편화는 할당된 메모리 블록 사이에 빈 공간이 있을때 생겨난다. 만약 애플리케이션이 연속된 세 블럭의 메모리를 할당한 후 가운데를 제가할 때에 외부 단편화가 일어난다. 가운데 블록을 다시 사용할 수도 있지만 모든 자유 메모리 만큼이나 큰 블록을 할당하는 것은 불가능하다. (예제)

 정리를 하자면 3이라는 공간에 10을 넣는다 할때 마지막 1이 남는데 이것을 내부 단편화라 하고, 3씩 메모리를 3개 할당한 후 2번째것을 해제하고 4를 넣는다면 해제한 2번째 공간은 비워두고 새로운 공간에 4를 할당하는 것을 외부 단편화라 볼 수 있다.

 메모리 단편화를 해결하기 위해서 메모리 풀링과 같은 방식을 사용한다. 메모리 풀링이란 동적인 메모리 할당과 해제를 줄이는 방법으로 큰 메모리를 할당해 놓고 필요할때마다 꺼내어 사용하고 다 사용한 메모리는 다시 넣어놓는 과정을 말한다.