티스토리 뷰
1. 프로세스 주소 공간
- 스택(Stack) 영역
- 컴파일 시점에 크기가 결정된다.
- 함수의 호출과 관계있는 지역 변수와 매개 변수 그리고 함수의 실행을 마치고 복귀할 주소가 저장되는 영역이다.
- 스택 영역은 함수의 호출과 함께 생성되고 종료와 함께 소멸된다.
- 메모리의 높은 주소에서 낮은 주소 방향으로 할당된다.
- 재귀가 너무 깊게 호출되면 StackOverFlow 예외가 발생하는데, 이는 제한된 스택 영역을 초과하였기 때문에 발생한다.
- 프로그램 실행 중에 변경될 수 있으므로 Read-Write로 설정되어 있다.
- 힙(Heap) 영역
- 런타임 시점에 결정되는 영역이다.
- 사용자에 의해 동적으로 할당되고 명시적으로 해제해야 한다.
- malloc(), new(), free()
- 주로 참조형 데이터가 할당된다.
- 프로그램 실행 중에 변경될 수 있으므로 Read-Write로 설정되어 있다.
- 데이터(Data) 영역
- 컴파일 시점에 결정되는 영역이다.
- 전역 변수와 정적 변수(static 변수)가 할당되는 영역이다.
- 전역 변수와 정적 변수를 참조한 코드는 컴파일 후 Data 영역의 주소값을 가리킨다.
- 프로그램의 시작과 함께 할당되며 종료와 함께 소멸된다.
- 프로그램 실행 중에 변경될 수 있으므로 Read-Write로 설정되어 있다.
- 코드(Code) 영역
- 컴파일 시점에 결정되는 영역이다.
- 작성한 코드를 프로그램이 실행할 수 있도록 기계어로 변환된 코드가 저장된 영역이다.
- 프로그램 실행 중에 변경되면 안되므로 Read-Only로 설정되어 있다.
2. 스레드 주소공간
- 같은 프로세스 내의 모든 스레드는 힙(Heap), 데이터(Data), 코드(Code) 영역을 공유한다.
- 공유한다는 특징때문에 동기화 문제가 발생할 수 있다.
- 반대로 Stack 영역은 스레드별로 별도로 할당된다.
3. TLS(Thread Local Storage)
TLS(Thread Local Storage)란 멀티 스레드 환경에서 같은 프로세스 내의 스레드들이 독립된 데이터 영역을 할당받는 것이다. 기본적으로 스레드들은 프로세스가 할당받은 코드/데이터/힙 영역을 공유한다.
그러나 스레드에도 전역 변수 또는 정적 변수를 독립적으로 사용이 필요한 경우 별도의 데이터 영역을 할당받을 수 있다. 프로세스의 데이터 영역을 공유하면서도 독립적인 데이터 영역을 추가로 할당받을 수 있다. 독립적으로 할당된 공간은 당연하게도 다른 스레드들과 공유할 수 없다.