Page 130 - 6571
P. 130
Для виходу із неподільних дій використовується код
помічений через SIGNAL.
if (nw == 0 and dr > 0) {
dr = dr-1;
V(r);
# відновити процес-читач, або
} else if (nr == 0 and nw == 0 and dw > 0) {
dw = dw-1;
V(w);
# відновити процес-письменник, або
} else {
V(e);
# звільнити блокування входу
}
Роль коду SIGNAL полягає у сигналізації тільки одному із
трьох семафорів. Це означає, що якщо немає активних
письменників, але є призупинений читач, то він може бути
продовжений за допомогою операції V(r). Якщо немає активних
читачів або письменників, але є призупинений письменник, то він
може бути продовжений за допомогою операції V(w). В іншому
випадку, якщо немає відкладених процесів, які можна безпечно
продовжити, то вхідний семафор отримає сигнал за допомогою
операції V(e).
Три семафори в лістингу 24 утворюють спільний двійковий
семафор, оскільки в будь-який момент часу тільки один з них
може мати значення 1, а всі виконувані гілки починаються
операціями P і закінчуються операціями V. Отже, оператори між
кожною парою P та V виконуються із взаємним виключенням.
Інваріант синхронізації RW є істинним на початку роботи
програми і перед кожною операцією V, так що він істинний, якщо
один із семафорів має значення 1. Крім того, при виконанні
захищеного оператора істинним є його умова захисту B, оскільки
його перевірив або сам процес і виявив, що він має значення
«істина», або семафор, який сигналізував про поновлення
виконання призупиненого процесу у випадку якщо умова B
«істина». Приведене рішення не призводить до взаємного
блокування, оскільки семафор затримки отримує сигнал тільки у
випадку, якщо деякий процес знаходиться в стані очікування або
129