Skip to content

프로세스의 주소 공간

프로그램이 실행되면 운영체제는 프로세스마다 가상 주소 공간(virtual address space) 을 만든다.

이 주소 공간은 논리적으로는 연속된 큰 메모리처럼 보이지만, 실제 물리 메모리는 MMU와 페이지 테이블을 통해 매핑된다. 따라서 프로세스의 주소 공간이 물리 메모리에 그대로 일대일 대응되는 것은 아니다.

프로세스의 주소 공간은 보통 다음과 같은 영역으로 설명한다.

  • Text(Code) Segment: 컴파일된 기계어 명령어
  • Data Segment: 초기화된 전역 변수와 정적 변수
  • BSS: 초기화되지 않은 전역 변수와 정적 변수
  • Heap: 런타임에 동적으로 할당되는 메모리 (malloc, new 등)
  • Stack: 함수 호출 프레임, 지역 변수, 반환 주소
  • Memory-mapped 영역: 공유 라이브러리, mmap 파일, 익명 매핑 등

참고

스레드가 여러 개인 프로세스에서는 스택은 스레드마다 따로 존재하고, 코드/데이터/힙 같은 주소 공간은 공유한다.


왜 이렇게 구역을 나누나요?

영역을 나누는 이유는 단순히 "메모리를 아끼기 위해서"만이 아니라, 수명(lifetime), 접근 권한, 공유 가능성, 관리 방식이 서로 다르기 때문이다.

  • 코드는 보통 읽기 전용으로 매핑되고, 같은 실행 파일을 실행한 여러 프로세스가 공유할 수 있다.
  • 전역/정적 데이터는 프로세스가 살아 있는 동안 유지되어야 한다.
  • 힙은 런타임에 크기가 동적으로 변한다.
  • 스택은 함수 호출에 따라 빠르게 늘고 줄며, 스레드별로 독립적이어야 한다.

즉, 영역 분리는 "자료의 성격이 다르기 때문에 관리 정책도 달라야 한다"는 점에서 나온 구조다.