Page 115 - 4868
P. 115

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

               високий  пріоритет  виконання,  оскільки  значення  логічного  годинника  має
               бути достатньо точним.
                     Для  представлення  значення  логічного  годинника  використовується
               цілочисельна змінна tod (time of day). Спочатку її значення дорівнює нулю і
               задовольняє наступному інваріанту:

                     CLOCK: tod >= 0  tod = tod+1

                     Викликавши  операцію  delay,  процес  «засипає»  на  час,  що  рівний  як
               мінімум  interval  «тіків»  логічного  годинника.  Абсолютна  точність  не
               потрібна, оскільки призупинений процес не може почати роботу до того, як
               високопріоритетний  процес,  що  виконує  операцію  tick,  не  закінчить  своє
               виконання.
                     Процес,  що  викликає  функцію  delay,  спочатку  повинен  обчислити
               бажаний час запуску за допомогою наступного коду:

                     wake_time = tod + interval;
                     Змінна wake_time є локальною по відношенню до тіла функції delay, а

               отже, кожен процес, що викликає функцію delay, обчислює власне значення
               часу  запуску.  Далі  процес  очікує,  поки  процедура  tick  не  буде  викликана
               необхідне  число  раз.  Для  цього  використовується  цикл  while  з  умовою
               виходу wake_time >= tod. У тілі процедури tick відбувається нарощення
               значення змінної tod і запуск призупинених процесів.
                     Залишається реалізувати синхронізацію між призупиненими процесами і
               процесом,  що  викликає  процедуру  tick.  Один  із  методів  полягає  у
               використанні окремої умовної змінної для кожної умови затримки. Оскільки
               призупинені процеси можуть перебувати в режимі очікування різні проміжки
               часу,  то  кожному  з  них  потрібна  власна  умовна  змінна.  Перед  зупинкою
               процес записує у власну змінну час, через який він повинен бути запущений.
               Під  час  виклику  процедури  tick  перевіряються  умовні  змінні  і  при
               необхідності  запуску  процесу  для  його  змінної  генерується  сигнал
               пробудження. Описаний підхід необхідний для вирішення деяких задач, але
               він  є  досить  складний  і  менш  ефективний,  ніж  необхідно  для  реалізації
               монітора Timer.
                     Необхідну         синхронізацію          набагато        простіше        реалізувати,
               використовуючи одну умовну змінну і метод так званої покриваючої умови.
               Логічний вираз, пов’язаний з умовною змінною,  «покриває»  умови запуску
               для  всіх  очікуючих  процесів.  Коли  будь-яка  із  покриваючих  умов
               виконується,  то  запускаються  всі  очікуючі  процеси.  Після  цього,  кожен
               процес  також  перевіряє  власну  умову  і  в  залежності  від  її  задоволення
               поновлює своє виконання або переходить знову в режим очікування.
                     У моніторі Timer необхідне використання тільки однієї умовної змінної

               check,        що      пов’язана        із     покриваючою          умовою         «значення
               змінноїtodзбільшено».  Процеси  очікують  зміни  значення  змінної  check  в
               тілі функції delay. Під час кожного виклику процедури tick запускаються
               всі очікуючі процеси. Описаний алгоритм роботи монітора Timer показаний
   110   111   112   113   114   115   116   117   118   119   120