이 스레드에서 차단 해제 할 다음 스레드는 sem_wait()
입니다. OS가 결정하는 스레드는 컨텍스트 전환을위한 다음 스레드입니다. 아무도 주문을 보증하지 않습니다. OS의 스케줄링 전략에 따라 다릅니다. CPU에서 가장 오랫동안 지속 된 스레드이거나 가장 높은 "우선 순위"가 할당 된 스레드이거나 역사적으로 특정 리소스 사용 통계를 가지고있는 스레드 또는 기타 일 수 있습니다.
대부분의 경우 현재 스레드 (sem_post()
을 호출 한 스레드)는 사용자 입력 대기, 다른 세마포어 차단 또는 os 할당 시간 제한이 끝날 때까지 잠시 동안 계속 실행됩니다. 그런 다음, 운영 체제는 몇 분의 1 초 (아마도 파이어 폭스 또는 무언가)를 실행하기 위해 전혀 관련이없는 프로세스를 전환 한 다음 일부 네트워크 트래픽을 처리하고 차 한 잔을 마친다. 특정 스레드가 CPU 또는 I/O 바인딩보다 많은 과거 기록을 기반으로 느끼는지 여부와 같은 것을 바탕으로 느끼는 다른 스레드 중 원하는 것을 선택하십시오.
많은 OS에서, 오랫동안 주변에 없었던 I/O 바인딩 프로세스가 우선시됩니다. 이론은 새로운 프로세스가 수명이 짧을 수도 있다는 것입니다 (이미 5 시간 동안 진행 중이라면 다음 1ms 내에 완료되지 않을 것이라는 확률). 그래서 우리는 그 프로세스를 끝낼 수도 있습니다. I/O 바인딩 된 프로세스는 I/O 바인딩을 계속할 가능성이 높습니다. 즉, 다른 리소스를 기다리는 동안 곧 CPU를 끌 것입니다. 기본적으로 운영 체제는 최대한 빨리 처리 할 수있는 프로세스를 찾고 싶어하므로 차를 마시고 악성 코드를 실행할 수 있습니다.
그렇지만 한 번에 하나의 스레드 만 통과 할 수있는 경우 대기 큐가 세마포어에 대해 어떻게 작동하는지 정확하게 알 수 있습니까? – user82229
세마포어는 주문을 보증하지 않습니다. 그들은 실제로 큐 또는 다른 FIFO 구조를 사용할 필요가 없습니다. 한 번에 하나의 스레드 만 허용되면 V()를 호출 할 때 다른 스레드 (무작위 일 수도 있음)가 해당 P() 호출에서 돌아와 계속됩니다. –
@ 벤 S : 왜 당신이 응답 한 사람에게 그 코멘트를 홍보하지 않습니까? 나는 처음부터 heluimwhippet이 무엇인지 생각하고있다. – dmckee