Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
456.19 Кб
Скачать

40. Механізм стеження за часом. Годинники та таймери.

В QNX исчисление времени основывается на системном таймере, поддерживаемом операционной системой. Таймер содержит текущее значение Всемироного времени относительно 0 часов, 0 минут, 0 секунд 1 января 1970 года. Командные файлы и процессы могуть делать паузы выполнения на определенное время (засыпать). Для этого используется команда sleep(),nanosleep(). В этом случае ядро переводит поток в состояние блокировки и включает счетчик. В обработчике прерываний таймера значение счетчика сравнивается с текущим значением времени, и если заданный интервал задержки достигнут – ядро переводит процесс в состояние READY. Если несколько потоков запрашивают задержку, то соответствующие им счетчики упорядочиваются так, чтобы во главе был счетчик с наименьшим временем задержки, тогда ядро сравнивает с текущим временем только 1 значение – наименьшее. Значение счетчика = тек. Время вызова sleep() + задержка, укзанная как аргумент функции. Значения счетчиков упорядочиваются по абсолютным значениям. В QNX существует возможность подстройки аппаратного делителя для улучшения разрешающей способности отсчетов времени.

Вид ы таймеров: относительные (задаются относительно заданного времени), абсолютные (задаются относительно текущего момента времени), периодические (вызываемые несколько раз), однократные (срабатывающие один раз).

Для работы с таймером необходимо: создать объект типа таймер и создать структуру уведомления, выбрать нужный тип таймера, запустить таймер.

По истечении времени таймера происходит тайм-аут. Существуют различные схемы уведомления о тайм-ауте: с помощью импульса, сигнала, с помощью создания нового потока.

41. Механізм стеження за часом. Схеми повідомлення про «тайм-аут».

При использовании таймера задержки уведомление о тайм-ауте происходит посредством возвращения в состояние READY. При использовании периодических и однократных таймеров появляется выбор: послать импульс, послать сигнал, создать поток. Независимо от выбранной схемы уведомления, необходимо заполнить структуру struct sigevent. Тип уведомления задается в первом параметре этой структуры и может иметь одно из следующих значений: SIGEV_PULSE – будет передан импульс, SIGEV_SIGNAL, SIGEV_SIGNAL_CODE, IGEV_SIGNAL_THREAD – будет передан сигнал, SIGEV_UNBLOCK – предназначен для тайм-аутов ядра, SIGEV_INTR – предназначен для прерываний, SIGEV_THREAD – будет создан поток.

При уведомлении при помощи импульса необходимо обеспечить дополнительную информацию: идентификатор соединения, по каналу которогу будет передан импульс; данные импульса – 32-разрядное значение, 8-разрядный код, приоритет доставки импульса.

При уведомлении при помощи сигнала нужно заполнить ряд дополнительных полей: номер сигнала для передачи, 8-разрядный код сигнала.

При уведомлении при помощи создания потока необходимо заполнить такие поля: адрес функции, которая будет вызвана при возникновении события; значение, которое будет передано функции в качестве параметра; атрибутная запись потока.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]