프로세스의 메모리 영역
운영체제에서 프로세스가 생성되면 커널 영역에 프로세스 제어 블록(PCB)이 생성됩니다. 사용자 메모리 공간에는 프로세스가 어떻게 배치될까요? 일반적으로 하나의 프로세스는 네 가지 주요 메모리 영역으로 나뉘어 저장됩니다: 코드 영역, 데이터 영역, 힙 영역, 스택 영역. 이 글에서는 각 메모리 영역의 역할, 특성, 작동 원리와 함께 관련 개념을 탐구합니다.
프로세스 메모리 구조 개요
프로세스는 실행을 위해 다음과 같은 메모리 영역으로 나뉩니다:
- 코드 영역 (Code Segment): 프로그램의 실행 명령어가 저장.
- 데이터 영역 (Data Segment): 프로그램 실행 중 유지되는 데이터 저장.
- 힙 영역 (Heap Segment): 동적으로 할당되는 메모리 저장.
- 스택 영역 (Stack Segment): 함수 호출 및 지역 변수 저장.
이러한 구조는 운영체제가 프로세스를 관리하고, 효율적으로 메모리를 활용하는 데 필수적입니다.
1. 코드 영역 (Code Segment)
코드 영역, 또는 텍스트 영역(Text Segment)은 실행 가능한 명령어(기계어 코드)가 저장되는 공간입니다.
특징:
- 읽기 전용(Read-Only): 코드의 무결성을 유지하기 위해 쓰기가 금지됩니다.
- 불변: 프로그램이 실행되는 동안 코드 영역의 크기는 고정됩니다.
- 공유 가능: 동일한 프로그램을 실행하는 여러 프로세스는 코드 영역을 공유할 수 있습니다(예: 다중 사용자 환경에서).
예제:
다음은 코드 영역에 저장되는 코드의 예입니다:
#include <stdio.h>
void printMessage() {
printf("Hello, World!\n");
}
위 코드에서 printMessage
함수의 명령어는 코드 영역에 저장됩니다.
2. 데이터 영역 (Data Segment)
데이터 영역에는 프로그램 실행 중 유지되어야 하는 데이터가 저장됩니다. 전역 변수와 정적 변수(static variable)가 이 영역에 포함됩니다.
특징:
- 전역 변수와 정적 변수 저장: 프로그램 전체에서 접근 가능한 변수들이 포함됩니다.
- 가변 크기: 실행 중에 데이터의 양에 따라 크기가 변화할 수 있습니다.
예제:
int globalVar = 10; // 전역 변수
static int staticVar = 20; // 정적 변수
위 코드에서 globalVar
와 staticVar
는 데이터 영역에 저장됩니다.
3. 힙 영역 (Heap Segment)
힙 영역은 동적으로 메모리를 할당하고 해제할 수 있는 공간입니다. 주로 데이터 구조(예: 링크드 리스트, 트리 등)와 같은 복잡한 데이터 관리에 사용됩니다.
특징:
- 동적 할당: 프로그래머가 필요에 따라 메모리를 할당 및 해제.
- 낮은 주소에서 높은 주소로 확장: 메모리의 낮은 주소부터 시작하여 할당이 증가함에 따라 높은 주소로 확장됩니다.
- 메모리 누수 위험: 할당된 메모리를 해제하지 않으면 메모리 누수(memory leak)가 발생할 수 있습니다.
예제:
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(sizeof(int)); // 힙에 메모리 할당
*ptr = 100; // 값 저장
free(ptr); // 메모리 해제
return 0;
}
위 코드에서 malloc
함수는 힙 영역에 메모리를 할당하며, free
함수는 할당된 메모리를 해제합니다.
메모리 누수 경고:
힙 메모리를 해제하지 않으면 시스템의 메모리가 고갈될 수 있습니다. 이는 성능 저하를 초래하거나 시스템 충돌로 이어질 수 있습니다.
(그림 출처: 혼자 공부하는 컴퓨터 구조 + 운영체제)
4. 스택 영역 (Stack Segment)
스택 영역은 함수 호출 시 일시적인 데이터를 저장하는 공간입니다. 함수의 매개변수, 지역 변수, 리턴 주소 등이 스택에 저장됩니다.
특징:
- LIFO 구조: 마지막에 추가된 데이터가 가장 먼저 제거됩니다.
- 자동 관리: 함수 실행이 종료되면 해당 함수의 스택 공간이 자동으로 해제됩니다.
- 높은 주소에서 낮은 주소로 확장: 스택은 높은 메모리 주소에서 시작하여 아래쪽으로 확장됩니다.
예제:
void exampleFunction() {
int localVar = 10; // 지역 변수, 스택에 저장
}
위 코드에서 localVar
은 함수 호출 시 스택에 저장되며, 함수 종료 시 자동으로 해제됩니다.
힙과 스택의 상호작용
힙 영역과 스택 영역은 동적 할당이 가능한 메모리 공간으로, 실행 중 메모리 크기가 변화할 수 있습니다. 두 영역은 서로 반대 방향으로 확장됩니다:
- 힙: 낮은 주소 → 높은 주소로 확장
- 스택: 높은 주소 → 낮은 주소로 확장
이러한 확장 방향이 반대이기 때문에, 서로 충돌 없이 동작할 수 있습니다. 그러나 잘못된 메모리 관리는 스택 오버플로(stack overflow) 또는 힙 오버플로(heap overflow)를 초래할 수 있습니다.
(그림 출처: 혼자 공부하는 컴퓨터 구조 + 운영체제)
프로세스 메모리 영역의 중요성
운영체제는 프로세스의 메모리를 효율적으로 관리하기 위해 위와 같은 구조를 사용합니다. 각 영역은 고유한 역할과 특성을 가지며, 프로그램의 성능과 안정성에 중요한 영향을 미칩니다.
요약:
- 코드 영역: 읽기 전용, 실행 명령어 저장.
- 데이터 영역: 전역 변수 및 정적 변수 저장.
- 힙 영역: 동적 메모리 할당 및 해제.
- 스택 영역: 함수 호출과 지역 변수 관리.
'운영체제' 카테고리의 다른 글
문맥 교환 (Context Switching) (0) | 2025.01.11 |
---|---|
프로세스 제어 블록 (PCB) (0) | 2025.01.08 |