No-Wake Таймеры

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

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

Драйвер может использовать таймер без пробуждения для запуска некритических операций, которые должны выполняться только в том случае, если процессор находится в активном состоянии. Например, драйвер может использовать таймер без пробуждения для периодического очистки накопленных сведений о состоянии из буфера памяти в файл. Эта информация о состоянии описывает работу обработки, выполняемую драйвером только в том случае, если процессор активен. Если процессор находится в состоянии низкой мощности, сведения о состоянии не создаются, и не требуется пробуждение процессора.

Чтобы создать таймер без пробуждения, драйвер WDM вызывает подпрограмму ExAllocateTimer . В этом вызове драйвер задает бит флага EX_TIMER_NO_WAKE в параметре "Атрибуты ".

Чтобы установить таймер без пробуждения, который истекает в определенное время, драйвер вызывает подпрограмму ExSetTimer. В этом вызове драйвер может указать, сколько времени таймер без активации должен ждать после истечения установленного времени до пробуждения процессора. Драйвер записывает это допустимое время задержки в член NoWakeTolerance в структуре EXT_SET_PARAMETERS , которую драйвер передает в качестве входного параметра в подпрограмму ExSetTimer . Если драйвер задает члену NoWakeTolerance специальное значение EX_TIMER_UNLIMITED_TOLERANCE, таймер никогда не будет будить процессор и, таким образом, не сможет закончиться до тех пор, пока процессор не проснется по какой-либо другой причине.

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

Сравнение с объединяемыми таймерами

Подпрограмма KeSetCoalescableTimer появилась в Windows 7. Эта подпрограмма позволяет драйверу указать степень допустимого отклонения при истечении времени таймера. Часто операционная система может использовать эту информацию для объединения двух или более прерываний таймера в одно прерывание. Если время истечения срока действия нескольких таймеров достаточно близко друг к другу, что их окна допуска перекрываются, одно прерывание таймера в регионе перекрытия может удовлетворить требования к времени всех этих таймеров.

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

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