스레드는 모든 것을 공유합니다 [1]. 전체 프로세스에는 하나의 주소 공간이 있습니다.
각 스레드에는 자체 스택 및 레지스터가 있지만 공유 주소 공간에서 모든 스레드의 스택을 볼 수 있습니다.
한 스레드가 스택에 일부 개체를 할당하고 다른 스레드로 주소를 보내면 둘 다 해당 개체에 동일한 액세스 권한을 갖습니다.
사실 방금 더 넓은 문제를 발견했습니다 . segment 라는 단어의 두 가지 용도를 혼란스럽게 생각합니다 .
실행 파일 (예 : ELF)의 파일 형식에는 고유 한 섹션이 있으며 컴파일 된 코드 (텍스트), 초기화 된 데이터, 링커 기호, 디버그 정보 등을 포함하는 세그먼트라고 할 수 있습니다. 힙 또는 스택 세그먼트가 없습니다. 이것들은 런타임 전용 구문이기 때문에 여기에 있습니다.
이들 이진 파일 세그먼트들은 상이한 허가들 (예를 들어, 코드 / 텍스트를위한 읽기 전용 실행 가능 및 초기화 된 데이터를위한 복사 중 기록 불가능)과 함께 프로세스 어드레스 공간에 별도로 매핑 될 수있다.
이 주소 공간의 영역은 언어 할당 라이브러리에 의해 적용되는 규칙에 따라 힙 할당 및 스레드 스택과 같은 다양한 목적으로 사용됩니다. 그것은 모두 메모리 일뿐이며 가상 8086 모드로 실행하지 않으면 세그먼트 화되지 않을 것입니다. 각 스레드의 스택은 스레드 생성시 할당 된 메모리 덩어리이며 현재 스택 최상위 주소는 스택 포인터 레지스터에 저장되며 각 스레드는 다른 레지스터와 함께 자체 스택 포인터를 유지합니다.
[1] 알겠습니다. 신호 마스크, TSS / TSD 등 모든 매핑 된 프로그램 세그먼트를 포함한 주소 공간은 여전히 공유됩니다.