Почему мы не можем реализовать монитор с семафорами следующим образом - PullRequest
0 голосов
/ 02 февраля 2020

Я не понимаю, почему мы не можем реализовать условную операцию в мониторе: 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();
...