Page 121 - 6571
P. 121

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


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

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

                  }

                  Для рішення задачі потрібно реалізувати операції «взяти ви-
            делки» і «віддати (звільнити) виделки». Виделки є спільним ре-
            сурсом, тому зосередимося на їх захопленні та звільненні.
                  Кожна  виделка  схожа  на  блокування  критичної  секції,

            оскільки в будь-який момент часу володіти нею може тільки один
            філософ. Отже, виделки можна представити масивом семафорів,

            ініціалізованих  значенням  1.  Взяття  виделки  імітується
            операцією P для відповідного семафора, а звільнення – операцією
            V.
                  Дані процеси є ідентичними за своїм змістом, тому природно

            припустити, що вони виконують однакові дії. Наприклад, кожен
            процес може спочатку взяти ліву виделку, а потім праву. Однак
            таке рішення може призвести до взаємного блокування процесів.

            Наприклад, якщо всі філософи візьмуть свої ліві виделки, то вони
            назавжди залишаться в очікуванні можливості взяти праву виделку.



                                                        120
   116   117   118   119   120   121   122   123   124   125   126