Page 122 - 6571
P. 122
Необхідна умова взаємного блокування полягає у круговому
очікуванні, тобто коли один процес чекає на ресурс, зайнятий
другим процесом, який чекає на ресурс, зайнятий третім, і так
далі до деякого процесу, що очікує на ресурс, зайнятий перший
процесом. Таким чином, щоб уникнути взаємного блокування,
досить забезпечити неможливість виникнення кругового
очікування. Для цього можна змусити один з процесів, скажімо,
Philosopher[4], спочатку взяти праву виделку. Це рішення
представлено у лістингу 21. Можливий також варіант рішення, в
якому філософи з парним номером беруть виделки в одному
порядку, а з непарним – в іншому.
Лістинг 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 Задача про читачів та письменників
Задача про читачів та письменників – це ще одна класична
задача синхронізації. Як і задачу про філософів, що обідають, її
121