2011-12-06 2 views
12

특히에있는 GC에 대해, CLR이 컬렉션을 시작하려고 할 때를 읽었습니다. 콜렉션이 발생하기 전에 스레드를 일시 중단해야한다는 것을 이해하지만 스레드 명령어 포인터가 안전한 지점에 도달 할 때이를 수행해야한다고 언급합니다. 안전한 지점에 있지 않은 경우에는 신속하게 하나를 얻으려고 시도하고 스레드를 hijacking (스레드 스택에 특수 함수 포인터를 삽입)하면됩니다. 그게 다 괜찮아요, 멋져요,하지만 기본적으로 관리 스레드가 안전하다고 생각 했나요?GC 동작 및 CLR 스레드 하이재킹

처음에는 관리되지 않는 스레드를 참조했을 수도 있지만 CLR을 사용하면 사용중인 개체가 고정되어 있어야하므로 관리되지 않는 스레드가 계속 실행될 수 있습니다.

따라서 관리되는 스레드에서 safe point은 무엇이며 어떻게 GC가이를 결정할 수 있습니까?

편집 :

나는 내가 충분히 특정 당하고 있다고 생각하지 않습니다. this MSDN article에 따르면 Thread.Suspend이 호출 될 때도 safe point에 도달 할 때까지 스레드가 실제로 일시 중단되지 않습니다. 또한 safe point은 가비지 콜렉션이 수행 될 수있는 쓰레드 실행 지점이라는 것을 계속 설명합니다.

내 질문에 내가 분명하지 않다고 생각합니다. 스레드는 안전한 시점에서만 일시 중지 될 수 있으며 GC에 대해 일시 중지해야한다는 것을 알고 있지만 안전한 지점이 무엇인지 명확한 답을 찾을 수 없습니다. 코드의 한 부분을 안전하다고 판단하는 것은 무엇입니까?

+2

CLR이 아닌 CLR이 안전합니다. –

답변

13

'안전 포인트'입니다 우리가 여기서

  1. 아니 catch 블록에서

    . 잠금 (관리 코드) P/invoke'd 호출 내부
  2. 하지 안에 마지막으로
  3. 하지 내부
  4. 하지 않습니다. CLR에서 관리되지 않는 코드를 실행하지 않습니다.
  5. 메모리 트리를 사용할 수 있습니다.

포인트 # 5는 다소 혼란 스럽지만 메모리 트리를 걸을 수없는 경우가 있습니다. 예를 들어, 최적화 후 CLR은 Object를 새로 추가하고 변수에 직접 할당하지 않을 수 있습니다. GC에 따르면이 개체는 수집 할 준비가 된 죽은 개체가 될 것입니다. 컴파일러는 GC가 아직 실행되지 않을 때 GC에 지시합니다. http://blogs.msdn.com/b/abhinaba/archive/2009/09/02/netcf-gc-and-thread-blocking.aspx

편집 :

여기에 조금 더 정보를 MSDN의 블로그 포스트는 글쎄, 선생님, 내가 잘못에 대한 # 4이었다. '안전 지점'섹션에서 here을 참조하십시오. p/invoke (관리되지 않는) 코드 섹션 안에 있으면 관리 코드로 다시 돌아올 때까지 실행이 허용됩니다.

그러나 this MSDN article에 따르면 CLR 코드의 관리되지 않는 부분에있는 경우 안전하다고 간주되지 않으며 코드가 관리 상태로 돌아갈 때까지 대기합니다. (나는 적어도 가까웠다.)

+0

아, 그게, 특히 # 5, 전체 메모리 구조가 GC가 컬렉션을 실행하는 검증 가능한 상태에 있어야합니다. 대답을 할 때 아주 간단한 개념입니다. 문제가 생기기 시작했습니다.감사! –