메모리 구조
프로그램이 운영체제로부터 할당받는 메모리 공간은 크게 아래와 같이 4가지이다.
영역 | 설명 |
코드 (Code) |
• 실행한 프로그램의 코드가 저장되는 영역 • 텍스트 영역이라고 부르기도 함 • CPU가 코드 영역에 저장된 명령어를 하나씩 처리함 |
데이터 (Data) |
• 프로그램의 전역 변수와 정적 변수가 저장되는 영역 • 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸함 |
힙 (Heap) |
• 사용자가 직접 관리할 수 있는 메모리 영역 • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨 • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨 |
스택 (Stack) |
• 함수의 호출과 관계있는 지역 변수와 매개변수가 저장되는 영역 • 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함 • 스택 영역에서 데이터를 저장/인출하는 방식 - 푸시(Push) 동작으로 데이터 저장 - 팝(Pop) 동작으로 데이터 인출 - 후입 선출 (LIFO, Last-In First-Out) 방식으로 동작 - 가장 늦게 저장된 데이터가 가장 먼저 인출됨 • 스택 영역은 메모리의 높은 주소부터 낮은 주소의 방향으로 할당됨 |
NOTE: 프로그램 스택
- 함수의 실행을 지원하기 위한 메모리 영역
- 일반적으로 힙과 메모리 영역을 공유함
-- 공유된 메모리 영역에서, 스택은 메모리의 낮은 부분을 사용하는 경항이 있고, 힙은 메모리의 높은 부분을 사용하느 경향이 있음
- 프로그램 스택은 스택 프래임*을 포함하고 있음
- 함수가 호출될 시, 함수의 스택 프레임이 스택에 추가(push)되며, 입력된 스택은 위쪽으로 자란다. 그리고 함수가 종료될 때, 함수의 스택 프레임이 프로그램 스택에서 제거(pop)된다.
- 스택 프레임에 의해 사용된 메모리는 초기화되지 않으며, 다른 스택 프레임이 스택에 입력될 때, 덮어진다.
* 스택 프래임
- 활성화 레코드 또는 활성화 프레임이라 부르기도 함
- 함수 호출 시 전달되는 매개변수와 로컬 변수를 포함함
- 스텍 프레임의 구성
a. 반환 주소: 함수 종료후 돌아가야 할 프로그램 내의 주소
b. 로컬 변수 저장소: 로컬 변수를 위해 할당된 메모리
c. 매개변수 저장소: 함수의 매개변수를 위해 할당된 메모리
d. 스택 포인터와 기반 포인터(base pointer): 스택 관리 목적으로 런타임 시스템에서 사용되는 포인터
-- 스텍 포인터: 일반적으로 스택의 제일 높은 위치를 가리킴
-- 스택 기반 포인터:
--- 반환 주소 같은 스텍 프레임 안에 있는 주소를 가리킴
--- 스택 프레임 요소들의 접근을 도와줌
NOTE: 스택 포인터와 스택 기반 포인터는 C 포인터가 아니며, 프로그램 스택을 관리하는 런타임 시스템에서 사용하는 주소
NOTE: 힙은 동적 메모리를 관리함
힙과 스택의 장단점
장점 | 단점 | |
힙 (Heap) |
• 전역적으로 엑세스 할 수 있음 • 메모리 크기 제한 없음 |
• 상대적으로 느린 엑세스 • 효율적인 공간 사용을 보장하지 못하면, 메모리 블록이 할당된 후, 시간이 지남에 따라 메모리가 조각화되어 해제될 수 있음 • 메모리를 사용자가 직접 관리해야하는 책임이 있음 (메모리의 할당 및 해제) |
스택 (Stack) |
• 매우 빠른 엑세스 • 변수를 명시적으로 할당 해제할 필요 없음 • 스택 공간은 CPU에 의해 효율적으로 관리 |
• 지역변수만 • 스택 크기 제한 (OS에 따라 다름) • 변수의 크기를 조정할 수 없음 |
'프로그래밍 언어 > C, C++의 기본적인 설명' 카테고리의 다른 글
[C/C++] 디버그, 신텍스 에러, 세만틱 에러 (0) | 2022.02.19 |
---|---|
[C/C++] 문자/문자열 입출력 (0) | 2021.08.25 |
[C/C++] C언어 - 구조체 (0) | 2021.06.28 |
[C 언어] 헤더파일 및 분할 컴파일 정리 (0) | 2021.02.05 |
[C 언어] fopenmp - 스레드 하나만 사용하는 경우 (0) | 2021.01.30 |
댓글