Page 87 - 4868
P. 87
85 Ошибка! Стиль не определен.
Синхронізація є основою паралельних програм, тому для розробки
правильних протоколів синхронізації бажано мати спеціальні засоби, які
можна використовувати для блокування призупинених процесів. Першими
такими засобами синхронізації, які не втратили актуальності і сьогодні, стали
семафори. Вони забезпечують захист критичних секцій і можуть
використовуватися систематично для реалізації таких процедур, як
планування та сигналізація.
Ідея семафора відповідно до назви взята з методу синхронізації руху
поїздів, прийнятого на залізниці. Залізничний семафор – це «сигнальний
прапорець», що показує, чи шлях попереду вільний або зайнятий іншим
поїздом. У процесі руху поїзда семафори встановлюють і скидаються.
Семафор залишається встановленим на час, достатній для того, щоб при
необхідності зупинити інший потяг. Таким чином, залізничні семафори
можна розглядати як пристрої, які сигналізують про умови на колії, та
забезпечують взаємовиключне проходження поїздів по критичних ділянках
шляху. Семафори в паралельних програмах виконують аналогічні функції –
вони надають базовий механізм сигналізації і використовуються для
реалізації взаємного виключення і умовної синхронізації.
Семафор – це особливий вид спільної змінної, яка опрацьовується тільки
двома неподільними операціями 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; >
V(s): < s = s+1; >