티스토리 뷰

1. 프로세스 주소 공간

그림1. 프로세스의 사용자 메모리 주소 공간

  • 스택(Stack) 영역
    • 컴파일 시점에 크기가 결정된다.
    • 함수의 호출과 관계있는 지역 변수와 매개 변수 그리고 함수의 실행을 마치고 복귀할 주소가 저장되는 영역이다.
    • 스택 영역은 함수의 호출과 함께 생성되고 종료와 함께 소멸된다.
    • 메모리의 높은 주소에서 낮은 주소 방향으로 할당된다.
    • 재귀가 너무 깊게 호출되면 StackOverFlow 예외가 발생하는데, 이는 제한된 스택 영역을 초과하였기 때문에 발생한다.
    • 프로그램 실행 중에 변경될 수 있으므로 Read-Write로 설정되어 있다.
  • 힙(Heap) 영역
    • 런타임 시점에 결정되는 영역이다.
    • 사용자에 의해 동적으로 할당되고 명시적으로 해제해야 한다.
      • malloc(), new(), free()
    • 주로 참조형 데이터가 할당된다.
    • 프로그램 실행 중에 변경될 수 있으므로 Read-Write로 설정되어 있다.
  • 데이터(Data) 영역
    • 컴파일 시점에 결정되는 영역이다.
    • 전역 변수와 정적 변수(static 변수)가 할당되는 영역이다.
    • 전역 변수와 정적 변수를 참조한 코드는 컴파일 후 Data 영역의 주소값을 가리킨다.
    • 프로그램의 시작과 함께 할당되며 종료와 함께 소멸된다.
    • 프로그램 실행 중에 변경될 수 있으므로 Read-Write로 설정되어 있다.
  • 코드(Code) 영역
    • 컴파일 시점에 결정되는 영역이다.
    • 작성한 코드를 프로그램이 실행할 수 있도록 기계어로 변환된 코드가 저장된 영역이다.
    • 프로그램 실행 중에 변경되면 안되므로 Read-Only로 설정되어 있다.

 

 

2. 스레드 주소공간

2. 스레드의 메모리 주소 공간

  • 같은 프로세스 내의 모든 스레드는 힙(Heap), 데이터(Data), 코드(Code) 영역을 공유한다.
    • 공유한다는 특징때문에 동기화 문제가 발생할 수 있다.
  • 반대로 Stack 영역은 스레드별로 별도로 할당된다.

 

 

3. TLS(Thread Local Storage)

TLS(Thread Local Storage)란 멀티 스레드 환경에서 같은 프로세스 내의 스레드들이 독립된 데이터 영역을 할당받는 것이다. 기본적으로 스레드들은 프로세스가 할당받은 코드/데이터/힙 영역을 공유한다.

 

그러나 스레드에도 전역 변수 또는 정적 변수를 독립적으로 사용이 필요한 경우 별도의 데이터 영역을 할당받을 수 있다. 프로세스의 데이터 영역을 공유하면서도 독립적인 데이터 영역을 추가로 할당받을 수 있다. 독립적으로 할당된 공간은 당연하게도 다른 스레드들과 공유할 수 없다.

Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30