Page 108 - 6571
P. 108
фори встановлюють і скидаються. Семафор залишається встанов-
леним на час, достатній для того щоб при необхідності зупинити
інший потяг. Таким чином, залізничні семафори можна розгляда-
ти як пристрої, які сигналізують про умови на колії, та забезпе-
чують взаємовиключне проходження поїздів по критичних ділян-
ках шляху. Семафори в паралельних програмах виконують ана-
логічні функції – вони надають базовий механізм сигналізації і
використовуються для реалізації взаємного виключення і умовної
синхронізації.
Семафор – це особливий вид спільної змінної, яка
опрацьовується тільки двома неподільними операціями P та V.
Семафор можна вважати екземпляром класу Semafor, а операції
P та V – методами цього класу з додатковим атрибутом, що
визначає їх неподільність.
Значення семафора є додатним цілим числом. Операція V
використовується для сигналізації про те, що подія відбулася,
тому вона збільшує значення семафора. Операція P призупиняє
процес до моменту, поки не відбудеться деяка подія. Після того
як значення семафора стало позитивним, операція P зменшує
його. Потужність використання семафорів обумовлена тим, що
виконання операції P може бути призупинено у будь-який
момент часу.
Семафор оголошується наступним чином:
sem s;
За замовчуванням початковим значенням семафора є 0, але
семафор можна ініціалізувати будь-яким позитивним значенням,
наприклад:
sem lock = 1;
За необхідності можна оголошувати та ініціалізувати масиви
семафорів:
sem forks[5] = ([5] 1);
Після оголошення та ініціалізації семафор можна обробляти
тільки за допомогою операцій P та V. Кожна з них є неподільною
дією з одним аргументом. Нехай s – семафор. Тоді операції P(s)
та V(s) визначаються наступним чином.
P(s): < await (s > 0) s = s-1; >
107