Page 144 - 6571
P. 144
16.2 Реалізація інтервального таймера
Розглянемо нову задачу, що полягає у розробці інтервального
таймера, який дозволяє процесу перейти на деякий час в стан очі-
кування. Така можливість часто надається операційними систе-
мами, щоб дозволити користувачам, наприклад, періодично ви-
конувати службові команди. Розглянемо два рішення, в яких реа-
лізовано два корисні методи. У першому рішенні використані так
звані покриваючі умови, а у другому – оператор wait з пріори-
тетами.
Монітор, який реалізує інтервальний таймер, являє собою ще
один приклад контролера ресурсів. Ресурсом у даному випадку
виступає логічний годинник. При цьому над годинником можли-
во виконувати такі операції як delay(interval), яка призупи-
няє процес на проміжок часу тривалістю interval та tick, що
виконує інкремент значення логічного годинника. Можливі й ін-
ші операції, наприклад, отримання значення часу або призупи-
нення процесу до моменту, поки годинник не досягне певного
значення.
Прикладні процеси викликають операцію delay(interval)
з від’ємним значенням interval, а операцію tick викликає
процес, який періодично запускається апаратним таймером. Да-
ний процес зазвичай має високий пріоритет виконання, оскільки
значення логічного годинника має бути достатньо точним.
Для представлення значення логічного годинника використо-
вується цілочисельна змінна tod (time of day). Спочатку її зна-
чення дорівнює нулю і задовольняє наступному інваріанту:
CLOCK: tod >= 0 Ù tod = tod+1
Викликавши операцію delay, процес «засипає» на час, що
рівний як мінімум interval «тіків» логічного годинника. Абсо-
лютна точність не потрібна, оскільки призупинений процес не
може почати роботу до того, як високопріоритетний процес, що
виконує операцію tick, не закінчить своє виконання.
Процес, що викликає функцію delay, спочатку повинен об-
числити бажаний час запуску за допомогою наступного коду:
wake_time = tod + interval;
143