다섯 살도 알 수 있게 · 시스템SW
프로세스 메모리 구조가 뭐예요?
프로세스 메모리 구조와 동적 메모리 할당을, 차 한 대에 내준 작업 공간을 구역으로 나눠 쓰는 이야기로 풀어봤어요.
작업 공간을 받았는데 어디에 뭘 둘지 몰라요.설계도, 부품, 임시 작업대를 어디에 둘까요?
설계도와 부품을 아무 데나 두면 뒤섞여요.구역을 나눠 정해두는 규칙이 필요해요.
프로세스 메모리 구조는 작업 공간을 정해진 구역으로 나눠 쓰는 규칙이에요.각 구역이 하는 일이 정해져 있어 헷갈리지 않아요.
코드 영역바뀌지 않는 설계도예요
데이터/BSS 영역처음부터 준비된 부품이에요
힙 — 쓸수록 늘어남필요할 때마다 더 받아요(동적 할당)
스택 — 쓸수록 쌓임함수가 끝나면 그 몫이 저절로 사라져요
이 그림(낮은 주소가 위)에선 힙이 아래로, 스택이 위로 자라요.힙과 스택 사이 공간이 바닥나면 메모리가 모자라요.
동적 할당은 편하지만, 다 쓴 공간은 직접 돌려줘야 해요.힙에서 받은 만큼 돌려줘야 작업 공간이 모자라지 않아요.
한 줄로
프로세스 메모리 구조는 작업 공간을 코드·데이터·힙·스택 구역으로 나누는 규칙이고, 동적 메모리 할당은 힙에서 필요한 만큼 빌렸다가 돌려주는 것이에요.
프로세스의 가상 메모리는 보통 낮은 주소부터 코드(텍스트) 영역, 초기화된/초기화되지 않은 전역변수인 데이터·BSS 영역, 실행 중 malloc/new 등으로 늘어나는 힙, 그리고 함수 호출마다 쌓였다 사라지는 스택 순으로 배치돼요. 힙은 낮은 주소에서 높은 주소로, 스택은 높은 주소에서 낮은 주소로 자라며 서로를 향해 커지는데, 둘 사이 공간이 바닥나면 메모리 부족 오류가 나요. 실제 운영체제는 스택 크기 한도와 보호 페이지로 둘이 맞닿기 전에 막아요. 동적 할당된 메모리를 free()/delete로 반납하지 않으면 메모리 누수가 쌓여요.
어른들은 이렇게 불러요
- 코드(텍스트) 영역
Code (Text) Segment - 바뀌지 않는 설계도가 있는 구역. 실행 파일의 명령어가 들어있어요.
- 데이터/BSS 영역
Data/BSS Segment - 처음부터 준비된 전역 부품 구역. 초기화 여부로 데이터와 BSS가 나뉘어요.
- 힙
Heap - 필요할 때마다 더 받는 창고. 낮은 주소에서 높은 주소로 자라요.
- 스택
Stack - 함수 호출마다 쌓였다 사라지는 작업대. 높은 주소에서 낮은 주소로 자라요.
- 동적 메모리 할당
Dynamic Memory Allocation - 힙에서 필요한 만큼 빌리는 것. malloc/new 로 빌리고 free/delete 로 돌려줘요.
- 메모리 누수
Memory Leak - 빌린 공간을 안 돌려줘서 쌓이는 것. 오래 켜둔 프로그램을 느리게 만들어요.
- 스택 오버플로
Stack Overflow - 작업대(스택)가 정해진 한도를 넘어 넘치는 사고. 재귀 호출이 너무 깊을 때 자주 나요.
- 힙-스택 충돌
Heap-Stack Collision - 힙과 스택이 서로를 향해 자라다 부딪히는 것. 둘 사이 공간이 바닥나면 더 쓸 메모리가 없어요.
다음 이야기
잘 나가는 다이얼 설정끼리 섞어보기 →