티스토리 뷰

Development/면접질문

Heap영역 & Stack영역

김드랍 2018. 1. 18. 15:46

어떤 스타트업 기업 면접에서 받았던 질문이었다


" 스택 과 힙의 차이가 뭔지 설명해보실래요? "


굉장히 난감했다...


이미 백지화된 머릿속에서는 그나마 알고 있는 자료구조의 스택과 힙에 대해서 떠올리기 위해 안간힘을 쓰는 중이었다


그러나 그건 적절한 대답이 아니었다


을 먼저 제시하자면,

스택은 정적 메모리 구조를 가지고 힙 영역은 동적 메모리 구조를 가진다 

(즉 , 자료구조에서의 스택이나 힙에 대해 물어본 것이 아니고 스택영역과 힙영역에서 메모리의 할당되는 메커니즘에 대한 대답을 요구한 것)


그렇다면 스택영역과 힙영역에 대해 알아보자.


스택영역

- 함수 내에 정의된 지역 변수와 매개변수 등이 저장된다

- 메소드 호출시 마다 각각의 스택프레임(그 메서드 만을 위한 공간)이 생성

- 메소드 수행이 끝나면 프레임 별로 삭제

- 프로그램에서 함수는 다른 함수를 호출하고 그결과를 자신을 호출한 함수에 반환해준다

- 따라서 스택구조로 함수의 호출이 차곡차곡 메모리에 쌓이고 처리가 끝나면 메모리에서 해제된다

- 이렇게 스택의 구조를 활용하여 함수의 지역 변수 메모리를 관리하면 위의 메커니즘을 쉽게 구현 할 수 있기 때문에 스택 형태로 영역을 만들어 활용

- 스택영역 (스택 세그먼트) 라고 부른다


힙영역

- 관리가 가능한 데이터 외에 다른 형태의 데이터를 관리하기 위한 빈공간(Space)

- 즉 동적할당(Dynamic Allocation)에 의해 생성된 동적 변수(Dynamic Variables)를 관리하기 위한 영역

- new연산자로 생성된 객체와 배열을 저장하는 공간

- 클래스 영역에 로드된 클래스만 생성가능

- GarbageCollector를 통해 메모리 반환 (*GarbageCollector는 이전 포스팅 참고!)

- java나 c++등에서 'new', c에서 'malloc', 'calloc' 을 통해 동적으로 생성되는 변수를 저장하기 위해 할당 되는 영역




데이터 영역과 스택영역은 컴파일러가 미리 공간을 예측하고 할당할 수 있지만 동적 변수는 어느 시점에 어느정도의 공간으로 할당될 지 정확하게 예측할 수 없기 때문에 프로그램 실행중(Runtime 시점)에 결정






*부록(?) 

Stack에 대해 조금 더 자세히 알기

- 스택이라는 단어는 차곡차곡 쌓여진 더미를 의미하는데, 이는 가장 먼저 입력된 데이터가 가장 아래쪽에 쌓이고 나중에 입력된 데이터는 그위에 쌓이게 된다는 구조상 특징을 나타낸다


PUSH.POP

- 스택에 새로운 자료를 추가하는 것을 PUSH라고 부른다

- 스택에 저장된 값을 다시 빼내어 내는 것을 POP이라고 부른다

- OS에 기본으로 구현되어 있는 스택을 "시스템 스택" 이라고 한다

- 시스템 스택의 기본데이터 크기는 프로그램의 레지스터 크기와 일치한다


TOP

- TOP이란 스택에 쌓인 데이터중 가장 높은 위치의 메모리 주소값(실제로는 가장 낮은 주소값)을 가리키는 용어

- 데이터 양의 변화에 따라 TOP의 위치는 계속해서 변하게 되며 데이터가 추가되거나 제거될 때 기준이 되는 위치

- TOP은 스택에서 데이터가 추가되거나 제거되는 위치를 가리키고 있기 때문에 Stack Pointer라고 불리기도 한다


BOTTOM

- BOTTOM은 스택에서 가장 아랫 부분에 해당하는 메모리 주소값(실제로는 가장 높은 주소값)을 가리키는 용어

- TOP 과 달리 스택의 가장 아랫 부분만을 가리키기 때문에 항상 동일한 값이 유지된다

- BOTTOM 이 TOP과 같아진다면 스택이 비어있다는 것을 의미하며 더이상 POP명령을 수행할 수 없다

이처럼 TOP은 메모리 맵의 낮은 주소 쪽인 왼쪽, BOTTOM은 높은 주소쪽인 오르쪽에 해당한다

새로운 데이터가 추가될 수록 TOP에 해당하는 메모리 주소값은 점점 작아지게되며 BOTTOM은 항상 커널과 맞닿는 부분에 해당

- 스택이 아무리 커져도 커널을 건드리지 않는다

- 힙영역은 스택과 달리 데이터가 추가될 수록 더 큰 메모리 주소를 할당 받게 됩니다 이처럼 스택 영역과 힙영역이 공유라이브러리 영역을 가운데 두고 서로 마주보는 형태를 갖기 때문에 메모리 공간을 알뜰하게 활용할 수 있게 되기 때문





* Stack Overflow

- Stack이 Heap영역을 침범하는 경우

* Heap Overflow

- heap이 주소값을 채워져 오다가 Stack 영역을 침범하는 경우



'Development > 면접질문' 카테고리의 다른 글

프로세스와 쓰레드의 차이  (0) 2017.12.08
Index란?  (0) 2017.06.30
댓글