항상 자주 나오는 주제이지만 이해하는데는 참 시간이 걸리는 것 같다.
처음 봤을때는 완전 무슨 소리인지 이해가 안 됐었는데, 계속 보다보니 좀 이해는 되는 것 같아서 정리 차원에서 포스팅을 할 필요를 느꼈다.
설명하기 앞서 프로그램이 어떤 과정으로 실행되는지 먼저 확인해보자.
[출처] : jinShine 블로그
프로그램이 실행되면 OS는 메모리(RAM)에 공간을 할당한다.
프로그램이 실행되기 위해서는 메모리에 로드되어야 한다.
또한 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
컴퓨터 운영체제(OS)는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다.
할당하는 메모리 공간은 4가지로 다음과 같다.
보통 작업한 소스코드가 들어가는 곳이다.
실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.
코드 영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 해당된다.
전역변수와 정적(static)변수가 저장되는 영역
프로그램의 시작과 동시에 할당, 프로그램이 종료되면 메모리가 소멸
프로그램이 자동으로 사용하는 임시 메모리 영역
함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역
함수가 종료되면 사라지는 영역이다.
스택 영역에 저장되는 함수 호출 정보를 스택 프레임(stack frame)이라고 한다.
스택 영역은 push 동작으로 데이터를 저장, pop 동작으로 데이터를 인출
스택은 후입선출 방식으로 동작해 가장 늦게 저장된 데이터가 가장 먼저 출력된다
스택은 메모리가 높은 주소에서 낮은 주소로 할당된다.
프로그래머가 할당/해제하는 메모리 영역
직접 관리할 수 있는 영역이다.
이 공간에 메모리를 할당하는 것을 동적 할당(Dynamic Memory Allocation)이라고 한다.
HEAP, STACK 영역은 같은 공간을 공유한다.
STACK은 메모리 주소가 아래에서 위로, HEAP은 메모리 주소가 위에서 아래로 할당되는 방식
서로의 영역을 침범할 수 있다. 이를 HEAP OVERFLOW, STACK OVERFLOW라고 한다.
STACK과 HEAP 영역의 크기는 서로 반비례한다.
스택 | 힙 | |
---|---|---|
할당/해제 | 빠름 | 느림 |
구현 난이도 | 쉬움 - 아키텍처별로 다름 | 어려움 - OS마다 다름 |
필요성 | 함수 프레임 제공 | 메모리 동적 할당 |
scope | local(지역) | global(전역) |
유연성 | resizing 불가 | resizing 가능 |