메모리 내 프로세스 구조
프로그램이 실행되면 운영체제는 메모리를 할당하여 프로세스를 실행한다. 이때, 프로세스의 메모리는 여러 영역으로 나뉘며, 각각의 영역은 특정한 역할을 수행한다. 대표적인 메모리 영역으로는 코드(Code) 영역, 데이터(Data) 영역, 스택(Stack) 영역, 힙(Heap) 영역이 있다.
1. 코드 영역(Code/Text/Instruction Area)
코드 영역은 프로그램의 실행 코드가 저장되는 공간으로, 프로그래머가 작성한 명령어들이 저장된다. 이 영역은 보통 읽기 전용(Read-Only)으로 설정되며, 실행 중에는 수정할 수 없다.
2. 데이터 영역(Data Area)
데이터 영역은 코드 실행 중 필요한 전역 변수, static 변수 등의 데이터를 저장하는 공간이다. 이 영역의 데이터는 프로그램이 종료될 때까지 유지된다.
3. 스택 영역(Stack Area)
스택 영역은 함수 호출 시 필요한 데이터(매개변수, 지역 변수, 반환 주소 등)를 저장하는 공간이다. 스택은 Last In, First Out (LIFO) 구조로 동작하며, 함수 호출 시 메모리가 할당되고, 함수 종료 시 메모리가 해제된다.
스택 오버플로우 (Stack Overflow)
스택의 크기를 초과하여 메모리가 더 이상 할당되지 못하는 경우 스택 오버플로우(Stack Overflow)가 발생한다. 일반적으로 재귀 호출이 끝없이 반복될 때 발생한다. 아래 코드는 재귀 함수 호출이 계속해서 이루어지므로 스택이 가득 차며 스택 오버플로우가 발생한다.
#include <stdio.h>
void recursive() {
recursive(); //무한 재귀 호출
}
int main() {
recursive();
return 0;
}
4. 힙 영역 (Heap Area)
힙 영역은 동적으로 메모리를 할당하는 공간으로, 크기가 정해져 있지 않고 필요에 따라 메모리를 할당 및 해제할 수 있다. malloc(), new 연산자 등을 이용해 할당하며, 명시적으로 해제하지 않으면 메모리 누수(Memory Leak)가 발생할 수 있다.
힙 오버플로우 (Heap Overflow)
힙 영역에서 메모리를 과도하게 할당하거나, 해제되지 않은 상태로 계속 할당하면 힙 오버플로우(Heap Overflow)가 발생할 수 있다. 아래 코드는 힙 메모리를 계속해서 할당하면서 해제하지 않아 결국 힙 오버플로우가 발생하게 된다.
#include <stdlib.h>
int main() {
while(1) {
malloc(1024 * 1024); //1MB씩 할당
}
return 0;
}
'CS > 운영체제' 카테고리의 다른 글
[OS]프로세스 계층 구조 (0) | 2025.03.24 |
---|---|
[OS]프로세스 생성, 복사(fork(), exec()) (1) | 2025.03.24 |
[OS]문맥 교환 (0) | 2025.03.23 |
[OS]프로세스 상태 (0) | 2025.03.23 |
[OS]프로세스 제어 블록(PCB, Process Control Block) (0) | 2025.03.23 |