컴퓨터가 실행되는 순간 메모리에는 다양한 프로세스들이 적재되어 실행됩니다.
프로그램이 실행되어 메모리에 적재되었을 때, 이를 프로세스라고 부릅니다.
하나의 프로세스를 구성하는 메모리 내의 정보는 크게 다르지 않습니다.
커널 영역에는 프로세스 제어 블록(PCB)이라는 정보가 저장되고, 사용자 영역에는 실행 중인 프로세스가 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됩니다.
코드 영역 (Code Segment)
실행 가능한 명령어가 저장되는 공간입니다.
텍스트 영역(text segment)이라고도 하며, CPU가 읽고 실행할 명령어가 저장되어 있어 쓰기(write)가 금지된 읽기 전용(read-only) 공간입니다.
데이터 영역 (Data Segment)
프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간입니다.
데이터 영역에 저장되는 데이터는 정적 변수와 전역 변수가 있습니다.
void func() {
static int count = 0; // 정적 변수
count++;
printf("%d\n", count);
}
---------------------------------------------
int globalVar = 0; // 전역 변수
void func1() {
globalVar++;
}
void func2() {
printf("%d\n", globalVar);
}
힙 영역 (Heap Segment)
프로그램을 만드는 개발자가 직접 할당 가능한 저장 공간입니다.
프로그램 실행 도중 비교적 자유롭게 할당하여 사용할 수 있는 메모리 공간입니다.
힙 영역에 메모리 공간을 할당한 경우, 해당 공간은 반드시 나중에 반환해야 합니다.
메모리 공간을 반환하지 않는다면 할당한 공간이 계속 메모리에 남아 메모리를 낭비하는 메모리 누수(memory leak) 문제를 초래할 수 있습니다.
이러한 문제를 해결하기 위해 프로그래밍 언어에서 자체적으로 사용하지 않는 힙 메모리를 해제하는 가비지 컬렉션(garbage collection : GC) 기능을 제공하기도 합니다.
스택 영역 (Stack Segment)
데이터 영역에 담기는 값과는 달리 일시적으로 사용할 값들이 저장되는 공간입니다.
함수의 실행이 끝나면 사라지는 매개변수, 지역변수, 함수 복귀 주소 등이 스택 영역에 저장되는 대표적인 데이터들입니다.
스택 영역에는 스택 트레이스 형태의 함수 호출 정보가 저장될 수 있습니다.
스택 트레이스란 특정 시점에 스택 영역에 저장된 함수 호출 정보를 말합니다.
문제 발생 지점을 추적하여 디버깅을 보다 쉽게 할 수 있습니다.
BSS 영역 (Block Started by Symbol)
일반적으로는 코드, 데이터, 힙, 스택 영역으로 구분하지만, 실제로는 BSS라는 영역도 추가로 고려될 수 있습니다.
BSS 영역은 데이터 영역과 유사하지만, 초기화 여부에 따라 데이터 영역과 BSS 영역으로 나뉩니다.
프로그램을 실행하는 동안 유지할 데이터 중 초기값이 있는 데이터는 데이터 영역에 저장되고, 초기값이 없는 데이터는 BSS 영역에 저장됩니다.
BSS(Beginning of Symbol Segment) 영역은 프로그램이 시작될 때 초기값이 없는 전역 변수와 정적 변수를 저장하는 공간입니다.
public class Example {
// 초기값이 없는 정적 변수
static int staticVar; // BSS 영역에 저장됨
public static void main(String[] args) {
// 초기값이 있는 정적 변수
static int initializedVar = 10; // 데이터 영역에 저장됨
}
}
'CS > 운영체제' 카테고리의 다른 글
[OS] 동기화 기법 뮤텍스 락, 세마포 (0) | 2024.10.12 |
---|---|
[OS] PCB, 문맥 교환(Context Switching) (0) | 2024.10.01 |
[OS] 시스템 콜, 이중 모드 (0) | 2024.09.26 |
[OS] 운영체제란? (0) | 2024.08.26 |