728x90
이번 포스팅에서는 메모리 구조에 대해서 상세하게 알아보자 !
▸ 메모리의 구조를 영역에 따라서 설명
▸ 힙(Heap) 영역과 스택(Stack) 영역 차이
▸ 메모리의 힙 영역을 너무 크게 잡으면?
✔️ 메모리 구조
먼저, 프로세스가 실행되기 위해서는 먼저 프로그램이 메모리에 적재되어야 한다.

프로그램을 실행하게 되면, 하드 드라이브(저장장치)에 저장되어 있는 프로그램을 메모리(RAM)으로 옮긴다.
이때, 운영체제는 각 프로그램이 필요한 만큼의 메모리(RAM) 공간을 할당해준다.
이때 할당된 메모리 공간(RAM)은 크게 코드(Code), 데이터(Data), 스택(Stack), 힙(Heap) 영역으로 나뉜다.

➕ 코드(Code) 영역
- 실행될 프로그램의 실제 코드가 저장되는 영역이다. 텍스트 영역이라고도 부른다.
- 실제 코드를 기계어 형태(0,1)로 저장한다.
- 프로그램 실행을 위해 필요한 모든 명령어들(함수, 제어문, 상수 등)이 여기에 지정된다.
- CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 실행한다.
➕ 데이터(Data) 영역
- 전역 변수와 정적 변수(static)가 할당되는 영역이다.
- main 함수 전에 선언되어 프로그램의 시작과 동시에 할당되고 프로그램이 종료되어야 메모리에서 소멸한다.
➕ 힙(Heap) 영역
- 동적으로 할당된 변수가 할당되는 영역이다. - 'new' 연산자
- 사용자에 의해 메모리 공간이 동적으로 할당(malloc)되고 해제(free)된다.
- 힙 영역(메모리) 관리가 필요하며, 잘못된 메모리 관리로 인해 메모리 누수(Memory Leak)나 메모리 파편화(Memory Fragmentation)이 발생할 수 있다.
- 4가지 영역 중 유일하게 런타임시 크기가 결정된다.
- 메모리의 낮은 주소부터 할당되는 선입선출(FIFO) 구조
➕ 스택(Stack) 영역
- 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다.
- 함수 호출 시 생성되고, 함수가 끝나면 반환된다.
- 스택(stack) 크기는 각 프로세스마다 할당되지만, 프로세스가 메모리에 로드될 때 stack 크기가 고정되어 있기 때문에 런타임 시에 크기를 바꿀 수 없다.
- 메모리의 높은 주소부터 할당되는 후입선출(LIFO) 구조
✔️ 힙(Heap) 영역 vs 스택(Stack) 영역
힙(Heap) 영역 | 스택(Stack) 영역 | |
저장하는 데이터 | 동적으로 생성된 변수(new 연산자) | 지역 변수, 매개 변수 |
크기가 결정되는 타이밍 | 런타임(Runtime) | 컴파일(Compile) |
크기 제한 | 크기가 제한되어 있지 않다.(늘어남) | 크기가 정해져있다. |
주소 할당 방향 | 낮은 주소 → 높은 주소 | 높은 주소 → 낮은 주소 |
비교 | • 스택에 비해 느리다. • 직접 힙 영역 관리 필요 |
• 힙에 비해 빠르다. • 함수의 종료에 따라 소멸되므로 별다른 관리가 필요 없다. |
✔️ 같은 공간을 쓰는 힙 영역과 스택 영역의 문제

Heap 영역과 Stack 영역은 사실상 같은 공간을 공유한다. 힙(Heap)은 낮은 주소 부터, 스택(Stack)은 높은 주소부터 채워지기 때문에 서로의 영역을 침범하는 일이 발생할 수 있다. 이를 각각 Heap Overflow, Stack Overflow 라고 한다.
💡 메모리의 위쪽에 위치할 수록 낮은 주소, 아래쪽에 위치할 수록 높은 주소이다.
✔️ 힙(Heap) 영역을 크게 잡으면 어떤 일이 생길까?
위에서 언급했듯이, 힙 영역은 스택 영역과 달리 할당된 메모리 공간을 직접 해제(free)하는 등의 메모리 관리가 필요하다.
만약 메모리의 힙 영역이 너무 크다면,
- 넓은 힙 영역에 존재하는 동적 변수에 대해 참조 여부를 확인해야 하기 때문에 Garbage Collection의 수행시간이 너무 길어진다.
- 메모리가 낭비로 인해 시스템의 전체적인 성능에 영향을 줄 수 있다.
728x90
'CS 지식 > 운영체제' 카테고리의 다른 글
[운영체제] IPC(Inter Process Communication) (1) | 2024.08.28 |
---|---|
[운영체제] I/O 처리 방식 : Synchronous/Asynchronous & Blocking/Non-Blocking (0) | 2024.08.27 |
[운영체제] 페이지 교체 알고리즘 (0) | 2024.08.26 |
[운영체제] Paging(페이징) 과 Segmentation(세그먼테이션) (0) | 2024.08.25 |
[운영체제] Semaphore(세마포어) & Mutex(뮤텍스) (0) | 2024.08.24 |