Appearance
프로세스의 주소 공간
프로그램이 실행되면 운영체제는 프로세스마다 가상 주소 공간(virtual address space) 을 만든다.
이 주소 공간은 논리적으로는 연속된 큰 메모리처럼 보이지만, 실제 물리 메모리는 MMU와 페이지 테이블을 통해 매핑된다. 따라서 프로세스의 주소 공간이 물리 메모리에 그대로 일대일 대응되는 것은 아니다.
프로세스의 주소 공간은 보통 다음과 같은 영역으로 설명한다.
- Text(Code) Segment: 컴파일된 기계어 명령어
- Data Segment: 초기화된 전역 변수와 정적 변수
- BSS: 초기화되지 않은 전역 변수와 정적 변수
- Heap: 런타임에 동적으로 할당되는 메모리 (
malloc,new등) - Stack: 함수 호출 프레임, 지역 변수, 반환 주소
- Memory-mapped 영역: 공유 라이브러리,
mmap파일, 익명 매핑 등
참고
스레드가 여러 개인 프로세스에서는 스택은 스레드마다 따로 존재하고, 코드/데이터/힙 같은 주소 공간은 공유한다.
왜 이렇게 구역을 나누나요?
영역을 나누는 이유는 단순히 "메모리를 아끼기 위해서"만이 아니라, 수명(lifetime), 접근 권한, 공유 가능성, 관리 방식이 서로 다르기 때문이다.
- 코드는 보통 읽기 전용으로 매핑되고, 같은 실행 파일을 실행한 여러 프로세스가 공유할 수 있다.
- 전역/정적 데이터는 프로세스가 살아 있는 동안 유지되어야 한다.
- 힙은 런타임에 크기가 동적으로 변한다.
- 스택은 함수 호출에 따라 빠르게 늘고 줄며, 스레드별로 독립적이어야 한다.
즉, 영역 분리는 "자료의 성격이 다르기 때문에 관리 정책도 달라야 한다"는 점에서 나온 구조다.