[CS] 동적 메모리 할당, 힙 메모리

wrld_worthy·2023년 11월 10일
0

CS

목록 보기
4/12
post-thumbnail

동적 메모리 할당

동적 메모리 할당은 프로그램이 실행 중인 시점(런타임)에서, 필요한 메모리 공간을 할당하는 프로세스이다. 이는 프로그램이 실행되기 전에 메모리의 크기가 결정되지 않고, 실행 중에 프로그램의 요구에 따라 메모리의 크기가 결정되어 할당된다.

왜 사용하는가?

그냥 프로그램 별로 넉넉하게 메모리를 할당해 놓고 사용하면 되지 않겠나? 생각할 수 있다. 하지만 프로그램이 실행이 되면서 사용하는 메모리가 얼마나 필요할지는 사용자, 목적에따라 천차만별로 다르고 예상하기란 매우 어렵다.
그럼 그냥 최대치로 할당해 놓으면 되지 않나?
일단 메모리는 무한한 자원이다니다. 만약 그렇게 한다고해도 적게 사용할 때에도 무조건 한 프로그램에 최대치의 메모리가 할당되게 된다. 이는 엄청난 메모리 낭비로 이어지고 컴퓨터 성능에도 막대한 영향을 끼칠 것이다.

정리하면, 프로그램이 실행될 때, 데이터를 저장할 메모리 공간이 필요한데 일부 데이터는 컴파일 시점에 크기가 알려져 있어 정적으로 할당될 수 있다.(ex:전역변수) 하지만 많은 경우 실행 시점에서 데이터의 크기를 알 수 없거나 데이터의 크기가 실행 중에 변할 수 있다. 이럴 때 동적 메모리 할당을 사용한다. 사용이 끝난 메모리에 대해서넌 free함수로 메모리를 해제해주어 동적으로 관리해 더욱 깔끔하고 메모리를 효율적으로 사용할 수 있다.

특징

  • 유연성: 프로그램이 필요한 만큼 메모리를 할당받을 수 있다.
  • 제어: 프로그래머는 언제 메모리를 할당하고 해제할지 적접 결정할 수 있다.
  • 책임: 프로그래머는 할당도니 메모리를 적절히 관리해야 하며, 사용이 끝난 메모리는 명시적으로 해제해야 한다.
  • 메모리 누수: 동적으로 할당된 메모리가 적절히 해제되지 않으면 메모리 누수가 발생할 수 있다.

힙 메모리

힙 메모리 영역은 동적으로 할당되는 메모리를 관리하는데 사용되는, 프로그램 데이터 세그먼트 내의 영역이다.

아래 사진은 일반 적인 메모리 영역이다.

이런 메모리 영역은 프로그램을 실행할 때마다 생성되어 프로그램에 할당된다.

힙 영역은 런 타임에 프로그램의 필요 메모리 크기에 따라 결정되고
스택 영역은 컴파일 타임에 크키가 결정된다.

관리

힙은 운영 체제의 메모리 관리 서브 시스템에 의해서 관리가 되어진다. 메모리 할당 요청을 받아 할당하고 할당된 메모리는 개발자가 사용하게 된다.

메모리 할당 요청

Heap 영역은 운영 체제의 시스템에 의해서 관리가 되어지지만 메모리가 생성된 후 에는 사용자가 직접 요청과 해제를 통해서 관리할 수 있는 메모리 영역이다. 때문에 직접 할당과 해제의 요청을 진행하면서 메모리를 관리해야 한다.

일반적으로,
C : malloc, free 메모리 관리 라이브러리를 통해서 요청과 해제가 이루어지고,
C++ 이 후에 나온 언어들은 new, delete 키워드를 사용하여 할당을 요청하게 된다.(언어 별로 다를 수 있음)

구조

Heap 영역은 일반적으로 알고있는 자료구조 Heap(우선순위 큐)와는 전혀 다른, 전혀 무관한 개념이다.

  • 힙은 메모리 상에서 특정 순서나 구조 없이 할당과 해제가 이루어지는 무질서한 영역이다.
  • 할당된 메모리 블록은 할당된 크기와 상태 등을 기술하는 메타데이터로 관리된다.
  • 메모리 블록 사이에 작은 빈 공간이 생겨날 수 있는데, 이를 프래그먼테이션이라고 한다.

영역 크기

  • 힙은 프로그램의 실행 도중에 성장하고 축소할 수 있다.
  • 프로그램이 시작할 때 힙의 크기는 보통 제로 또는 매우 작다.
  • 힙은 동적 할당 요청에 따라 성장하며, 할당된 메모리가 해제되면서 축소 될 수 있다.

문제점

힙 메모리는 할당과 해제가 반복됨에 따라서 단편화가 이루어지게 되는데 이때 문제가 발생하게 된다.

  • 외부 단편화: 사용 가능한 메모리가 충분하지만, 연속적인 공간이 아니어서 큰 메모리 할당 요청을 할 수 없는 상태. ( 페이징 기법으로 해결이 가능하다. )
  • 내부 단편화: 할당된 블록의 크기가 요청된 크기보다 클 때 발생하여, 사용되지 않는 메모리 공간이 발생.

성능

  • 힙 할당은 스택 할당보다 일반적으로 느리며, 이는 메모리를 찾고, 관리하는 추가적인 작업이 필요하기 때문이다.
  • 메모리 누수는 힙 메모리 할당에서 주의해야 할 중요한 이슈이다. 할당된 메모리가 필요 없어졌을 때해제하지 않으면, 메모리 누수가 발생하여 프로그램의 사용 가능 메모리가 점점 줄어들 수 있다.

0개의 댓글