Page 104 - 4868
P. 104

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

                         P(e);
                         nr = nr-1;
                         SIGNAL;
                       }
                     }
                     process Writer[i = 1 to N] {
                       while (true) {
                         # < await (nr == 0 and nw == 0) nw = nw+1; >
                         P(e);
                         if (nr> 0 or nw> 0) {
                           dw = dw+1;
                           V(e);
                           P(w);
                         }
                         nw = nw+1;
                         SIGNAL;
                         записати в базу даних;
                         # <nw = nw-1; >
                         P(e);
                         nw = nw-1;
                         SIGNAL;
                       }
                     }

                     Три семафори в лістингу 1.24 утворюють спільний двійковий семафор,
               оскільки в будь-який момент часу тільки один з них може мати значення 1, а
               всі виконувані гілки починаються операціями P і закінчуються операціями V.
               Отже,  оператори  між  кожною  парою  P  та  V  виконуються  із  взаємним
               виключенням.  Інваріант  синхронізації  RW  є  істинним  на  початку  роботи
               програми  і  перед  кожною  операцією  V,  так  що  він  істинний,  якщо  один  із
               семафорів має значення 1. Крім того,  при виконанні захищеного оператора
               істинним є його умова захисту B, оскільки його перевірив або сам процес і
               виявив,  що  він  має  значення  «істина»,  або  семафор, який  сигналізував  про
               поновлення  виконання  призупиненого  процесу  у  випадку  якщо  умова  B
               «істина».  Приведене  рішення  не  призводить  до  взаємного  блокування,
               оскільки  семафор  затримки  отримує  сигнал  тільки  у  випадку,  якщо  деякий
               процес знаходиться в стані очікування або повинен у нього перейти. Процес
               може  збільшити  лічильник  процесів,  що  перебувають  в  стані  очікування  і
               виконати  операцію  V(e),  але  не  може  виконати  операцію  P  для  семафора
               затримки.
                     Описаний метод програмування називається передачею естафети через
               спосіб вироблення сигналів семафорами. Коли процес виконується всередині
               критичної секції, вважається, що він отримав естафету, яка підтверджує його
               право на виконання. Передача естафети відбувається у випадку, коли процес

               доходить до фрагмента програми SIGNAL. Якщо певний процес очікує стану
               при якому умова B задовольняє значенню «істина», то естафета передається
   99   100   101   102   103   104   105   106   107   108   109