Page 140 - 6571
P. 140
ції signal, не побачить, що умова стала істинною і не припинить
очікування.
Лістинг 26 – Реалізація семафора FIFO з передачею умови
monitor FIFOsemaphore {
int s = 0; ## s>= 0
cond pos; # отримує сигнал, коли s > 0
procedure Psem() {
if (s == 0) wait(pos);
else s = s-1;
}
procedure Vsem() {
if (empty(pos))s = s+1;
elsesignal(pos);
}
}
Даний метод передачі умови можна використовувати скрізь,
де в процедурах з викликами wait та signal є дії, що доповню-
ють одна одну. У лістингу 26 такими діями є збільшення змінної
s у процедурі Psem та її зменшення у процедурі Vsem.
З лістингів 25 та 26 можна побачити, що умовні змінні анало-
гічні операціям P та V у випадку використання семафорів. Опера-
ція wait, подібно операції P, призупиняє процес, а операція sig-
nal, як і операція V, відновлює його роботу. Однак існує дві істо-
тні відмінності. По-перше, операція wait завжди призупиняє
процес до подальшого виконання операції signal, тоді як опера-
ція P виконує зупинку процесу тільки у випадку, якщо поточне
значення семафора дорівнює нулю. По-друге, операція signal не
продукує жодних дій, якщо не існує процесів, призупинених на
умовній змінній, тоді як операція V або запускає призупинений
процес, або збільшує значення семафора, тобто стан виконання
операції signal не запам’ятовується. Через дані відмінності
умовна синхронізація з використанням моніторів реалізується по
іншому ніж із семафорами.
Спочатку для моніторів був запропонований порядок «сигна-
лізувати і очікувати», однак SC був прийнятий в операційній сис-
темі Unix, мові програмування Java і бібліотеці Pthreads. Перевагу
було віддано порядку SC, оскільки він сумісний із плануванням
процесів на основі пріоритетів і має більш просту формальну се-
мантику.
139