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