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


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

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

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

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

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

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

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