Page 102 - 4868
P. 102

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

                       while (true) {
                         ...
                         < await (nr == 0 and nw == 0) nw = nw+1; >
                         записати в базу даних;
                         <nw = nw-1; >
                       }
                     }

                     3.Рішення  задачі  про  читачів  та  письменниківчерезметод  передачі
               естафети.  Іноді  оператори  await  можна  реалізувати  шляхом  прямого

               використання семафорів або інших елементарних операцій, але в загальному
               випадку  це  неможливо.  Розглянемо  дві  умови  захисту  операторів  await  в
               лістингу 1.23. Дані умови перекриваються: умова захисту в протоколі входу
               письменника  вимагає,  щоб  змінні  nw  та  nr  дорівнювали  0,  а  в  протоколі
               входу читача – тільки щоб змінна nw дорівнювала 0. Жоден семафор не може
               розрізнити дані умови, тому для реалізації таких операторів await, потрібен
               спільний метод, що називається передачею естафети.
                     У  лістингу  1.23  присутні  чотири  неподільних  оператора.  Перші  два  (в
               процесах читача і письменника) мають вигляд:

                     <await (В) S; >

                     Оператор  B  визначає  логічний  вираз,  a  S  –  список  операторів,  що
               повинні бути виконані в одній неподільній дії, якщоB має значення «істина».
               Останні два неподільні оператори в обох процесах мають наступний вигляд:
                     < S; >

                     За допомогою першої форми може бути представлена будь-яка умовна
               синхронізація,  а  друга  форма  є  її  скороченням  для  часткового  випадку,  в
               якому значення умови B є незмінним та рівним «істина».
                     Для  реалізації  операторів  await  з  лістингу  1.23  можна  скористатися
               описаними раніше спільними двійковими семафорами. Нехай e – двійковий
               семафор  з  початковим  значенням  1,  який  використовується  для  керування
               входом (entry) у будь-яку неподільну дію.
                     З  кожною  умовою  захисту  B  повинен  бути  зв’язаний  один  семафор  і

               один лічильник з нульовими початковими значеннями. Семафор необхідний
               для  призупинення  процесу  до  моменту,  коли  умова  захисту  стане  рівною
               «істина».  У  лічильнику  в  свою  чергу  зберігається  число  призупинених
               процесів. У  програмі з  лістингу  1.23  визначено дві різні  умови захисту, по
               одній  в  протоколах  входу  письменників  і  читачів,  тому  потрібні  два
               семафора і два лічильника. Нехай r – семафор, пов’язаний з умовою захисту
               в  процесі-читача,  a  відповідно  dr  –  лічильник  призупинених  процесів-
               читачів. Аналогічно нехай з умовою захисту в процесі-письменника пов’язані
               семафор  w  і  лічильник  призупинених  процесів-письменників  dw.  Під  час
               ініціалізації  програми  в  стані  очікування  не  перебуває  жоден  із  процесів
               читачів або письменників, тому значення змінних r, dr, w і dw рівні 0.
                     Використання трьох семафорів (e, r та w) і двох лічильників (dr та dw)
   97   98   99   100   101   102   103   104   105   106   107