다섯 살도 알 수 있게 · 시스템SW

프로세스 메모리 구조가 뭐예요?

프로세스 메모리 구조와 동적 메모리 할당을, 차 한 대에 내준 작업 공간을 구역으로 나눠 쓰는 이야기로 풀어봤어요.

차 한 대에 작업 공간을 내줬어요설계도는 어디, 부품은 어디, 임시 작업대는 어디에 둘까요?

작업 공간을 받았는데 어디에 뭘 둘지 몰라요.설계도, 부품, 임시 작업대를 어디에 둘까요?

설계도랑 임시 부품이 뒤섞여 있으면 헷갈려요구역을 나눠 정해두는 규칙이 필요해요

설계도와 부품을 아무 데나 두면 뒤섞여요.구역을 나눠 정해두는 규칙이 필요해요.

코드(설계도)데이터/BSS(초기 부품)힙(더 받아 쓰는 창고)스택(임시 작업대)프로세스 메모리 구조 = 작업 공간을 정해진 구역으로 나눠 쓰는 규칙각 구역이 하는 일이 정해져 있어 안 헷갈려요

프로세스 메모리 구조는 작업 공간을 정해진 구역으로 나눠 쓰는 규칙이에요.각 구역이 하는 일이 정해져 있어 헷갈리지 않아요.

코드 영역바뀌지 않는 설계도예요
데이터/BSS 영역처음부터 준비된 부품이에요
힙 — 쓸수록 늘어남필요할 때마다 더 받아요(동적 할당)
스택 — 쓸수록 쌓임함수가 끝나면 그 몫이 저절로 사라져요
코드(설계도)데이터/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
힙과 스택이 서로를 향해 자라다 부딪히는 것. 둘 사이 공간이 바닥나면 더 쓸 메모리가 없어요.
다음 이야기
잘 나가는 다이얼 설정끼리 섞어보기 →
다른 용어도 그림책으로 보고 싶다면 요청하기 →