CS

메모리 구조 (Stack, Heap)

이게왜 2024. 9. 29. 22:39

- 목차 -

1. 메모리 구조의 개요

2. 스택 (Stack) 영역

3. 힙 (Heap) 영역

4. 스택과 힙의 차이

5. 스택과 힙 메모리 관련 오류


1. 메모리 구조 / 스택(Stack)과 힙(Heap) 영역

프로그램이 실행될 때, 프로그램이 사용하는 메모리는 크게 스택(Stack)과 힙(Heap) 두 가지 영역으로 나눌 수 있습니다.

이 두 영역은 메모리를 관리하는 방식이 다르며, 각각의 역할과 특성다릅니다. 이를 이해하는 것은 프로그램의 성능, 메모리 관리, 그리고 오류 방지를 위해 매우 중요합니다.


1.1 메모리 구조의 개요

프로그램이 실행될 때 사용하는 메모리 공간은 일반적으로 다음과 같이 나뉩니다

 

1. 코드(Code) 영역 : 실행할 프로그램의 코드(명령어)가 저장되는 영역입니다. 컴파일된 바이너리 코드가 이 영역에 로드되어 실행됩니다.

2. 데이터(Data) 영역 : 초기화된 전역 변수와 정적 변수(static)가 저장됩니다.

3. BSS(Block Started by Symbol) 영역 : 초기화되지 않은 전역 변수와 정적 변수가 할당되는 영역입니다.

4. 힙(Heap) 영역 : 동적 메모리 할당에 사용되는 공간입니다. 프로그램 실행 중 malloc, calloc, new 등과 같은 함수를 통해 필요한 만큼의 메모리를 할당받고 사용합니다.

5. 스택(Stack) 영역 : 함수 호출 시 사용되는 지역 변수, 매개변수, 그리고 함수 호출 정보를 저장하는 공간입니다. Last In, First Out(LIFO) 구조로 동작합니다.

 

+-------------------+
|      코드         |
+-------------------+
|      데이터      |
+-------------------+
|      BSS         |
+-------------------+
|      힙            |  ← 힙은 낮은 주소에서 높은 주소로 확장
|                     |
|                     |
|      빈 공간    |
|                     |
|                     |
|      스택         |  ← 스택은 높은 주소에서 낮은 주소로 확장
+-------------------+

2. 스택(Stack) 영역

스택(Stack)은 함수 호출 시 지역 변수와 함수의 호출 정보를 저장하는 메모리 영역입니다.

LIFO(Last In, First Out) 구조를 가지며, 함수가 호출될 때마다 스택 프레임이 생성되고, 함수가 종료되면 스택 프레임이 해제됩니다.

자동 메모리 관리가 이루어지며, 지역 변수나 매개변수는 함수가 실행되는 동안에만 존재하고 함수가 종료되면 사라집니다.


2.1 스택의 특징

자동 메모리 할당 및 해제 : 함수가 호출되면 스택에 메모리가 자동으로 할당되고, 함수가 끝나면 해당 메모리가 자동으로 해제됩니다.

고정 크기 : 스택은 정적 할당을 지원하므로, 변수의 크기와 할당이 컴파일 시에 결정됩니다.

빠른 메모리 접근 : 스택은 메모리를 연속적으로 할당하며, 메모리 할당과 해제가 매우 빠릅니다.

제한된 공간 : 스택은 메모리 공간이 상대적으로 제한적이며, 너무 많은 메모리를 사용하면 스택 오버플로(Stack Overflow)가 발생할 수 있습니다. 이는 특히 깊은 재귀 호출이 일어날 때 문제가 됩니다.

 

스택 메모리 사용 Ex)

void example() {
    int a = 10;  // 지역 변수 a는 스택에 할당됨
    int b = 20;
    // 함수가 끝나면 a와 b는 스택에서 해제됨
}

3. 힙(Heap) 영역

힙(Heap)은 동적 메모리 할당을 관리하는 영역입니다.

프로그램이 실행되는 동안, 필요한 만큼의 메모리를 할당하고, 필요하지 않을 때는 수동으로 해제합니다.

malloc(), calloc(), new 등의 함수를 통해 메모리를 할당하며, free() 또는 delete 함수를 통해 해제해야 합니다.


3.1 힙의 특징

동적 메모리 할당 : 프로그램이 실행 중인 동안, 필요한 크기의 메모리를 동적으로 할당할 수 있습니다. 프로그램이 실행되는 동안 유연하게 메모리를 관리할 수 있습니다.

메모리 관리 책임 : 힙 메모리는 사용자가 직접 할당하고 해제해야 합니다. 메모리를 할당한 후 해제하지 않으면 메모리 누수(Memory Leak)가 발생할 수 있습니다.

느린 접근 속도 : 힙 메모리는 스택보다 접근 속도가 느립니다. 힙은 비연속적인 메모리 블록으로 관리되기 때문에, 스택과 비교해 메모리 접근 시간이 길어질 수 있습니다.

제한 없는 크기 : 스택과 달리 힙은 사용 가능한 메모리만큼 확장할 수 있기 때문에 대량의 데이터를 처리하는 데 적합합니다. 하지만 무한정 사용할 수 있는 것은 아니며, 시스템 메모리가 부족하면 메모리 부족 오류가 발생할 수 있습니다.

 

힙 메모리 사용 Ex)

void example() {
    int* ptr = (int*)malloc(sizeof(int) * 10); // 동적 메모리 할당 (힙)
    if (ptr == NULL) {
        // 메모리 할당 실패 시 처리
    }
    // 메모리 사용
    free(ptr); // 동적 메모리 해제
}

4. 스택과 힙의 차이점

항목 스택 (Stack) 힙 (Heap)
메모리 할당 컴파일 시 고정 크기로 할당 런타임에 동적으로 크기 지정 가능
메모리 관리 자동 (함수 종료 시 자동 해제) 수동 (사용자가 직접 해제)
속도 빠름 상대적으로 느림
구조 LIFO (Last In, First Out) 비연속적 (동적 블록)
크기 제한 제한적 (스택 오버플로 발생 가능) 시스템 메모리만큼 사용 가능
주 사용 용도 지역 변수, 함수 호출 관리 동적 데이터, 대규모 메모리 할당

5. 스택과 힙 메모리 관련 오류

스택 오버플로(Stack Overflow) : 함수 호출이 너무 깊거나, 지나치게 큰 지역 변수를 사용할 때 발생합니다. 스택 메모리가 한계에 도달하면 프로그램이 비정상적으로 종료될 수 있습니다.

메모리 누수(Memory Leak) : 힙에서 할당한 메모리를 해제하지 않고 사용하지 않을 때 발생합니다. 메모리 누수가 발생하면 프로그램이 지속적으로 메모리를 점유하여 결국 시스템 메모리가 부족해집니다.

더블 프리(Double Free) : 이미 해제한 메모리를 다시 해제하려고 시도할 때 발생하는 오류입니다. 이는 프로그램의 비정상적인 종료를 초래할 수 있습니다.

'CS' 카테고리의 다른 글

디자인 패턴  (4) 2024.10.28
IP 주소  (0) 2024.10.13
메모리  (0) 2024.09.29
운영체제 (System Call, Modebit, Trap, Interrupt, DMA Controller)  (2) 2024.09.29