SW 그리고 아빠 엔지니어링 중...

아는 만큼 보이고, 경험해봐야 알 수 있고, 자꾸 써야 내 것이 된다.

L C++/Concurrency

[Concurrency] 좀비 스레드 생성될 수 있는가?

보리남편 김 주부 2023. 7. 18. 08:00
thread는 한정된 자원을 효율적으로 사용할 수 있는 기능이지만 잘 알고 다뤄야 합니다. 만약 저처럼 좀비 thread가 있을 수 있을까?라고 생각하는 사람이 있다면 아래글을 참고 부탁 드립니다.

 

일반적으로는 zombie thread는 생성되지 못한다.


zombie thread는 생길 수 없다. thread는 메인스레드나 프로세스가 종료가 되면 자동으로 종료되기 때문이다. -끝

 

 

그럼 zombie thread가 생성되는 경우는?


스레드 커널객체에 참조계수(usage count)가 있다.

만약 thread  하나가 생성되면 usage count 가 2가 된다. (새로 생성한 thread + 주 thread) 이때 새로 생성한 thread를 종료하지 않고 주 thread가 종료되면 OS가 자동으로 모든 핸들을 닫아 주기에 zombie thread가 생성될 수 없지만

만약 주 thread가 종료되지 않은 상태에서 새로 생성한 thread를 detach() (C는 CloseHandle(h))를 하지 않으면 주 thread 가 종료되기 전까지는 zombie thread가 될 수 있다. 실제로 전원 off 전 혹은 sleep이 들어가기 전까지 프로세스가 살아 있어야 하는 경우가 있기에 이럴 때는 zombie thread로 리소스 낭비가 일어날 수 있다.

 

'핸들 개체를 닫는다'는 의미는?


detach() (C는 CloseHandle(h))를 단어 뜻 그대로 열려있는 핸들 개체를 닫는 역할을 한다.

핸들 개체를 닫을 때 참조계수가 차감이 되며 이 참조계수가 0이 되면 Thread가 파괴가 되지만, 주 thread 가 있기에 핸들 개체를 닫는다고 즉시 Thread가 종료되지는 않는다. 그렇다고 thread는 운영체제의 자원을 사용하고 프로그램에서는 직접적으로 운영체제의 자원을 접근할 수 없지만 (그래서 thread에 직접적인 접근을 할 수 없다.) 핸들을 통해서 접근을 허용하고 있기에 무조건 빨리 핸들 개체를 닫아서도 안된다.

그리고 만약 핸들 개체를 닫지 않은 상태에서 thread를 강제 종료를 하면 자원 leak 이 생기기에 핸들 개체를 닫는 처리는 잘해야 한다.

728x90