Бөлісу құралы:


Таймеры высокого разрешения

Начиная с Windows 8.1 драйверы могут использовать подпрограммы Таймера ExXxx для управления таймерами высокого разрешения. Точность таймера высокого разрешения ограничена только максимальным разрешением системных часов. В отличие от этого, таймеры, ограниченные разрешением системных часов по умолчанию, значительно менее точны.

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

Чтобы создать таймер высокого разрешения, драйвер WDM вызывает подпрограмму ExAllocateTimer и задает флаг EX_TIMER_HIGH_RESOLUTION в параметре "Атрибуты ". Когда драйвер вызывает подпрограмму ExSetTimer для установки таймера высокого разрешения, операционная система увеличивает разрешение системных часов по мере необходимости, чтобы время истечения срока действия таймера соответствовало номинальному времени истечения срока действия, указанному в параметрах DueTime и Period .

Драйвер Kernel-Mode Driver Framework (KMDF) может вызвать метод WdfTimerCreate для создания таймера высокого разрешения. В этом вызове драйвер передает указатель на WDF_TIMER_CONFIG структуру в качестве параметра. Чтобы создать таймер высокого разрешения, драйвер задает член UseHighResolutionTimer этой структуры значение TRUE. Этот член является частью структуры, начиная с Windows 8.1 и KMDF версии 1.13.

Управление точностью таймера

Например, для Windows, работающего на процессоре x86, интервал по умолчанию между тиками системных часов обычно составляет около 15 миллисекунд, а минимальный интервал между тиками системных часов составляет около 1 миллисекунда. Таким образом, время истечения срока действия таймера разрешения по умолчанию (которое ExAllocateTimer создает, если флаг EX_TIMER_HIGH_RESOLUTION не задан) можно контролировать только в пределах около 15 миллисекундах, но время истечения срока действия таймера высокого разрешения можно контролировать в пределах миллисекунда.

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

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

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

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

Начиная с Windows 8 драйвер может вызвать подпрограмму ExQueryTimerResolution , чтобы получить диапазон разрешений таймера, поддерживаемых системными часами.

Сравнение с ExSetTimerResolution

Драйвер может вызвать подпрограмму ExSetTimerResolution , чтобы изменить интервал времени между последовательными прерываниями системных часов. Например, драйвер может вызвать эту подпрограмму, чтобы изменить системные часы с частоты по умолчанию до максимальной скорости, чтобы повысить точность таймера. Однако использование ExSetTimerResolution имеет несколько недостатков по сравнению с использованием таймеров высокого разрешения, созданных ExAllocateTimer.

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

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

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

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