2009-03-24 8 views
1

세마포어 기능을 확장했습니다. 실제 세마포어 구현을 모르고 코드가 올바르게 실행되었는지를 알았을 때 나는로드 블록을 만났습니다. 이것을 알아야했습니다.세마포 큐

semawa는 sem_wait()을 호출 할 때 대기중인 스레드를 차단하고 현재 다른 스레드가 잠근 상태 인 것을 알고 있습니다. 그런 다음 스레드가 차단 된 다음 해당 세마포어의 대기 목록에 넣습니다.

제 질문은 sem_post()에서 일어나는 일과 관련이 있습니다. 다음 스레드가 대기중인 목록에서 뽑아 져서 잠금 스레드로 설정되어 있으며 차단 해제 할 수 있습니까? 아니면 전혀 다른 게시 방법입니까?

감사합니다.

답변

7

Semaphores이 두 가지 작업이 있습니다

  1. P() 세마포어를 획득하기를 세마포어를 해제하려면
  2. V() (이 sem_wait를 호출하는 것)

(이 sem_post를 호출하는 것) 세마포어는 또한 그들과 연관된 정수를 가지며, 블로킹없이 P()를 전달할 수있는 동시 스레드 수입니다. P()에 대한 다른 호출은 V()가 호출되어 지점을 비울 때까지 차단됩니다.

이것은 세마포어의 고전적인 정의입니다.

편집 : 세마포어는 주문을 보증하지 않습니다. 그들은 실제로 큐 또는 다른 FIFO 구조를 사용할 필요가 없습니다. 한 번에 하나의 스레드 만 허용되면 V()를 호출 할 때 다른 스레드 (무작위 일 수도 있음)가 해당 P() 호출에서 돌아와 계속됩니다.

+0

그렇지만 한 번에 하나의 스레드 만 통과 할 수있는 경우 대기 큐가 세마포어에 대해 어떻게 작동하는지 정확하게 알 수 있습니까? – user82229

+0

세마포어는 주문을 보증하지 않습니다. 그들은 실제로 큐 또는 다른 FIFO 구조를 사용할 필요가 없습니다. 한 번에 하나의 스레드 만 허용되면 V()를 호출 할 때 다른 스레드 (무작위 일 수도 있음)가 해당 P() 호출에서 돌아와 계속됩니다. –

+0

@ 벤 S : 왜 당신이 응답 한 사람에게 그 코멘트를 홍보하지 않습니까? 나는 처음부터 heluimwhippet이 무엇인지 생각하고있다. – dmckee

8

이 스레드에서 차단 해제 할 다음 스레드는 sem_wait()입니다. OS가 결정하는 스레드는 컨텍스트 전환을위한 다음 스레드입니다. 아무도 주문을 보증하지 않습니다. OS의 스케줄링 전략에 따라 다릅니다. CPU에서 가장 오랫동안 지속 된 스레드이거나 가장 높은 "우선 순위"가 할당 된 스레드이거나 역사적으로 특정 리소스 사용 통계를 가지고있는 스레드 또는 기타 일 수 있습니다.

대부분의 경우 현재 스레드 (sem_post()을 호출 한 스레드)는 사용자 입력 대기, 다른 세마포어 차단 또는 os 할당 시간 제한이 끝날 때까지 잠시 동안 계속 실행됩니다. 그런 다음, 운영 체제는 몇 분의 1 초 (아마도 파이어 폭스 또는 무언가)를 실행하기 위해 전혀 관련이없는 프로세스를 전환 한 다음 일부 네트워크 트래픽을 처리하고 차 한 잔을 마친다. 특정 스레드가 CPU 또는 I/O 바인딩보다 많은 과거 기록을 기반으로 느끼는지 여부와 같은 것을 바탕으로 느끼는 다른 스레드 중 원하는 것을 선택하십시오.

많은 OS에서, 오랫동안 주변에 없었던 I/O 바인딩 프로세스가 우선시됩니다. 이론은 새로운 프로세스가 수명이 짧을 수도 있다는 것입니다 (이미 5 시간 동안 진행 중이라면 다음 1ms 내에 완료되지 않을 것이라는 확률). 그래서 우리는 그 프로세스를 끝낼 수도 있습니다. I/O 바인딩 된 프로세스는 I/O 바인딩을 계속할 가능성이 높습니다. 즉, 다른 리소스를 기다리는 동안 곧 CPU를 끌 것입니다. 기본적으로 운영 체제는 최대한 빨리 처리 할 수있는 프로세스를 찾고 싶어하므로 차를 마시고 악성 코드를 실행할 수 있습니다.