Службы управления часами и таймерами
Службы управления часами (clock services) используются для отсчета системного времени, которое необходимо ядру для обеспечения работы интервальных таймеров, реализуемых посредством соответствующих системных вызовов.
Вызов ядра ClockTime() позволяет установить системные часы с идентификатором ID (CLOCK_REALTIME) или получить их значение. После установки значение системного времени увеличивается на некоторое число наносекунд в зависимости от разрешения системных часов. Получить или установить значение этого разрешения можно с помощью вызова ClockPeriod().
Системная страница (system page), которая служит в качестве ОЗУ-резидентной структуры данных, содержит 64-битное поле (nsec), которое отображает количество наносекунд, прошедшее с момента начальной загрузки системы. Поле nsec всегда увеличивается монотонным образом и никогда не зависит от текущего времени, установленного функцией ClockTime() или ClockAdjust().
Функция ClockCycles() возвращает текущее значение автономно работающего 64-битного счетчика циклов.
Во всех случаях поле SYSPAGE_ENTRY(qtime)->cycles_per_sec отображает значение приращения счетчика ClockCycles() в одну секунду.
Функция ClockPeriod() позволяет потоку установить разрешающую способность системного таймера в какое-либо значение, кратное наносекундам.
В табл. 2.21 приведены функции, используемые при работе со временем.
Таблица 2.21. Вызовы микроядра и соответствующие POSIX-выэовы
Вызов микроядра | POSIX-вызов | Описание |
ClockTime() | clock_gettime(), clock_settime() | Получить или установить время и дату (используя 64-битное значение в наносекундах в диапазоне от 1979 до 2554) |
ClockAdjust() | отсутствует | Применить тонкую корректировку времени для синхронизации часов |
ClockCycles() | отсутствует | Прочитать значение 64-битного высокоточного автономного счетчика |
ClockPeriod() | clock_getres() | Получить или установить размер периода часов |
Clockld() | clock_getcpuclockid(), pthread_getcpudockid() | Получить целое значение, переданное функции ClockTime() как clockid_t |
Таймеры
ОС QNX Neutrino обеспечивает полный набор таймеров стандарта POSIX.
Модель таймеров стандарта POSIX имеет весьма широкие возможности. Срок действия таймера может определяться следующими параметрами:
· абсолютной датой;
· относительной датой (например, "n наносекунд от настоящего момента");
· циклическим периодом (например, "каждые n наносекунд").
Так как таймеры являются разновидностью источников событий в ОС, они также используют систему передачи событий. Это дает возможность приложению потребовать, чтобы все события, реализуемые в QNX Neutrino, доставлялись при возникновении таймаута.
В ОС QNX Neutrino используется вызов ядра TimerTimeout(), позволяющий приложению задать список состояний блокировки, при которых должен быть запущен соответствующий таймаут. В результате, когда приложение делает запрос ядру, ядро автоматически включает установленный таймаут в том случае, если приложение может быть блокировано по какому-либо из заданных состояний.
В табл. 2.22 приведены функции, используемые при работе с таймерами.
Таблица 2.22. Вызовы микроядра и соответствующие POSIX-вызовы
Вызов микроядра | POSlX-вызов | Описание |
TimerAlarm() | alarm() | Установить для процесса "будильник" |
TimerCreate() | timer_create() | Создать интервальный таймер |
TimerDestroy() | timer_delete() | Уничтожить интервальный таймер |
TimerGettime() | timer_gettime() | Получить остаток времени в интервальном таймере |
TimerGetoverrun() | timer_getoverrun() | Получить количество переполнений интервального таймера |
TimerSettime() | timer_settime{) | Запустить интервальный таймер |
TimerTimeout() | sleep(), nanosleep(), sigtimed-wait(), pthread_cond_timedwait(), pthread_mutex_trylock(), intr_timed_wait() | Включить таймаут ядра для какого-либо состояния блокировки |
Дата добавления: 2017-01-29; просмотров: 843;