프로세스가 생성되면 커널 영역에 PCB가 생성된다.
사용자 영역에 프로세스는 어떻게 배치될까?
하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.
1️⃣ 코드( Code ) 영역
- 텍스트( Text )영역이라고도 부른다.
- 실행할 프로그램의 기계어 코드( 명령어 )가 저장되는 공간이다.
- 실행 파일에서 .text 섹션에 해당하고, 읽기 전용 속성을 가진다.
2️⃣ 데이터( Data ) 영역
- 전역 변수와 정적 변수가 저장되는 공간이다.
- 실행 파일에서 .data와 .bss 섹션에 해당한다.
다시 두 가지 영역으로 나뉜다.
1. 초기화된 데이터( Initialized Data )영역
- 초기값이 있는 전역 변수와 정적 변수가 저장된다.
- 실행 파일에서 .data 섹션에 해당한다.
2. 초기화되지 않은 데이터( Uninitialized Data )영역 ( BSS: Block Started by Symbol )
- 초기화되지 않은 전역 변수와 정적 변수가 저장된다.
- 실행 파일에서 .bss 섹션에 해당하고, 실행 시 0으로 초기화 된다.
코드 영역과 데이터 영역은 그 크기가 변하지 않는다.
그렇기에 크기가 고정된 영역이라 하여 '정적 할당 영역'이라고도 부른다.
3️⃣ 힙( Heap )영역
- 동적 할당( malloc, new 등)에 의해 할당되는 메모리가 저장되는 공간이다.
- 프로그램이 종료되거나 명시적으로 해제( free, delete 등 )하지 않으면 메모리 누수가 발생할 수 있다.
4️⃣ 스택( Stack )영역
- 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등이 저장되는 공간이다.
- 함수가 호출될 때마다 새로운 스택 프레임( Stack Frame )이 생성되고, 함수가 종료되면 해당 스택 프레임이 제거 된다.
- 메모리 할당과 해제가 자동으로 이루어져서 빠르지만, 스택 크기를 초과하면 스택 오버플로우( Stack Overflow )가 발생할 수 있다.
힙 영역과 스택 영역은 실시간으로 그 크기가 변할 수 있기 때문에 '동적 할당 영역'이라고 부른다.
일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고,
스택 영역은 높은 주소에서 낮은 주소로 할당된다.
메모리 구조 (일반적인 프로세스 메모리 배치)
--------------------------------------
높은 주소 (High Address)
--------------------------------------
| 커널 영역 (Kernel Space) |
--------------------------------------
| 스택 (Stack) |
| - 지역 변수, 함수 호출 정보 |
| - 높은 주소 → 낮은 주소로 성장 |
--------------------------------------
| ↓ 빈 공간 (Unused Space) ↓ | ← 힙과 스택 사이 여유 공간
--------------------------------------
| 힙 (Heap) |
| - 동적 할당된 메모리 영역 |
| - 낮은 주소 → 높은 주소로 성장 |
--------------------------------------
| 데이터 (Data) 영역 |
| - 초기화된/초기화되지 않은 전역변수|
--------------------------------------
| 코드 (Code / Text) 영역 |
| - 실행 코드(기계어) 저장 |
--------------------------------------
낮은 주소 (Low Address)
'CS > 혼공컴운' 카테고리의 다른 글
[CS] 프로세스 계층 구조 (0) | 2025.02.11 |
---|---|
[CS] 프로세스 상태 (0) | 2025.02.11 |
[CS] 문맥 교환 (0) | 2025.02.10 |
[CS] 프로세스 개요 (0) | 2025.02.10 |
[CS] C 언어 컴파일 과정 (0) | 2025.02.10 |