2017-02-21 9 views
0

문맥은 다음과 같이이다 :뮤텍스가 다시 실행되기를 기다리는 스레드는 어떻게됩니까?

  • 스레드는 일부 잠시 후
  • 차단/스레드가 잠을 넣어되어 이미 잠겨있는 뮤텍스를
  • 을 잠그려고, 뮤텍스가
을 잠금 해제

Q1) 그러면 어떻게됩니까?

스레드를 즉시 실행으로 되돌릴 수 있습니까? 아니면 커널은 실행중인 쓰레드가 타임 슬라이스를 소비하고 대기중인 쓰레드를 정상적으로 스케줄 할 때까지 기다릴 것입니까?

질문 2 뮤텍스가 영원히 잠금 해제되지 않으면 어떻게해야합니까? 커널은 스레드를 대기 상태로 유지하기로 어떻게 결정합니까?

+2

냄새 같은 숙제 .... 또는 시험 – LPs

+0

뮤텍스가 잠금 해제되지 않은 경우 프로그램에 교착 상태가 있으며 커널에 관한 한 귀하의 문제입니다. – StoryTeller

+0

@LPs 아니오 - 인터뷰 질문입니다. 나는 커널이 대기중인 쓰레드를 정상적으로 스케쥴하고 뮤텍스 상태를 다시 검사하여 실행 상태로 되돌릴 것이라고 생각한다. 그러나 확실하지 않습니다. – FaceBro

답변

1

스레드가 즉시 다시 실행 되나요? 아니면 커널은 실행중인 쓰레드가 타임 슬라이스를 소비하고 대기중인 쓰레드를 정상적으로 스케줄 할 때까지 기다릴 것입니까?

일반적으로 스레드는 이제 실행할 준비가되었습니다. 대부분의 시스템에서 사용 가능한 코어가 있으면 즉시 실행됩니다. 그렇지 않으면 다음 번에 스케줄러가 코어에서 호출 될 때 고려됩니다.

뮤텍스가 영원히 잠금 해제되지 않으면 어떻게됩니까? 커널은 스레드를 대기 상태로 유지하기로 어떻게 결정합니까?

일반적으로 스레드가 깨어날 때 가장 먼저하는 일은 뮤텍스를 잠그려고하는 것입니다. 실패하면 다시 차단됩니다. 어떤 구현은 mutex를 특정 쓰레드에 할당하여 실행 준비가되기 전에 스레드가 뮤텍스와 함께 깨어 난다.

구현이 다양하며 요구 사항을 준수하는 모든 작업을 수행 할 수 있습니다.

+0

커널은 대기 스레드를 즉시 실행할 수있는 것으로 마술처럼 설정합니까? 커널이 상태를 바꿀 수있는 뮤텍스의 대기 스레드 목록이 있습니까? – FaceBro

+2

@FaceBro - OS가 모든 스레드를 항상 추적해야하므로 분명히 알 수 있습니다. C와 Posix는 어떻게해야하는지에 대해서는 말하지 않지만 일부 스레드 ID 목록을 갖는 것이 좋은 방법 일 수 있습니다. –

+0

@FaceBro 저는 리눅스의 구현에 대해 가장 잘 알고 있습니다. 정확하게 작동하는 방식입니다. –