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