개인적으로 공부하려고 정리한 메모리 구조, heap과 stack
1. 프로그램 실행 순서

- 유저가 프로그램 실행 요청
- 운영체제(OS)가 프로그램의 정보를 읽고 보조기억장치에 저장한다.
- 주기억장치(RAM)는 입력장치에서 입력받은 데이터 또는 보조기억장치에 저장된 프로그램을 읽어온다.
- 중앙처리장치(CPU)는 프로그램을 실행하기 위해 주기억장치(RAM)에 저장된 프로그램 명령어와 데이터를 읽어와서 처리하고, 결과를 다시 주기억장치에 저장한다.
- 주기억장치(RAM)는 처리 결과를 보조기억장치에 저장하거나 출력장치로 내보낸다.
2. 메모리 구조

- 프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드 해야 한다. 또한 프로그램이 실행되는 동안 CPU가 코드를 처리하기 위해서는 메모리가 명령어와 데이터들을 저장해야 한다
- 프로그램을 실행하면 운영체제는 해당 프로그램을 위해 메모리 공간을 할당해준다.
- 메모리 구조는 크게 code, data, heap, stack 영역으로 나뉜다.
- RAM(메인 메모리)에 할당되며, 프로그램 실행 시 필요한 메모리 공간을 지정하기 위해서 할당된다.
4. Code 영역
- 실행할 프로그램의 코드가 저장되는 영역이다. (텍스트 영역이라고도 함)
- 중앙처리장치(CPU)는 code 영역에 저장된 명령을 하나씩 가져가서 처리한다.
- 프로그램이 시작하고 종료될 때 까지 메모리에 계속 남아있는다.
3. Data 영역
- 프로그램의 전역 변수와 정적(static)변수가 저장되는 영역이다.
- 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
4. Heap 영역
-
사용자가 직접 공간을 할당, 해제하는 메모리 공간이다.
-
사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. (동적 메모리 할당)
- malloc(), new 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제한다.
-
선입선출(FIFO, First-In First-Out) 방식
: 가장 먼저 들어온 데이터가 가장 먼저 나간다.
=> 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되기 때문이다.
=> 위(낮은 주소)에서 아래(높은 주소) 방향으로 데이터가 쌓인다.
- 가비지 컬렉터를 이용해 사용하지 않는(=참조되지 않는) 메모리를 해제시킨다.
- 장점
- 메모리 크기에 제한이 없다.
- 변수에 전역적으로 액세스 할 수 있다.
- 단점
- 액세스(할당,해제)가 상대적으로 느리다.
- 메모리를 관리해야 한다.
=> 사용자가 직접 공간을 할당하고 해제하는 메모리 공간이기 때문에 직접적인 책임이 있다.
=> 메모리 공간을 효율적으로 관리하지 못하면 메모리 블럭이 할당된 후 시간이 지남에 따라 메모리가 조각화되어 해체 될 수 있다.
- 운영체제마다 메모리 관리가 달라서 구현이 어렵다.
5. Stack 영역
- 프로그램이 자동으로 사용하는 임시 메모리 영역.
- 함수 호출 시 생성되는 지역변수와 매개변수가 저장되는 영역이다. (정적 메모리 할당)
※ stack에 저장되는 함수의 호출 정보를 stack frame 이라고 한다.
- stack 영역은 함수의 호출과 동시에 할당되며, 함수의 호출이 완료되면(해당 객체가 정의된 블록을 벗어날 때) 소멸된다.
- 데이터 관리
- push - 데이터 저장
- pop - 데이터 인출
- 후입선출(LIFO, Last-In First-Out) 방식
: 가장 나중에 들어온 데이터가 가장 먼저 나간다.
=> 메모리의 높은 주소에서 낮은 주소의 방향으로 할당되기 때문이다.
=> 아래(높은주소)에서 위(낮은주소) 방향으로 데이터가 쌓인다
- 장점
- 액세스(할당, 해제)가 매우 빠르다.
- 변수를 명시적으로 할당, 해제 할 필요가 없다.
- 운영체제별로 구현 난이도가 비슷하다.
- 공간은 CPU에 의해 효율적으로 관리된다.
- 단점
- 메모리 크기에 제한이 있다. (운영체제별로 다름)
- 지역 변수만 해당된다.
- 변수의 크기를 조정할 수 없다.