Page 98 - 4868
P. 98

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

               візьмуть  свої  ліві  виделки,  то  вони  назавжди  залишаться  в  очікуванні
               можливості взяти праву виделку.
                     Необхідна умова взаємного блокування полягає у круговому очікуванні,
               тобто  коли  один  процес  чекає  на  ресурс,  зайнятий  другим  процесом,  який
               чекає на ресурс, зайнятий третім, і так далі до деякого процесу, що очікує на
               ресурс, зайнятий перший процесом. Таким чином, щоб уникнути взаємного
               блокування,  досить  забезпечити  неможливість  виникнення  кругового
               очікування.  Для  цього  можна  змусити  один  з  процесів,  скажімо,
               Philosopher[4], спочатку взяти праву виделку. Це рішення представлено у
               лістингу 1.21. Можливий також варіант рішення, в якому філософи з парним
               номером беруть виделки в одному порядку, а з непарним – в іншому.


                     Лістинг  1.21  –  Рішення  задачі  про  філософів,  що  обідають  з
               використанням семафорів
                     sem fork[5] = (1, 1, 1, 1, 1);
                     process Philosopher[i = 0 to 3] {
                       while (true) {
                         P(fork[i]);
                         P(fork[i+1]);
                         # взяти ліву виделку, потім праву і поїсти;
                         V(fork[i]);
                         V(fork[i+1]);
                         поміркувати;
                       }
                     }
                     process Philosopher[4] {
                       while (true) {
                         P(fork[0]);
                         P(fork[4]);
                         # взяти праву виделку, потім ліву і поїсти;
                         V(fork[0]);
                         V(fork[4]);
                         поміркувати;
                       }
                     }


                     14.2. Задача про читачів та письменників
                     Задача  про  читачів  та  письменників  –  це  ще  одна  класична  задача
               синхронізації.  Як  і  задачу  про  філософів,  що  обідають,  її  часто
               використовують для порівняння механізмів синхронізації. Вона також досить
               важлива для практичного застосування.
                     Завдання про читачів та письменників звучить наступним чином:з базою
               даних працює два типи процесів – читачі та письменники. Читачі виконують
               транзакції,  що  переглядають  записи  бази  даних,  а  транзакції  письменників
               одночасно  переглядають  і  змінюють  записи.  Передбачається,  що  спочатку
   93   94   95   96   97   98   99   100   101   102   103