누군가 Linux의 잠자기/깨우기 역학을 설명할 수 있습니까?

누군가 Linux의 잠자기/깨우기 역학을 설명할 수 있습니까?

저는 운영 체제의 잠금 메커니즘을 연구하던 중 다음 POSIX 기능을 발견했습니다.

pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m);
pthread_cond_signal(pthread_cond_t *c);

나는 여기서 잠자기/깨우기의 개념을 완전히 이해합니다. 하지만 이것이 하드웨어에서 어떻게 수행되는지, 스케줄링에 어떤 영향을 미치는지 잘 모르겠습니다.

내 이해는 스레드가 실행될 때 pthread_cond_wait()가 절전 모드(블록)로 전환된다는 것입니다. 그러나 이것이 실제로 무엇을 의미합니까? 예, 일정이 취소되고 권한 있는 대기열 어딘가에서 차단된 상태가 됩니다. 하지만 다른 프로세스가 pthread_cond_signal()을 수행할 때 CPU는 차단된 스레드를 어떻게 깨울까요? 커널은 타이머 인터럽트 동안 모든 조건 변수를 확인한 다음 해제된 스레드와 연관된 스레드를 깨우기로 결정합니까?

온라인에서 이에 대한 자세한 설명을 찾을 수 없거나 제가 잘못 본 것일 수도 있습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

예약할 프로세스/스레드의 대기열에 프로세스/스레드를 삽입하여 해당 프로세스/스레드를 깨웁니다. 당신이 보면원천그 중에는 signal조건 변수를 기다리는 스레드의 사용자 공간 목록이 있는데, 그 중 하나는 futex시스템 호출에 의해 깨어납니다. 매 틱마다 조건 변수 배열을 확인하는 것은 매우 느릴 것입니다...

그렇다면 차단되는 스레드를 설명할 때 이는 I/O를 기다리는 스레드처럼 차단 대기열에 들어간다는 의미는 아닙니다.

스레드는 사용자 공간과 커널 공간을 혼합하여 구현됩니다. I/O를 기다리는 스레드/프로세스가 특정 I/O 작업이 완료되면 다시 예약되도록 커널 공간 목록에 배치되는 것처럼 조건 변수를 기다리는 스레드는 해당 조건 변수에 대한 사용자 공간 목록에 배치됩니다. 따라서 귀하의 질문에 대한 대답은 "예 또는 아니오"입니다. :-)

그리고 현재 스레딩 구현은 수년에 걸쳐 최적화되어 왔으므로 구현이 (더 단순한) 원칙과 일치하지 않더라도 막히지 마십시오.

답변2

스레드가 절전 메서드를 호출하면 스레드가 절전 대기열에 추가됩니다. 계산된 클럭 주파수가 100HZ이면 현재 실행 중인 프로세스가 10ms마다 중단된다는 의미입니다. 스레드의 현재 컨텍스트를 유지한 후 각 스레드에 대해 이 값(-10ms)을 줄입니다. 0이면 스레드가 "CPU 대기 중" 대기열로 이동됩니다. 이 스레드에 타임 슬라이스가 오면 다시 실행됩니다. 또한 즉시 실행이 시작되지 않기 때문에 실제 Sleep 시간은 설정한 값보다 길어집니다.

관련 정보