그래서 저는 이 질문을 읽고 있습니다.
https://stackoverflow.com/questions/1762418/what-resources-are-shared-Between-threads
그리고 "스레드는 스택을 제외한 모든 세그먼트를 공유하지만 한 스레드는 여전히 다른 스레드의 스택에 액세스할 수 있습니다"라는 대답을 기반으로 합니까?
하지만 아직 세 가지 질문이 있습니다.
프로세스의 모든 스레드가 동일한 가상 메모리 공간에서 작동합니까?
스레드가 다른 스레드의 스택에 계속 액세스할 수 있다는 것은 예를 들어 스택이 0x00에서 0xff로 시작한다면 한 스레드는 0x00에서 0x0f까지 작동하고 다른 스레드는 0x10에서 0xff까지 작동할 수 있다는 뜻입니까? 또는..?
스택은 Linux의 각 스레드에 고유한 가상 메모리의 유일한 부분입니까?
답변1
- 프로세스의 모든 스레드가 동일한 가상 주소 공간에서 작동합니까?
예. 각 스레드에는 자체 스택이 있지만 프로세스와 관련된 모든 메모리는 동일한 가상 주소 공간에 있습니다. 한 스레드의 함수에 다른 스레드의 스택 할당 변수에 대한 포인터가 있는 경우 함수는 해당 변수를 읽고 쓸 수 있습니다.
- 스레드가 다른 스레드의 스택에 계속 액세스할 수 있다는 것은 예를 들어 스택이 0x00에서 0xff로 시작한다면 한 스레드는 0x00에서 0x0f까지 작동하고 다른 스레드는 0x10에서 0xff까지 작동할 수 있다는 뜻입니까?
첫 번째 질문에 대한 답변에서 말했듯이 각 스레드에는 자체 스택이 있습니다. 추상적으로 말하면, 한 스레드의 스택은 A에서 B로 실행되고, 다른 스레드의 스택은 C에서 D로 실행되며, 여기서 A < B < C < D(즉, AB 범위는 CD 범위와 겹치지 않음)를 의미합니다.
- Linux에서 스택은 각 스레드에 대한 가상 메모리의 유일한 부분입니까?
스택의 고유성은 가상 메모리와 관련이 없습니다. 스택(실제로는 "활성화 레코드 스택")은 실행 중인 함수(현재 실행 중인 함수 및 모든 호출 함수)에 대한 정보를 저장하는 데 사용됩니다. 스레드가 여러 개인 경우 함수(및 호출 함수)도 여러 개 있습니다. 스레드가 인터리브된 활성화 레코드와 스택을 공유하는 경우 함수가 완료될 때 어떤 호출 함수로 반환할지 아는 것이 거의 불가능합니다.