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

슈퍼공돌이의 이미지

안녕하세요.. 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는 절대 아무런 순서도 보장하지 않습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.