Page 142 - 6571
P. 142

по відношенню до читачів і письменників. Вона може зберігати-
                  ся, наприклад, в розподіленій пам’яті або в зовнішньому файлі.
                        У задачі про читачів та письменників монітор надає доступ
                  до  бази  даних  для  процесів-читачів  та  процесів-письменників.

                  Для цього необхідно, щоб процеси інформували монітор про своє
                  бажання  отримати  доступ  і  про  завершення  роботи  з  базою  да-
                  них. Існує два типи процесів і по два види дій на процес, тому в

                  результаті  отримуємо  чотири  процедури  монітора:  re-
                  quest_read, release_read, request_write, release_write.
                  Процес-читач перед зчитуванням бази даних повинен викликати
                  процедуру  request_read,  а  після  зчитування  процедуру  re-

                  lease_read. Те ж саме стосується процесу-письменника.
                        Для синхронізації доступу до бази даних необхідно вести об-

                  лік числа записуючих і зчитуючих процесів. Як і раніше, нехай
                  значення змінної nr – це число читачів, a nw – письменників. Во-
                  ни являють собою постійні змінні монітора і при правильній син-

                  хронізації повинні задовольняти наступному інваріанту монітора:

                        RW: (nr == 0 Únw == 0) Ù nw <= 1

                        У початковому стані змінні nr та nw рівні 0. Їхні значення
                  збільшуються  при виклику процедур запиту і зменшуються при
                  виклику процедур вивільнення.

                        У лістингу 27 представлений монітор, що відповідає описаній
                  вище  специфікації.  Для  реалізації  інваріанта  RW  використову-
                  ються  цикли  while  та  оператори  wait.  На  початку  виконання
                  процедури request_read процес-читач повинен призупинитися,

                  поки значення nw не стане рівним нулю. Дана затримка відбува-
                  ється  на  умовній  змінній  oktoread.  Аналогічно,  процес-
                  письменник  на  початку  виконання  процедури  request_write

                  повинен призупинитися на умовній змінній oktowrite до обну-
                  лення змінних nr та nw. У процедурі release_read для процесу-

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

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

                  знову призупинити своє виконання. З іншого боку, в кінці проце-


                                                             141
   137   138   139   140   141   142   143   144   145   146   147