Page 97 - 4868
P. 97

95                                                               Ошибка! Стиль не определен.

               щоб  написати  програму,  яка  моделює  поведінку  філософів.  Програма
               повинна уникати ситуації, в якій всі філософи голодні, але жоден із них не
               може  взяти  обидві  вилки  (наприклад,  коли  кожен  із  них  тримає  по  одній
               вилці і не хоче віддавати її іншим).
                     Описана  вище  задача  проілюстрована  на  рис.  1.17.  Зрозуміло,  що  два
               філософа,  які  сидять  поруч  один  з  одним  не  можуть  їсти  одночасно.  Крім
               того, оскільки вилок всього п’ять, то одночасно можуть їсти не більше, ніж
               двоє філософів.


                                                          Філософ
                                                            №1






                                                           Стіл



                                                                   Філософ
                                                                      №3
                                                   Філософ
                                                   №4

                          Рисунок1.17 – Ілюстрація задачі про філософів, що обідають

                     Припустимо, що періоди роздумів і прийомів їжі різні (для їх імітації в
               програмі  можна  використати  генератор  випадкових  чисел).  Реалізуємо
               імітацію поведінки філософів наступним чином:

                     process Philosopher[i = 0 to 4] {
                       while (true) {
                         поміркувати;
                         взяти виделки;
                         поїсти;
                         віддати виделки;
                       }
                     }

                     Для  рішення  задачі  потрібно  реалізувати  операції  «взяти  виделки»  і
               «віддати  (звільнити)  виделки».  Виделки  є  спільним  ресурсом,  тому
               зосередимося на їх захопленні та звільненні.
                     Кожна виделка схожа на блокування критичної секції, оскільки в будь-
               який  момент  часу  володіти  нею  може  тільки  один  філософ.  Отже,  виделки
               можна представити масивом семафорів, ініціалізованих значенням 1. Взяття
               виделки  імітується  операцією  P  для  відповідного  семафора,  а  звільнення  –
               операцією V.
                     Дані  процеси  є  ідентичними  за  своїм  змістом,  тому  природно
               припустити, що вони виконують однакові дії. Наприклад, кожен процес може
               спочатку  взяти  ліву  виделку,  а  потім  праву.  Однак  таке  рішення  може
               призвести до взаємного блокування процесів. Наприклад, якщо всі філософи
   92   93   94   95   96   97   98   99   100   101   102