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





