Поделиться через


Точность таймера

Обычно подпрограмма системного таймера позволяет вызывающему объекту указывать абсолютное или относительное время истечения срока действия таймера. Например, см. раздел KeWaitForSingleObject, KeSetTimer или KeDelayExecutionThread. Точность, с помощью которой операционная система может измерять время истечения срока действия, ограничивается степенью детализации системных часов.

Системное время обновляется на каждом тике системных часов и является точным только до последнего тика. Если вызывающий объект задает абсолютное время истечения, таймер прекращает действие при обработке первого системного такта после заданного времени. Таким образом, таймер может истекть до одного периода системных часов позже указанного абсолютного срока действия. Если указан интервал таймера или относительное время истечения срока действия, срок действия может произойти на период раньше или на период позже указанного времени, в зависимости от того, как именно время начала и окончания этого интервала совпадает с тиками системных часов. Независимо от того, задано ли абсолютное или относительное время, срок действия таймера не может быть обнаружен даже позже, если обработка прерываний для системных часов задерживается путем обработки прерываний для других устройств.

Когда вызывающий указывает относительное время окончания срока действия, подпрограмма таймера добавляет текущее системное время часов к указанному относительному времени окончания срока действия, чтобы вычислить абсолютное время истечения срока действия, используемое для таймера. Так как системное время является точным только до последней галочки системных часов, вычисляемое время истечения срока действия может быть до периода системных часов раньше, чем время истечения срока действия, ожидаемое вызывающим абонентом. Если указанное относительное время истечения срока действия близко или меньше периода системных часов, таймер может истекать немедленно без задержки.

Возможный способ более точного обеспечения более короткого времени истечения срока действия заключается в уменьшении времени между тактами системных часов, что, вероятно, увеличит потребление энергии. Кроме того, уменьшение периода системных часов может не привести к более высокой степени детализации системных часов, если не будет гарантировано, что обработка прерываний для других устройств на платформе не задерживает обработку прерываний системных часов.

Начиная с Windows 8, KeDelayExecutionThread использует более точный метод для вычисления абсолютного времени истечения срока действия из указанного вызывающим относительного времени истечения срока действия. Во-первых, чтобы получить более точную оценку текущего системного времени, рутинная процедура использует счетчик производительности системы для измерения времени, прошедшего с момента последнего такта системных часов. Далее подпрограмма добавляет эту более точную оценку системного времени к относительному времени окончания срока действия, чтобы вычислить абсолютное время окончания срока действия. Абсолютное время истечения срока действия, вычисляемое этим методом, является точным в микросекундах. В результате таймер не истекает до истечения указанного относительного срока действия. Таймер по-прежнему может сработать на период системного такта позже указанного времени, и может сработать даже позже, если обработка прерывания системного такта задерживается из-за обработки прерываний для других устройств.

Если системное время изменяется до истечения срока действия таймера, относительный таймер не затрагивается, но система корректирует каждый абсолютный таймер. Относительный таймер всегда истекает после указанного количества единиц времени, истекшего независимо от абсолютного системного времени. Срок действия абсолютного таймера истекает в определенное системное время, поэтому изменение системного времени изменяет длительность ожидания абсолютного таймера.