Page 97 - 4868
P. 97
95 Ошибка! Стиль не определен.
щоб написати програму, яка моделює поведінку філософів. Програма
повинна уникати ситуації, в якій всі філософи голодні, але жоден із них не
може взяти обидві вилки (наприклад, коли кожен із них тримає по одній
вилці і не хоче віддавати її іншим).
Описана вище задача проілюстрована на рис. 1.17. Зрозуміло, що два
філософа, які сидять поруч один з одним не можуть їсти одночасно. Крім
того, оскільки вилок всього п’ять, то одночасно можуть їсти не більше, ніж
двоє філософів.
Філософ
№1
Стіл
Філософ
№3
Філософ
№4
Рисунок1.17 – Ілюстрація задачі про філософів, що обідають
Припустимо, що періоди роздумів і прийомів їжі різні (для їх імітації в
програмі можна використати генератор випадкових чисел). Реалізуємо
імітацію поведінки філософів наступним чином:
process Philosopher[i = 0 to 4] {
while (true) {
поміркувати;
взяти виделки;
поїсти;
віддати виделки;
}
}
Для рішення задачі потрібно реалізувати операції «взяти виделки» і
«віддати (звільнити) виделки». Виделки є спільним ресурсом, тому
зосередимося на їх захопленні та звільненні.
Кожна виделка схожа на блокування критичної секції, оскільки в будь-
який момент часу володіти нею може тільки один філософ. Отже, виделки
можна представити масивом семафорів, ініціалізованих значенням 1. Взяття
виделки імітується операцією P для відповідного семафора, а звільнення –
операцією V.
Дані процеси є ідентичними за своїм змістом, тому природно
припустити, що вони виконують однакові дії. Наприклад, кожен процес може
спочатку взяти ліву виделку, а потім праву. Однак таке рішення може
призвести до взаємного блокування процесів. Наприклад, якщо всі філософи