[multithreading] 스레드간에 어떤 리소스가 공유됩니까?

최근에 나는 프로세스와 스레드의 차이점이 무엇인지 인터뷰에서 질문을 받았다. 정말 답을 몰랐습니다. 나는 잠시 생각하고 매우 이상한 답변을 주었다.

스레드는 동일한 메모리를 공유하지만 프로세스는 공유하지 않습니다. 이 질문에 답한 후, 면접관은 나에게 사악한 미소를 지었고 나에게 다음과 같은 질문을 주었다.

Q. 프로그램이 분할되는 부분을 알고 있습니까?

내 대답 : 네 (쉽게 생각했습니다) Stack, Data, Code, Heap

Q. 그렇다면 스레드가 공유하는 세그먼트는 무엇입니까?

나는 이것에 대답 할 수 없었고 그들 모두를 말하는 것으로 끝났다.

프로세스와 스레드의 차이점에 대해 정확하고 인상적인 답변을 제시 할 수 있습니까?



답변

당신은 꽤 정확하지만 스레드 는 스택을 제외한 모든 세그먼트를 공유합니다 . 스레드는 독립적 인 호출 스택을 가지고 있지만 다른 스레드 스택의 메모리에는 여전히 액세스 할 수 있으며 이론적으로 다른 스레드의 로컬 스택 프레임에서 메모리에 대한 포인터를 보유 할 수 있습니다 (아마도 해당 메모리를 넣을 수있는 더 좋은 곳을 찾아야합니다!).


답변

에서 위키 백과 (: P 나는 그 면접관에 대한 정말 좋은 대답을 할 것이라고 생각)

스레드는 다음과 같은 점에서 기존 멀티 태스킹 운영 체제 프로세스와 다릅니다.

  • 스레드는 프로세스의 하위 집합으로 존재하지만 프로세스는 일반적으로 독립적입니다.
  • 프로세스는 상당한 상태 정보를 전달하는 반면 프로세스 공유 상태 내의 여러 스레드는 물론 메모리 및 기타 리소스
  • 스레드는 주소 공간을 공유하는 반면 프로세스에는 별도의 주소 공간이 있습니다.
  • 프로세스는 시스템 제공 프로세스 간 통신 메커니즘을 통해서만 상호 작용합니다.
  • 동일한 프로세스에서 스레드 간의 컨텍스트 전환은 일반적으로 프로세스 간의 컨텍스트 전환보다 빠릅니다.

답변

실제로 지적해야 할 것은이 질문에 대한 두 가지 측면, 즉 이론적 측면과 구현 측면이 있다는 것입니다.

먼저 이론적 인 측면을 보자. 프로세스와 스레드 간의 차이점과 프로세스간에 공유되는 것을 이해하려면 프로세스가 개념적으로 무엇인지 이해해야합니다.

Tanenbaum의 2.2.2현대 운영 체제 의 클래식 스레드 모델 에서 다음과 같은 내용이 있습니다 .

프로세스 모델은 리소스 그룹화 및 실행이라는 두 가지 독립적 인 개념을 기반으로합니다. 때때로 그것들을 분리하는 것이 유용합니다; 이곳은 실이 들어오는 곳입니다.

그는 계속한다:

프로세스를 보는 한 가지 방법은 관련 리소스를 그룹화하는 방법입니다. 프로세스에는 프로그램 텍스트와 데이터 및 기타 리소스가 포함 된 주소 공간이 있습니다. 이러한 리소스에는 열린 파일, 자식 프로세스, 보류중인 알람, 신호 처리기, 계정 정보 등이 포함될 수 있습니다. 프로세스 형태로 구성하면보다 쉽게 ​​관리 할 수 ​​있습니다. 프로세스가 갖는 다른 개념은 실행 스레드이며 일반적으로 스레드로 단축됩니다. 스레드에는 다음에 실행할 명령을 추적하는 프로그램 카운터가 있습니다. 현재 작업 변수를 보유하는 레지스터가 있습니다. 스택에는 실행 기록이 포함되어 있으며 각 프로 시저에 대해 하나의 프레임이 호출되었지만 아직 반환되지 않았습니다. 스레드는 일부 프로세스에서 실행되어야하지만 스레드와 프로세스는 서로 다른 개념이며 별도로 처리 할 수 ​​있습니다. 프로세스는 자원을 함께 그룹화하는 데 사용됩니다. 스레드는 CPU에서 실행되도록 예약 된 엔티티입니다.

