CS

CS (Computer Science) - 내부 단편화, 외부 단편화

오의현 2024. 5. 18. 13:51

프로그래밍에선 사용가능한 자원을 최대한 효율적으로 활용하는 것이 매우 중요하다.

하지만, 효율적이지 않게 사용되는 상황은 언제든 발생할 수 있다.

 

대표적으로 메모리가 비효율적으로 사용되는 상황인 내부 단편화와 외부 단편화에 대해 알아보자.

 

메모리 내부 단편화

 

위의 그림을 보자. 전체 할당받은 메모리는 회색 네모칸 만큼이다.

하지만, 정작 실제로 사용하고 있는 것은 주황색 네모칸 만큼밖에 되지 않는다.

 

이 상황에선, 비어있는 회색 네모칸 만큼 메모리가 낭비되고 있다고 할 수 있다. 

이처럼, 실제로 필요한 것보다 더 많은 메모리를 할당하여 메모리가 낭비되는 상황을 내부 단편화라고 한다.

 

대표적인 예시를 하나 들어보자.

 

팝업 스토어를 열었다고 가정해보자. 팝업 스토어에 참가하는 손님을 기록하기 위한 장부로 std::vector를 선언하였다.

손님은 64명정도 올 것으로 예상되었고, 그에 맞게 vector를 64만큼 reserve해주었다.

 

하지만, 실제로 방문한 손님은 32명밖에 되지 않았다. 벡터에 손님 정보를 모두 기록하여도 할당한 메모리의 절반밖에 사용하지 않는 상황이 되어버린 것이다. 현재 32칸의 메모리가 낭비되고 있고, 내부 단편화가 발생하였다고 할 수 있다.

 

메모리 외부 단편화

 

이렇게 총 10바이트의 메모리 공간이 있고, 위와 같이 할당이 되어있다고 해보자.

여기서, B와 D의 메모리를 할당 해제할 것이다.

이렇게, B와 D가 있던 공간은 비어있는 공간이 될 것이다.

이때, 4byte짜리 E에 대한 메모리를 할당하려고 한다면?

 

할당할 수가 없다. 분명 메모리 영역에는 2byte짜리 비어있는 공간이 2개 있으므로 총 4byte가 존재함에도 불구하고, E가 사용할 메모리를 할당할 수가 없다. 왜냐하면, 하나의 데이터는 메모리상에 연속적으로 저장되어야 하기 때문이다. 4byte짜리를 반씩 쪼개서 다른 곳에 저장할 수가 없다는 것이다.

 

이처럼, 메모리의 용량으로 봤을 땐 충분한 공간이 있음에도 불구하고 메모리를 할당하지 못하거나 효율적으로 사용하지 못하는 상황을 외부 단편화라고 한다.

 

이러한, 단편화 현상들을 해결하기 위해선 페이징, 세그멘테이션 등 여러 기법을 사용하곤 한다.

이는 다른 게시물에서 상세하게 설명하도록 하겠다.