C언어의 메모리 구조
메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함.
함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반호나 주소값, 함수에서 선언된 지역변수 등이 저장됨.
이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라고 함.
이런 스택 프레임 덕분에 함수의 호출이 모두 끝난 후, 해당 함수가 호출되기 이전 상태로 돌아갈 수 있음.
스택 프레임의 동작 방식
int main(void)
{
func1(); // func1() 호출
return 0;
}
void func1()
{
func2(); // func2() 호출
}
void func2()
{
}
이러한 동작을 하는 코드가 있다고 해보자.
1. 프로그램이 실행되면 main() 함수가 호출되고 main() 함수의 스택 프레임이 스택에 저장.
2. func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장.
3. func2() 함수를 호출하면 해당 함수의 스택 프레임에 스택에 저장.
4. func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수읭 스택 프레임만이 스택에서 제거.
5. func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거.
6. main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료.
스택 오버플로우(Stack Overflow)
앞서 함수의 재귀 호출이 무한히 반복되면, 해당 프로그램은 스택 오버플로우(Stack overflow)에 의하여 종료됨.
만약 재귀 호출이 무한히 반복되면, 위 그림에서 Step 3 이후로는 재귀 호출에 의한 스택 프레임이 계속해서 쌓이게 됨.
이렇게 계속 쌓이게 되면 스택의 모든 공간을 다 차지하고 난 후 더 이상의 여유 공간이 없을 때 또 다시 스택 프레임을 저장하게 되면, 해당 데이터는 스택 영역을 넘어가서 저장된다.
이렇게 해당 스택 영역을 넘어가도 데이터가 저장될 수 있으면, 해당 프로그램은 오동작을 하게 되거나 보안상 큰 취약점을 갖게됨.
C언어에서는 실행 중인 프로그램에서 스택 오버플로우가 발생하면, 에러를 발생시키고 강제 종료를 시키게 됨.
출처
'컴퓨터 과학(ComputerScience)' 카테고리의 다른 글
가비지 컬렉션(Garbage Collection) (0) | 2022.07.24 |
---|---|
JVM(자바 가상 머신)의 내부 구성 및 동작 원리 (0) | 2022.07.24 |
캐시 메모리(Cache Memory) 그리고 캐시의 지역성(Cache Locality) (0) | 2022.07.23 |
메모리의 동적할당(C언어) (0) | 2022.07.23 |
C언어의 메모리 구조 (0) | 2022.07.22 |
최근댓글