[Data Structure] heap과 stack메모리
메모리
메모리 관리는 프로그램에 있어 성능과 안정성에 큰 영향을 끼친다. 코드를 실행하려면 메모리에서 해당 코드를 읽어야하고, 코드에서 필요한 데이터들을 메모리에서 가져와야한다. 이에 따라 메모리를 여러 영역으로 나누고 각기 다른 방법을 통해 각 영역에 접근을 하게 된다.
메모리 영역
| 힙 영역 |
| 스택 영역 |
| 코드 영역 |
스택 메모리
주로 정적 메모리를 할당하는 영역이며, 함수 호출시 자동으로 호출되고, 함수 종료시 자동으로 해제되는 특징이 있다. 이를 컴파일러가 관리한다.
관리가 자동적으로 이루어지기 때문에 메모리 누수가 일어나지 않음
메모리 크기를 한번에 먹기 때문에, 많은 메모리 블록을 한번에 할당이 불가능하고, 함수 호출 깊이에 따라 스택 오버플로우가 발생할 수 있다.
스택이라 불리는 이유
void fun_1(){ int x; int y; } void fun_2(){ int a; int b; fun_1(); } int main(){ fun_2() return 0; }위와 같은 코드가 있을때 메모리와 스택 메모리에서 어떤 일이 벌어질지 보자
우선 코드 영역에서 코드를 읽어 메인 함수를 호출하고 fun_2()를 호출하며 stack에 올린다.
스택 메모리 영역
| 함수 호출 | 변수 | 설명 |
|---|---|---|
main |
main 함수의 스택 프레임 생성 |
|
fun_2 함수 호출 |
||
fun_2 |
a |
fun_2 함수의 스택 프레임에 할당된 지역 변수 a |
b |
fun_2 함수의 스택 프레임에 할당된 지역 변수 b |
|
fun_1 함수 호출 |
||
fun_1 |
x |
fun_1 함수의 스택 프레임에 할당된 지역 변수 x |
y |
fun_1 함수의 스택 프레임에 할당된 지역 변수 y |
|
fun_1 함수 종료, 스택 프레임 해제 |
||
fun_2 |
fun_2 함수 종료, 스택 프레임 해제 |
|
main |
main 함수 종료, 스택 프레임 해제 |
fun_1이 가장 늦게 호출 되었지만, 가장 먼저 종료되었다. LIFO의 형식을 따르는 메모리 영역이기에 stack메모리 영역이라고 부른다.
힙 메모리
- 주로 동적 메모리 할당 영역으로, 코더의 필요에 따라 할당하고 해제한다.
malloc,free(C 언어),new,delete(C++) 등을 사용하여 프로그래머가 직접 관리.- 포인터를 사용해서 접근한다. 스택 영역에 포인터 변수를 할당하고 힙 메모리에 동적메모리를 할당하여 사용.
힙과 스택 메모리의 차이
| Parameter | STACK | HEAP |
|---|---|---|
| Basic | 메모리는 연속된 블록으로 할당됨 | 메모리는 임의의 순서로 할당됨 |
| Allocation and De-allocation | 컴파일러 지시에 의해 자동으로 할당 및 해제 | 프로그래머에 의해 수동으로 할당 및 해제 |
| Cost | 적음 | 많음 |
| Implementation | 쉬움 | 어려움 |
| Access time | 더 빠름 | 더 느림 |
| Main Issue | 메모리 부족 | 메모리 단편화 |
| Locality of reference | 훌륭함 | 적당함 |
| Safety | 스레드 안전, 저장된 데이터는 소유자만 접근 가능 | 스레드 안전하지 않음, 저장된 데이터는 모든 스레드에 노출됨 |
| Flexibility | 고정 크기 | 크기 조절 가능 |
| Data type structure | 선형 구조 | 계층 구조 |
| Preferred | 배열에서는 스택 메모리 할당이 선호됨 | 연결 리스트에서는 힙 메모리 할당이 선호됨 |
| Size | 힙 메모리보다 작음 | 스택 메모리보다 큼 |