스택 프레임
스택 프레임이란 함수 하나가 실행되기 위해 프로세스의 스택 영역에 할당되는 전용 메모리 칸을 말한다.
함수가 호출될 때마다 이 함수만을 위한 전용 공간이 하나씩 새로 생기는데 이를 스택 프레임이라고 부른다.
스택 프레임의 구성 요소로는 아래와 같다.
- 반환 주소 : 함수 실행이 끝나면 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 |