아래로 그는 다음 표를 제공합니다.

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

위는 스레드가 작동하는 데 필요한 것입니다. 다른 사람들이 지적했듯이 세그먼트와 같은 것은 OS 의존적 구현 세부 사항입니다.


답변

면접관에게 OS의 구현에 전적으로 달려 있다고 말한다.

예를 들어 Windows x86을 보자. 코드와 데이터의 세그먼트 [1] 만 있습니다 . 그리고 둘 다 전체 2GB (선형, 사용자) 주소 공간에 매핑됩니다. 기본 = 0, 제한 = 2GB 그들은 하나를 만들었지 만 x86은 세그먼트가 읽기 / 쓰기 및 실행이 될 수 없습니다. 그래서 그들은 두 개를 만들고 CS가 코드 설명자를 가리 키도록하고 나머지 (DS, ES, SS 등)는 다른 것을 가리 키도록 설정합니다 [2]. 그러나 둘 다 같은 것을 가리 킵니다!

당신을 인터뷰하는 사람은 자신이 진술하지 않았다는 숨겨진 가정을했고, 그것은 어리석은 속임수입니다.

따라서

Q. 그렇다면 어떤 세그먼트 스레드가 공유되는지 알려주십시오.

세그먼트는 적어도 Windows에서는 질문과 관련이 없습니다. 스레드는 전체 주소 공간을 공유합니다. 스택 세그먼트 SS는 1 개 뿐이며 DS, ES 및 CS와 동일한 기능을합니다 [2]. 즉 전체 피 묻은 사용자 공간 입니다. 0-2GB. 물론, 스레드에 스택이 1 개만있는 것은 아닙니다. 당연히 각각 고유의 스택이 있지만 x86 세그먼트는이 목적으로 사용되지 않습니다.

어쩌면 * nix는 다른 것을 할 수 있습니다. 누가 알아. 이 질문에 근거한 전제는 깨졌습니다.


  1. 최소한 사용자 공간 용.
  2. 보낸 사람 ntsd notepad:cs=001b ss=0023 ds=0023 es=0023

답변

일반적으로 스레드를 경량 프로세스라고합니다. 메모리를 세 섹션으로 나누면 코드, 데이터 및 스택이됩니다. 모든 프로세스에는 자체 코드, 데이터 및 스택 섹션이 있으며이 컨텍스트 전환 시간으로 인해 약간 높습니다. 컨텍스트 전환 시간을 줄이기 위해 사람들은 스레드 개념을 생각해 냈습니다. 스레드 개념은 다른 스레드 / 프로세스와 데이터 및 코드 세그먼트를 공유하며 자체 STACK 세그먼트를 가지고 있습니다.


답변

프로세스에는 코드, 데이터, 힙 및 스택 세그먼트가 있습니다. 이제 스레드 OR 스레드의 IP (명령 포인터)는 프로세스의 코드 세그먼트를 가리 킵니다. 데이터 및 힙 세그먼트는 모든 스레드에서 공유합니다. 이제 스택 영역은 어떻습니까? 실제로 스택 영역은 무엇입니까? 스택이 힙 등보다 훨씬 빠른 방식으로 사용될 수 있기 때문에 프로세스가 스레드가 사용하기 위해 프로세스에 의해 작성된 영역입니다. 프로세스의 스택 영역은 스레드로 나뉩니다. 프로세스의 스택 영역은 3 개 부분으로 나뉘고 각각 3 개 스레드에 제공됩니다. 다시 말해, 각 스레드에 자체 스택이 있다고 말하면 해당 스택은 실제로 각 스레드에 할당 된 프로세스 스택 영역의 일부입니다. 스레드가 실행을 마치면 프로세스가 스레드 스택을 회수합니다. 사실로, 프로세스의 스택은 스레드로 분할 될뿐만 아니라 스레드가 SP, PC 및 상태 레지스터와 같이 사용하는 모든 레지스터 세트가 프로세스의 레지스터입니다. 따라서 공유와 관련하여 코드, 데이터 및 힙 영역은 공유되고 스택 영역은 스레드로 나뉩니다.


답변

스레드는 코드와 데이터 세그먼트 및 힙을 공유하지만 스택은 공유하지 않습니다.