Page 98 - 4868
P. 98
Ошибка! Стиль не определен. 96
візьмуть свої ліві виделки, то вони назавжди залишаться в очікуванні
можливості взяти праву виделку.
Необхідна умова взаємного блокування полягає у круговому очікуванні,
тобто коли один процес чекає на ресурс, зайнятий другим процесом, який
чекає на ресурс, зайнятий третім, і так далі до деякого процесу, що очікує на
ресурс, зайнятий перший процесом. Таким чином, щоб уникнути взаємного
блокування, досить забезпечити неможливість виникнення кругового
очікування. Для цього можна змусити один з процесів, скажімо,
Philosopher[4], спочатку взяти праву виделку. Це рішення представлено у
лістингу 1.21. Можливий також варіант рішення, в якому філософи з парним
номером беруть виделки в одному порядку, а з непарним – в іншому.
Лістинг 1.21 – Рішення задачі про філософів, що обідають з
використанням семафорів
sem fork[5] = (1, 1, 1, 1, 1);
process Philosopher[i = 0 to 3] {
while (true) {
P(fork[i]);
P(fork[i+1]);
# взяти ліву виделку, потім праву і поїсти;
V(fork[i]);
V(fork[i+1]);
поміркувати;
}
}
process Philosopher[4] {
while (true) {
P(fork[0]);
P(fork[4]);
# взяти праву виделку, потім ліву і поїсти;
V(fork[0]);
V(fork[4]);
поміркувати;
}
}
14.2. Задача про читачів та письменників
Задача про читачів та письменників – це ще одна класична задача
синхронізації. Як і задачу про філософів, що обідають, її часто
використовують для порівняння механізмів синхронізації. Вона також досить
важлива для практичного застосування.
Завдання про читачів та письменників звучить наступним чином:з базою
даних працює два типи процесів – читачі та письменники. Читачі виконують
транзакції, що переглядають записи бази даних, а транзакції письменників
одночасно переглядають і змінюють записи. Передбачається, що спочатку