2011-02-10 3 views

답변

5

대기 및 깨우기는 일반적으로 과 협력하여 스케줄러와 함께 수행됩니다. 대기중인 스레드 중 특정 하나를 깨우도록 강제하는 뮤텍스 구현은 일반적으로 빈약 한 구현으로 간주됩니다.

대신 뮤텍스 또는 세마포어는 스레드가 대기 중임을 스케줄러에 알리고 "실행할 준비가되었습니다"목록에서 제거합니다. 그런 다음, 뮤텍스 잠금이 해제 또는 세마포어는 구현 중 하나

  1. 스케줄러에게 통지 스케줄러의 재량에 따라 대기 스레드 중 하나, 또는

  2. 을 깨워 스케줄러를 요청합니다, 신호 때 모든 대기중인 스레드를 실행할 준비가 된 다음 대기중인 스레드에 논리를 적용하여 스케줄러가 깨우는 첫 번째 스레드를 제외한 모든 스레드가 다시 잠자기 상태가되도록합니다.

전자가 선호되는 구현 방법이지만 항상 사용할 수있는 것은 아닙니다. 두 번째는 "천둥 무리 (thundering herd)"접근법이라고 불리기도합니다. 기다리는 스레드가 1000 개일 경우 1000 개가 모두 깨우며 (999 개는 큰 천둥 소리를냅니다.) 잠자기 상태로 돌아갑니다. 이것은 CPU 리소스를 낭비하고 가능하면 구현을 피할 것입니다.

+0

유익한 정보! 하지만 나는 여전히 의심의 여지가 있습니다. 왜 스케줄러가 대기열의 모든 스레드를 깨우지 않고 대기열의 첫 번째 파일을 가져올 수 없습니까? 그리고 현재 리눅스에서 posix 스레드 라이브러리를 구현하고있는 것은? 감사! – zach

+0

위의 옵션 1 : 스케줄러의 재량에 따라 하나 깨우기. –

+0

리눅스에서 pthread_mutex_t는 단 하나의 스레드 만 깨운다 고 생각합니다. –

0

이것은 구현에 따라 크게 달라집니다. 이러한 것들을 말할 때, 우리는 일반적으로 운영 체제를 지원할 수있는 스레드를 참조하거나 언어로 완전히 구현 될 수 있으므로 스레드 지원을 위해 O/S와도 상호 작용하지 않습니다.

그러나 프로세스를 참조 할 수도 있지만 이러한 구현에는 일반적으로 프로세스 관리를위한 일부 O/S 지원 외에도 복잡한 메시지 전달 패턴이 필요합니다.

0

예, 대기 조건이 충족 될 때까지 대기 프로세스 (세마포어 또는 I/O)가 스케줄러의 실행 대기열에서 제거된다는 간단한 설명이 있습니다.