내가 몰랐던 힙과 스택

보통 힙과 스택을 이야기할 때, 자료구조에서 사용하는 범용적 단어와 실제 프로그래밍 언어의 구현체를 혼용하여 쓰곤 한다. 자료구조의 힙과 스택은 컴퓨터 과학에서 이야기하는 범용적인 단어이고, 프로그램에서는 내 프로그램이 사용하는 메모리의 특정 영역을 가리키는 말이다. 힙과 스택은 자료구조이므로 여러 형태의구현할 수 있다.

참고로, 언어 표준에서는 스택이나 힙이 RAM에 있을 것이라는 보장을 하지 않는다. 심지어 고급 언어의 대표격인 C에서는 스택이라는 말이 나오지도 않는다. 힙과 스택은 디스크나 제 3의 영역에 존재할 수 있다는 말이다. 그러므로, 메모리에서 스택은 위로(주소값이 점점 작아지고) 힙은 아래로(주소값이 점점 커지고) 자란다는 것도 틀린 말일 수 있다. 다만, 일반적으로 저렇게 구현되어있을 뿐이다.

프로그램에서 말하는 스택은 각 스레드에서 함수 실행을 위해 사용되는 것으로 콜 스택(call stack)이 더 정확한 표현이다. 이 스택은 스레드가 종료될 때 반환된다. 스택의 크기는 언어, 컴파일러, O/S와 아키텍쳐에 따라 달라진다. 일반적으로 윈도우에 C 언어(비주얼 스투디오)라면 1 MB가 제한 값이다. 리눅스와 C 언어라면 4 MB가 기본 값이다.  얼핏 보면 작아보일 수 있지만, 무한히(혹은 엄청나게 많이) 메소드가 호출되거나 내부 변수로 엄청나게 큰 메모리를 소비하지 않는 이상 stack overflow가 발생하는 경우는 없다.

최근의 언어에서 힙은 추상화된 레벨에서 구현되어 있어, 최소/최대 크기나 실제 구현된 위치를 염려할 필요가 없다. 주로 RAM이나 디스크에 구현되어 있을 것이다.

스택은 스레드별로 할당되기 때문에, 스레드가 종료될 때 반환(reclaim)되며, 스택을 위한 공간이 부족한 경우에는 처음부터 스레드가 시작되지 않는다. 힙은 어플리케이션 별로 할당되기 때문에, 어플리케이션이 종료될 때 환수 된다. 이처럼 스코프가 다르기 때문에 힙은 스택과 다르게 동기화 이슈가 존재한다.

그 외의 자세한 내용은 참조에 포함된 링크들을 참조하자. 이미 좋은 글이 많기 때문에, 다시 옮길 필요가 없다.

참조

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.