Я не понимаю, почему мы не можем реализовать условную операцию в мониторе: wait()
и signal()
напрямую семафорами, как показано ниже:
wait(){Semaphores.wait()}
signal(){Semaphores.signal()}
Где Semaphores.wait()
реализовано следующим образом:
Semaphores.wait(){
S->value --;
if(S->value <0){
go to sleep;
}
}
В чем разница между wait () и signal () в семафорах и мониторе?
Например, в концепции операционной системы (6.7.2 на стр. 280) wait () в мониторе реализован так:
x count++;
if (next_count > 0)
Semaphores.signal(next);
else
Semaphores.signal(mutex);
Semaphores.wait(x_sem);
x_count--;
Это потому, что монитор использует следующий стиль:
Acquire_lock(); //using mutex.wait()
while(condition){x.wait();}
Release_lock(); //using mutex.signal()
/*critical section */
Acquire_lock(); //using mutex.wait()
x.signal();
Release_lock(); //using mutex.signal()
, в то время как семафорам не нужно получать блокировку, вместо этого:
Semaphores.wait();
/*critical section */
Semaphores.signal();