2012-01-04 3 views
4

스레드를 사용 중이고 스레드가 종료까지 실행되지만 분리되지 않은 경우 스레드는 좀비 상태에있어 조인으로 수확되거나 분리되어 리소스를 정리할 수 있습니다.스레드가 종료 될 때 스택이 지속되고 분리되지 않는 이유는 무엇입니까?

스레드가 좀비 일 때 정리되지 않은 두 개의 '리소스'는 스택과 반환 값입니다.

누군가가 가입 할 때까지 스택을 유지할 수있는 논리를 말해 줄 수 있습니까? 반환 값을위한 별도의 위치가있는 경우에는 좋은 이유를 생각할 수 없습니다.하지만 스레드가있을 때이를 알고 싶습니다.

+0

저는 이것이 매우 OS 의존적 인 질문이라고 생각합니다. 또한 스택 메모리가 해제되지 않는다고 어떻게 말할 수 있습니까? –

+0

아마도 반환 값이 스택에 저장되어 있습니까? 그러나 일반적으로 이는 매우 시스템에 따라 다릅니다. –

답변

4

스택을 생생하게 유지하는 기술적 인 구현이 더 쉽습니다. 스레드 구현은 스케줄러의 현재 스레드를 등록 해제하는 경우에도 작업 공간으로 스택의 맨 아래를 사용할 수 있습니다. 그 후, join()을 호출하는 스레드 컨텍스트를 사용하여 공간을 삭제할 수 있습니다.

join() 전에 스택을 삭제할 경우 - 즉 종료 스레드의 컨텍스트에서 - 스택 삭제와 스레드 등록 해제 간의 짧은 시간 동안 스택이나 다른 메모리가 없을 것입니다.

3

스레드가 종료 되 자마자 스택을 회수할지 여부는 OS에 따라 다릅니다.

다음 스레드는 좋은 읽을 거리입니다. link.

은 꽤 흥미 로저 포크너의 다음 게시물을 찾을 수 :

는 적어도 Solaris 9 및 10, 하여 라이브러리 (사용의 mmap()를) 할당 된 스레드 스택 즉시 재사용을 위해 해제됩니다 스레드시 종료. 스레드 ID와 반환 값을 포함하는 스레드 구조는 pthread_join() (또는 pthread_detach())까지 해제되지 않습니다.

스레드를 최대 10 개까지 캐시 할 수있어 새로운 스레드를 신속하게 재사용 할 수 있습니다. 캐시 한계를 넘은 오래된 스택은 munmap()입니다.

내 우분투 시스템에서는 pthread_join()이 호출 될 때까지 스택을 회수하지 않습니다. 나는 이것이 단순히 의식적인 디자인 결정보다는 구현의 인공물이라고 생각한다.

관련 문제