CS

CS) 스택 프레임

zzugest1 2026. 1. 14. 20:47

 

스택 프레임

스택 프레임이란 함수 하나가 실행되기 위해 프로세스의 스택 영역에 할당되는 전용 메모리 칸을 말한다.

 

함수가 호출될 때마다 이 함수만을 위한 전용 공간이 하나씩 새로 생기는데 이를 스택 프레임이라고 부른다.

 

스택 프레임의 구성 요소로는 아래와 같다.

 

  • 반환 주소 : 함수 실행이 끝나면 Code 영역의 어디로 돌아가야 하는지 적혀 있는 주소
  • 매개 변수 : 함수를 호출할 때 넘겨준 인자값들
  • 지역 변수 : 함수 내부에서 선언한 변수들

스택 프레임은 이름에 맞게 스택 자료구조 형태를 띄는데 스택은 후입선출로 가장 마지막에 들어간 요소가 가장 먼저 나가는 특성이 있다. 그래서 스택 프레임도 데이터가 쌓이는데 매개 변수 -> 반환 주소 -> 지역 변수 순으로 쌓인다.

 

 

 

// 덧셈 함수 
int Add(int a, int b) {
    int result = a + b;  // 지역 변수 선언
    return result;
}

// 메인 함수 
int main() {
    int x = 10;
    int y = 20;
    
    // 여기서 Add 함수를 호출
    int z = Add(x, y); 
    
    return 0;
}

 

 

위와 같은 간단한 C++ 코드가 있다고 가정했을 때 이를 실행하면 main 함수 스택 프레임은 생성이 된 상태이다.

이 스택 프레임에는 운영체제로 돌아갈 반환 주소와 지역 변수 x,y 가 들어가 있다.

 

그리고 int z =  Add(x,y)에서 Add 함수도 호출하므로 Add 함수의 스택 프레임도 생성이 된다.

 

Add 함수의 스택 프레임에는 먼저 매개 변수 x, y 중 오른쪽에 있는 y가 먼저 쌓인다.

그 다음 main 함수의 반환 주소값과 지역 변수 result가 스택 프레임에 쌓인다.

 

Add 함수가 return을 만나거나 } 끝에 도달했다면 main 함수로 돌아갈 반환 주소를 읽어서, CPU가 다시 main 함수로 돌아가서 main 함수를 이어서 실행한다. 그리고 Add 함수 스택 프레임을 Pop(정리)한다.

 

이렇게 main에 여러 함수가 있어도 각 함수별 스택 프레임을 생성해서 꺼내서 쓰기 때문에 효율적으로 실행이 되는 것이다.

 

 

 

 

스택 오버플로우

 

하지만 스택 프레임의 공간은 한정적이여서 스택 프레임이 꽉 차버리면 터질 것이다. 할당된 스택 메모리 공간의 한계를 넘어서면 스택 오버플로우(Stack Overflow)가 일어날 것이다.

 

void DiveDeep() {
    int a[1000]; // 지역 변수 
    
    // 종료 조건
    DiveDeep(); // 나 자신을 또 호출
}

int main() {
    DiveDeep(); // 시작
    return 0;
}

 

 

만약 위와 같이 함수가 종료시 자기 자신을 또 호출하는 무한 루프에 빠지는 코드가 있다고 가정을 하면,

DiveDeep 함수 스택 프레임이 생성되고 이 스택 프레임의 } 끝에 도달하기전에 또 함수를 호출해서 스택 프레임에 또 쌓는다.

이렇게 무한히 스택 프레임에 쌓이기 때문에 결국 터져버리는 것이고 이를 스택 오버플로우라 한다.

 

'CS' 카테고리의 다른 글

CS) 데드락(교착 상태)  (0) 2026.01.15
CS) CPU 스케줄링  (0) 2026.01.14
CS) 프로세스와 스레드  (1) 2026.01.14
CS) 캐시 메모리  (0) 2026.01.14
CS) 메모리  (0) 2026.01.14