ILoveCoffee, ILoveJava

힙(heap) 메모리

jeeyong 2008. 1. 19. 15:34

heap memory는 컴퓨터 사전을 찾아보면 이렇게 정의되어 있습니다.

 " 프로그램의 실행 도중에 요구되는 기억 장소를 할당하기 위하여 운영 체제에 예약되어 있는 기억장소 영역, 프로그램에서 실행 도중 자료를 저장하기 위하여 기억장소를 요청하게 되면 운영 체제에서는 힙에 존재하는 기억장소를 프로그램에 할당한다. 그리고 프로그램에서 기억 장치를 더 이상 필요로 하지 않는 경우에는 앞에서 할당 받았던 기억 장소를 운영체제에 반납하게 되는데, 이때 운영체제에서는 반납된 기억 장소를 다시 힙에 연결하게 된다. 힙에 대한 기억 장소는 포인터를 통해 동적으로 할당되거나 반환이 되는데 연결 리스트, 트리, 그래프 등과 같이 동적인 특성을 가지고 있는 자료구조에서 널리 사용된다. "

 길다...ㅡㅡ;; 한마디로 프로그램이 필요로 할때 마다 저장소를 빌려준다는 뜻 입니다. 물론 다쓰고 난후엔 반납야합니다. DVD샵 처럼 연체료를 물지는 않겠지만 나중에 더 큰 문제는 프로그램이 다운될 수 있습니다.

 좀더 깊은 대화를 나누기 위해선 아래글을 읽으시면 됩니다. 적지않은 양의 글이기 때문에 적당한 각오는 필수입니다.^^;

 은 프로그램이 실행될 때까지 알 수 없는 가변적인 양만큼의 데이터를 저장하기 위해 프로그램의 프로세스가 사용할 수 있도록 미리 예약되어 있는 메인 메모리의 영역입니다. 예를 들면 하나의 프로그램은 처리를 위해 한명이상의 사용자로부터 서로 다른 양의 입력을 받을 수 있으며 즉시 모든 입력데이터에 대해 처리를 시작합니다. 운영체제로 부터 이미 확보된 일정량의 힙 저장공간을 가지고 있으면 저장과 관련된 처리를 좀 더 쉽게 할 수 있으며 일반적으로 필요할 때마다 운영체제에게 매번 저장공간을 요청하는 것보다 빠르게 됩니다.
 프로세스는 필요할 때 heap 블록을 요구하고 더이상 필요 없을 때 반환하며 이따금씩 자투리 모으기를 수행함으로써 자신에게 할당된 heap 을 관리하기도 합니다. 여기서 자투리 모으기란 더 이상 사용되지 않는 블록들을 사용 가능한 상태로 만들고 또 한 heap내의 사용 가능한 공간을 인지함으로써 사용되지 않는 작은 조각들이 낭비되지 않도록 하는 것입니다.
 힙이란 컴퓨터의 기억장소에서 그 일부분이 프로그램들에 할당되었다가 회수되는 작용이 되풀이 되는 영역입니다. 스택영역은 엄격하게 후입선출(LIFO)방식으로 운영되는데 비해 힙은 프로그램들이 요구하는 블록의 크기나 요구/횟수 순서가 일정한 규칙이 없다는 점이 다릅니다. 대개 힙의 기억장소는 포인터 변수를 통해 동적으로 할당받고 돌려줍니다. 이는 연결 목록이나 트리, 그래프 등의 동적인 자료 구조를 만드는데 꼭 필요한 것입니다. 그럼 힙 메모리를 프로그램을 사용할 수 있는 자유메모리라고 할 수 있습니다. 프로그램 실행 시에 함수로 내는 데이터 등을 일시적으로 보관해 두는 소량의 메모리와 필요시 언제나 사용할 수 있는 대량의 메모리가 있습니다. 이때, 소량의 메모리를 '스택'이라 하고 대량의 메모리를 '힙' 이라고 합니다. 이 '힙' 이 없어지면 메모리 부족으로 '이상종료'를 하게 됩니다.
 프로세스에 exe 이미지가 로드되고, 할당되고, 이것저것 필요한 동적 라이브러리가 로드되고 사용되지 않는 미사용구간이 있는 것은 분명한데 그 미사용 영역이 '힙' 이라고 합니다. 프로그램을 짤 때 new나 malloc() 함수를 이용한 동적 할당을 하게 되면 힙 영역이 사용 가능하도록 되는 것입니다. 필요한 메모리 사이즈만큼 OS에게 할당해 달라고 부탁할 수도 있으며, 사용을 다 했으면 다시 OS에게 넘겨줘야 합니다.
예를 들어
    char *c = new char[1000];
위와 같은 코드가 런타임시 힙영역에 메모리를 1000바이트 할당하는 동작을 합니다. (char == 1바이트(8bit))  물론 할당을 하였으면 반환도 해주어야 겠지요. 참고로 힙을 마구 할당하고 반환 시키다가 보면 선형 메모리의 중간중간이 끊어지게 됩니다. 즉 다른말로 표현하자면 메모리 블록이 여러조각으로 나뉘게 되어 비효율적으로 되어버리기도 합니다. 힙 메모리는 프로그램이 종료 될 때까지 관리하고 유지 되는 메모리 영역이기 때문에 전역함수를 쓰지 않고, 프로그램 내에서 지속적으로 메모리를 참조해야 할 경우 힙 영역에 메모리를 할당 받으면 됩니다.