Page 88 - 4868
P. 88
Ошибка! Стиль не определен. 86
Операція V збільшує значення s на одиницю неподільним чином.
Операція P зменшує значення s, але перед тим вона спочатку очікує, поки
значення s не стане позитивним.
Призупинення виконання процесу і операція віднімання в P є єдиною
неподільною дією. Припустимо, що s – семафор з поточним значенням 1.
Якщо два процеси намагаються одночасно виконати операцію P(s), то це
вдасться зробити тільки одному із них. Але якщо один процес намагається
виконати операцію P(s), а інший – V(s), то обидві операції будуть успішно
виконані в непередбачуваному порядку, а кінцевим значенням семафора s
стане 1.
Звичайний семафор може приймати будь-які невід’ємні значення,
двійковий семафор – тільки значення 1 або 0. Це означає, що операція V для
двійкового семафора може бути виконана, тільки коли його значення рівне 0.
Операцію V для двійкового семафора можна визначити як процедуру
очікування, доки значення семафора стане меншим 1, а потім збільшення
його значення на 1.
Оскільки операції з семафором визначаються в термінах операторів
await, їх формальна семантика випливає безпосередньо із застосування
правила оператора await. Правила виводу для операцій P та V виходять
безпосередньо з правила оператора await, застосованого до конкретних
операторів у визначенні P та V.
13.2. Основні задачі та методи семафорів
Семафори безпосередньо підтримують реалізацію процедури взаємного
виключення, необхідної, наприклад, для вирішення задачі критичної секції.
Крім того, вони забезпечують підтримку простих форм умовної
синхронізації, сигналізуючи про події пов’язані із роботою процесів. Для
вирішення більш складних задач є можливим комбінування описаних вище
двох способів застосування семафорів.
1.Задача критичної секції (взаємне виключення). Нагадаємо, що в задачі
критичної секції кожен з n процесів багаторазово виконує критичну секцію
коду, в якій відбувається доступ до деякого спільного ресурсу, а потім
некритичну секцію коду, в якій кожен процес працює тільки з локальними
об’єктами. Кожному процесу, що знаходиться у своїй критичній секції,
потрібен взаємовиключний доступ до ресурсу.
Семафори дозволяють спростити розв’язок задачі критичної секції. У
лістингу 1.4було представлено рішення, в якому використовуються змінні
для блокування процесу, зокрема змінна lock має значення «істина», коли
жоден процес не знаходиться у своїй критичній секції, і значення «брехня» в
протилежному випадку. Нехай значення «істина» представляється як 1, а
«хиба» – як 0. Тоді процес перед входом в критичну секцію повинен
очікувати, поки значення змінної lock не стане рівним 1, і після того як це
сталося присвоїти їй значення 0. Виходячи з критичної секції, процес
повинен присвоїти змінної lock значення 1.