티스토리 뷰
어떤 스타트업 기업 면접에서 받았던 질문이었다
" 스택 과 힙의 차이가 뭔지 설명해보실래요? "
굉장히 난감했다...
이미 백지화된 머릿속에서는 그나마 알고 있는 자료구조의 스택과 힙에 대해서 떠올리기 위해 안간힘을 쓰는 중이었다
그러나 그건 적절한 대답이 아니었다
답을 먼저 제시하자면,
스택은 정적 메모리 구조를 가지고 힙 영역은 동적 메모리 구조를 가진다
(즉 , 자료구조에서의 스택이나 힙에 대해 물어본 것이 아니고 스택영역과 힙영역에서 메모리의 할당되는 메커니즘에 대한 대답을 요구한 것)
그렇다면 스택영역과 힙영역에 대해 알아보자.
스택영역
- 함수 내에 정의된 지역 변수와 매개변수 등이 저장된다
- 메소드 호출시 마다 각각의 스택프레임(그 메서드 만을 위한 공간)이 생성
- 메소드 수행이 끝나면 프레임 별로 삭제
- 프로그램에서 함수는 다른 함수를 호출하고 그결과를 자신을 호출한 함수에 반환해준다
- 따라서 스택구조로 함수의 호출이 차곡차곡 메모리에 쌓이고 처리가 끝나면 메모리에서 해제된다
- 이렇게 스택의 구조를 활용하여 함수의 지역 변수 메모리를 관리하면 위의 메커니즘을 쉽게 구현 할 수 있기 때문에 스택 형태로 영역을 만들어 활용
- 스택영역 (스택 세그먼트) 라고 부른다
힙영역
- 관리가 가능한 데이터 외에 다른 형태의 데이터를 관리하기 위한 빈공간(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 |
- Total
- Today
- Yesterday
- Stack
- hash algorithm
- 스택
- mac mariadb 설치
- 큐
- org.springframework.beans.factory.BeanDefinitionStoreException
- spring boot 시작 에러
- spring boot org.springframework.beans.factory.BeanDefinitionStoreException
- 스프링 부트 시작 에러
- springframewor
- mariadb데이터 타입
- mac mariadb
- 해시알고리즘
- mysql데이터타입
- 400 badgateway
- 자료구조
- mac db설치
- mysql데이터
- 스프링 부트 에러
- mysql 세팅
- mariadb
- Data Structure
- hash알고리즘
- 데크
- mariadb설치
- 알고리즘
- 400 error
- HTTP
- mysql 데이터 타입
- mariadb 데이터타입
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |