2010-05-11 2 views
1

? parent에 2 개의 thread가 포함되는 경우는 어떻게됩니까? 자식도 2 개의 스레드를 얻을 것입니까? 어떻게 fork가 스레드로부터 안전 할 수 있습니까? Wikipedia에서스레드와 교착 상태에 관한 몇 가지 질문은 부모 프로세스가 리소스를 사용하고 자식 프로세스도 동일한 리소스를 사용하는 경우 프로세스와 자식 프로세스가 교착 상태가됩니까?

+1

정말 말하기가 어렵습니다. 매우 구체적인 질문과 단일 리소스 및 하나의 공유 시나리오를 묻는 것이 어떻습니까? 일부 리소스는 공유 할 수 있습니다. 몇몇은 할 수 없다. 일부는 몇 가지 방법으로 공유 할 수 있지만 다른 것은 공유 할 수 없습니다. 예를 들어, 메모리는 일반적으로 읽을 수는 있지만 동기화 없이는 동시에 쓰지는 못합니다. CPU는 운영 체제에 의해 조정됩니다. – WhirlWind

+0

또한 질문에 대한 귀중한 답변을 받았다고 믿는다면, 당신을 도우려는 사람들에게 보상 할 수있는 훌륭한 대답을 받아 들일 수 있습니다. – WhirlWind

답변

2

한 문장의 설명을

교착 상태는 두 개 이상의 경쟁 행동은 각 따라서도 지금까지 수행하는 다른 완료 될 때까지 기다리고, 그리고되는 상황이다.

가장 간단한 경우는 두 개의 스레드와 두 개의 자원입니다.

스레드 A :

acquireResource(r1) 
    acquireResource(r2) 
    // Do stuff 
    releaseResource(r1) 
    releaseResource(r2) 

스레드 B : 다음과 같은 일련의 이벤트가 발생하면

acquireResrouce(r2) 
    acquireResource(r1) 
    // Do stuff 
    releaseResource(r1) 
    releaseResource(r2) 

이 코드 교착 상태가 발생한다.

  1. 스레드 A가 B를
  2. 스레드 B가 스레드 R1 내지
  3. 컨텍스트 스위치를 취득하고이를 R2가 이미 소유하고 있기 때문에 진행할 수없는 점 실 (A)에서 R2

를 취득하고, 스레드 B는 수 r1이 소유되어 있기 때문에 진행하지 마십시오. 그러므로 어느 스레드도 자원을 해제 할 수있는 지점으로 진행할 수 없습니다. 이것은 교착 상태입니다.

코드를 통해 동일한 순서로 리소스를 확보하면 이처럼 간단한 경우를 피할 수 있습니다. 예를 들어, 스레드 B가 r1을 먼저 얻은 경우 교착 상태가 발생하지 않습니다. 교착 상태를 극복하는 데는 여러 가지 방법이 있지만 피하기가 훨씬 더 어렵습니다.

관련 문제