세마포어 기초.. 질문입니다.
글쓴이: 슈퍼공돌이 / 작성시간: 화, 2015/10/20 - 2:18오전
안녕하세요.. 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); }
Forums:
정상입니다.
그냥 "스케줄러는 OS 맘대로"라고 생각하시면 됩니다.
sem_post를 불렀다고 해도 Consumer가 "깨어날 수 있는" 상태가 되었을 뿐이지 그 순간 OS가 producer를 잠재우고 consumer를 깨워야 할 의무가 없습니다. OS 입장에서는 producer를 계속 돌려서 sem_post를 100번 하고 consumer로 바꾸면 context switch를 단 한 번만 하면 되니까 아주 나이스하죠.
* 거듭 강조합니다만 이건 "오늘 일진에 따라" 그렇다는 것일 뿐 똑같은 프로그램을 같은 컴파일러로 컴파일해 같은 OS에 대고 돌려도 그날의 운수에 따라 오늘은 producer 30번 하고 consumer 깨우기... 이런 거 될 수도 있습니다. 물론 안 될 수도 있습니다. (실은 안 될 가능성이 좀 더 높습니다.) 이건 OS 마음대로이고 OS는 절대 아무런 순서도 보장하지 않습니다.
댓글 달기