Page 139 - 6571
P. 139
значення семафора s щоб переконатися, що воно позитивне,
оскільки можлива ситуація в якій інший процес з черги входу ви-
конав процедуру Psem і зменшив значення s. Таким чином, код в
лістингу 25 забезпечує послідовність обслуговування FIFO для
порядку SW, але не для порядку SC.
У лістингу 25 представлена ще одна відмінність між поряд-
ками вироблення сигналів SW та SС. При порядку SW цикл wh-
ile в процедурі Psem можна замінити простим оператором if.
При цьому процес, який отримав сигнал, відразу розпочне своє
виконання.
if (s == 0) wait(pos);
Монітор, представлений в лістингу 25, можна модифікувати
таким чином, щоб він коректно працював при обох порядках за-
пуску процесів (SC та SW), при цьому не використовував цикл
while та реалізував семафор з порядком обслуговування FIFO.
Повернемося до програми в лістингу 25. Коли процес вперше
викликає процедуру Psem, то він повинен призупинити своє
виконання, якщо значення s дорівнює 0. Процес, що викликає
процедуру Vsem, запускає призупинений процес, якщо такий
існує. Різниця між виробленням сигналів в порядку SC та SW
полягає в тому, що якщо процес-сигналізатор продовжує
виконуватися, то уже збільшене на одиницю значення семафора s
може зчитати не тільки запущений, але і будь-який інший процес
із черги. Для вирішення даної проблеми процес, що викликає
процедуру Vsem повинен сигналізувати для змінної pos, при
цьому не збільшуючи значення семафора s (у випадку, якщо існує
призупинений процес), інакше збільшити значення семафора s.
Відповідно, якщо процес, що викликає процедуру Psem, повинен
очікувати, то надалі він не зменшить значення семафора s,
оскільки до того часу воно не буде збільшене процесом, що
згенерував сигнал.
Монітор, що використовує описаний спосіб сигналізації,
представлений в лістингу 26. Даний метод називається передачею
умови, оскільки, сигналізатор неявно передає значення умови
процесу(змінна s > 0), який він запускає. Умова є прихованою,
тому жоден інший процес, окрім того, що виконує запуск опера-
138