메모리 구조
프로그램이 실행되기 위해서는 프로그램이 메모리에 로드 되어야 합니다.
또, 사용되는 변수 등을 저장할 메모리도 필요합니다.
그렇기에 운영체제는 4개의 메모리 공간으로 나눠 제공하고 있습니다.
1. 코드(code) 영역
2. 데이터(data) 영역
3. 스택(stack) 영역
4. 힙(heap) 영역
코드(code) 영역
소스코드가 저장되는 영역으로 텍스트 영역이라고도 부릅니다.
0과 1로 이루어진 기계어 형태로 저장됩니다.
실행 파일을 구성하는 함수, 제어문, 상수 등이 저장됩니다.
데이터(data) 영역
전역 변수와 정적 변수(static)이 저장되는 영역입니다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.
스택(stack) 영역
함수 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역입니다.
스택 영역은 함수 호출과 함께 할당되며, 함수 호출이 완료되면 소멸합니다.
스택에 저장되는 함수의 호출 정보를 스택 프래임(stack frame)이라고 합니다.
스택 영역은 푸쉬(push)을 통해 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다.
후입선출(LIFO) 방식에 따라 동작, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.
힙(Heap) 영역
이 공간에 메모리를 할당하는 것을 '동적 할당'이라고 부릅니다.
사용자의 의해 메모리 공간이 동적으로 할당되고, 해제됩니다.
대표적으로 객체의 참조값이 저장됩니다.
정리
메모리 상주 기간 | 저장하는 것들 | |
코드 영역 | 프로그램 실행 중 | 프로그램의 코드 |
데이터 영역 | 프로그램 시작하고 나서 종료 되기 전까지 | 정적(static) 변수, 전역 변수 |
스택 영역 | 함수 호출하고 나서 실행 종료 되기 전까지 | 지역 변수, 매개 변수 |
힙 영역 | 프로그래머가 원하는 때에 할당하고 소멸 가능 | 참조형 객체, new 생성자를 통해 할당되는 객체들 |
Stack VS Heap
스택 | 힙 | |
접근 속도 | 매우 빠른 접근 | (상대적으로) 느린 접근 |
메모리 크기 | 크기 제한 있음 (OS에 따라 다름.) | 메모리 크기 제한이 없음 |
삭제 | 효율적인 공간 관리를 위해 LIFO로 삭제됨 | GC가 차후 삭제 (사용자가 직접 관리해야하는 경우가 생길 수도 있음.) |
변수 접근 | 해당 메소드 내에서만 접근 가능 | 전역적으로 접근이 가능 |
Heap Overflow: 메모리 공간이 부족하여, 힙이 스택의 공간을 침범하는 경우
Stack Frame: 함수의 지역변수, 매개 변수, 반환 주소값 등 함수의 호출 정보
Stack Overflow: 메모리 공간이 부족하여 스택이 힙 공간을 침범하는 경우
재귀 함수를 잘 못 사용했을때 어떤 Overflow가 뜰가?
Stack Overflow가 뜹니다.
매서드가 호출될 때마다 해당 정보가(매개변수, 지역변수) 등등이 스택에 쌓이게 됩니다.
해당 스택 메모리들이 쌓여 힙 메모리의 영역을 침범하는 경우 StackOverflow가 뜨게 되는 것입니다.
'프로그래밍 언어 > C#' 카테고리의 다른 글
[C#] 객체지향 4가지 특성 (0) | 2024.09.03 |
---|---|
[C#] 가비지 컬렉션 (Garbage Collection, GC) (0) | 2024.08.22 |
댓글