프로세스 주소공간
프로세스
실행 중인 프로그램
- 프로세스는 메모리에 저장되어 CPU에 의해 실행된다
- 시스템에서 구현될 기본 작업 단위를 나타내는 엔티티로 정의됨
프로그램(프로세스)이 메모리에 로드되면 Stack, Heap, Text, Data 부분으로 구분할 수 있다.
1. 프로세스의 메모리 공간
![](https://velog.velcdn.com/images/juyoung999/post/9224a35a-0573-4b57-bc7d-3d6d3e8b8bb3/image.png)
Stack
- 메서드/함수의 매개변수, 반환 주소, 지역변수와 같은 임시 데이터 저장
- 호출이 완료되면 반환됨
- 컴파일 시 크기가 결정
- 메모리의
높은 주소 -> 낮은 주소
로 할당
Heap
- 런타임 동안 프로세스에 동적으로 할당된 메모리
- 주로 잠초형 데이터가 할당됨 (⭐️Swift에서는 ARC를 통해 힙에 할당된 메모리를 관리)
- 런타임 시 크기가 결정
- 메모리의
낮은 주소 -> 높은 주소
로 할당
Data
- 전역 및 정적(static) 변수
- 프로그램 시작 때 할당되어 프로그램이 종료되면 소멸
GVAR
-> 초기화한 전역 변수 / BSS
-> 초기화하지 않은 전역 변수
- 초기화 된 데이터는 ROM에도 저장하기 위해 구분한다
Text(Code)
- Program Counter 값과 프로세서 레지스터가 가리키는 현재 활동
- 실행할 기계어 코드
- 읽기 전용(= 수정 불가)
2. 스레드의 주소공간
- 스레드도 자신만의 자원을 가지기 때문에 주소공간을 가짐
- 스레드는 Stack만 가짐
- 나머지 영역은 프로세스와 함께 사용
왜 메모리 구역을 나누는걸까?
- 메모리는 한정된 자원 -> 어떻게든 절약하려고 함
- 코드는 변하지 않기 때문에 Text 영역으로 분리
- 전역 변수는 어떤 함수에서도 접근할 수 있으므로 Data로 관리(Stack은 후입선출이라는 구조적 특성 때문에)
➡️ 추가적으로 생각할 부분
- 서로의 영역을 침범하면 스택 오버플로우, 힙 오버플로우가 발생할 수 있음
- 커널영역에 침범하는 일이 없도록 스택은 높은 주소부터 아래로 할당
참조 링크
운영체제 스터디 - 프로세스 주소공간
tutorialspoint - Processes
프로세스(Process)의 주소 공간(Address Space)