세마포어 기초.. 질문입니다.

슈퍼공돌이의 이미지

안녕하세요.. C 언어로 세마포어를 공부하고 있는 학생입니다.
지금은 두 쓰레드를 생성하여서 producer, consumer구조를 만들고 있습니다.
결과가 좀 생각한것과 달라서, 조금 당황 스러워서 질문을 올리게 되었습니다.
mutex는 1, full은 0으로, empty는 100으로 초기화하였습니다.
저는 producer하고 consumer가 랜덤하게 호출될줄알았는데
producer 100번 consumer 100번 번갈아 호출되더군요....
producer에서 sem_post를 호출하면 다른 쓰레드인 consumer로 도중에 스위칭되어야하지않나요?
왜 100번 호출되어야 consumer가 호출되는지 이해가 안갑니다 ㅠㅠ
조언좀 부탁드립니다.

Producer부분

for(i=0; i<300; i++) {
   item * next_produced = produce();
   sem_wait(&empty);
   sem_wait(&mutex);
   buffer[in] = next_produced; 
   in = (in + 1) % BUFFER_SIZE; 
   sem_post(&mutex); 
   sem_post(&full);
}

Consumer 부분
for(i=0; i<300; i++)  {
   item* next_consumed;
   sem_wait(&full);
   sem_wait(&mutex);
   next_consumed = buffer[out]; 
   out = (out + 1) % BUFFER_SIZE; 
   sem_post(&mutex); 
   sem_post(&empty);
   consume(next_consumed);
}

jick의 이미지

그냥 "스케줄러는 OS 맘대로"라고 생각하시면 됩니다.

sem_post를 불렀다고 해도 Consumer가 "깨어날 수 있는" 상태가 되었을 뿐이지 그 순간 OS가 producer를 잠재우고 consumer를 깨워야 할 의무가 없습니다. OS 입장에서는 producer를 계속 돌려서 sem_post를 100번 하고 consumer로 바꾸면 context switch를 단 한 번만 하면 되니까 아주 나이스하죠.

* 거듭 강조합니다만 이건 "오늘 일진에 따라" 그렇다는 것일 뿐 똑같은 프로그램을 같은 컴파일러로 컴파일해 같은 OS에 대고 돌려도 그날의 운수에 따라 오늘은 producer 30번 하고 consumer 깨우기... 이런 거 될 수도 있습니다. 물론 안 될 수도 있습니다. (실은 안 될 가능성이 좀 더 높습니다.) 이건 OS 마음대로이고 OS는 절대 아무런 순서도 보장하지 않습니다.