Page 138 - 6571
P. 138
У лістингу 25 представлено монітор, який реалізує семафор.
Монітор і семафор дуальні в тому сенсі, що за допомогою одного
із них можна реалізувати інший, і, отже, їх можна використовува-
ти для вирішення одних і тих же завдань синхронізації. Однак
монітори є механізмом більш високого рівня, ніж семафори.
Лістинг 25 – Реалізація семафора за допомогою монітора
monitor Semaphore {
int s = 0; ## s>= 0
cond pos; # отримати сигнал, коли s > 0
procedure Psem() {
while (s == 0) wait(pos);
s = s-1;
}
procedure Vsem() {
s = s+1;
signal(pos);
}
}
У лістингу 25 цілочисельна змінна s представляє собою зна-
чення семафора. Процедура Psem, призупиняє процес, доки зна-
чення змінної s не стане додатнім, а потім зменшує його на 1. За-
тримка реалізується за допомогою циклу while, який переводить
процес в режим очікування за умови, що змінна s дорівнює 0.
Операція Vsem збільшує s на 1 і генерує сигнал для змінної pos.
Якщо існують призупинені процеси, то запускається на виконан-
ня «найстарший» із них.
Програма з лістингу 25 коректно працює як при порядку «си-
гналізувати і очікувати» (SW), так і при «сигналізувати і продов-
жити» (SC). Під коректністю роботи розуміється збереження іс-
тинності інваріанта семафора s >= 0. Порядок роботи відрізня-
ються тільки послідовністю виконання процесів. Викликаючи
процедуру Psem, процес очікує доки змінна s дорівнює 0, а після
запуску зменшує її значення. Викликаючи Vsem, процес спочатку
збільшує змінну s, після чого запускає призупинений процес.
При порядку SW призупинений процес виконується відразу та
зменшує значення семафора s. При порядку SC призупинений
процес виконується через деякий час після завершення процесу,
що згенерував сигнал. Призупинений процес повинен перевірити
137