Page 130 - 6571
P. 130

Для  виходу  із  неподільних  дій  використовується  код
                  помічений через SIGNAL.


                        if (nw == 0 and dr > 0) {
                          dr = dr-1;
                          V(r);
                          # відновити процес-читач, або
                        } else if (nr == 0 and nw == 0 and dw > 0) {
                          dw = dw-1;
                          V(w);
                          # відновити процес-письменник, або
                        } else {

                          V(e);
                          # звільнити блокування входу
                        }

                        Роль  коду  SIGNAL  полягає  у  сигналізації  тільки  одному  із
                  трьох  семафорів.  Це  означає,  що  якщо  немає  активних
                  письменників,  але  є  призупинений  читач,  то  він  може  бути

                  продовжений за допомогою операції V(r). Якщо немає активних
                  читачів або письменників, але є призупинений письменник, то він
                  може бути продовжений за допомогою операції V(w). В іншому

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

                        Три семафори в лістингу 24 утворюють спільний двійковий
                  семафор,  оскільки  в  будь-який  момент  часу  тільки  один  з  них
                  може  мати  значення  1,  а  всі  виконувані  гілки  починаються

                  операціями P і закінчуються операціями V. Отже, оператори між
                  кожною  парою  P  та  V  виконуються  із  взаємним  виключенням.
                  Інваріант  синхронізації  RW  є  істинним  на  початку  роботи

                  програми і перед кожною операцією V, так що він істинний, якщо
                  один  із  семафорів  має  значення  1.  Крім  того,  при  виконанні
                  захищеного оператора істинним є його умова захисту B, оскільки

                  його  перевірив  або  сам  процес  і  виявив,  що  він  має  значення
                  «істина»,  або  семафор,  який  сигналізував  про  поновлення
                  виконання  призупиненого  процесу  у  випадку  якщо  умова  B

                  «істина».  Приведене  рішення  не  призводить  до  взаємного
                  блокування, оскільки семафор затримки отримує сигнал тільки у
                  випадку, якщо деякий процес знаходиться в стані очікування або

                                                             129
   125   126   127   128   129   130   131   132   133   134   135