Таймеры No-Wake
Начиная с Windows 8.1, драйверы могут использовать таймеры без пробуждения, чтобы избежать ненужного пробуждения процессора из состояния с низким энергопотреблением. Сохраняя процессор в маломощном состоянии, таймер без пробуждения уменьшает энергопотребление и увеличивает время работы планшета или другого мобильного компьютера от заряда батареи.
Срок действия таймера может истечь, только если процессор находится в активном, работающем состоянии. Если срок действия таймера достигается, когда процессор находится в маломощном состоянии, и таймер должен немедленно истечь, таймер должен разбудить процессор. Тем не менее, когда таймер без пробуждения достигает истечения срока действия и процессор находится в маломощном состоянии, этот таймер ожидает истечения срока действия до тех пор, пока процессор не перейдет в режим пробуждения по какой-либо причине, отличной от таймера. В качестве варианта драйвер может указать максимальную допустимость задержки для таймера без пробуждения, чтобы если процессор не пробуждает (по какой-либо другой причине) в пределах максимальной задержки после истечения срока действия таймера, таймер активирует процессор.
Драйвер может использовать таймер без пробуждения для запуска некритических операций, которые необходимо выполнять только в том случае, если процессор находится в активном состоянии. Например, драйвер может использовать таймер без пробуждения для периодической очистки накопленных сведений о состоянии из буфера памяти в файл. Эти сведения о состоянии описывают работу по обработке, которую драйвер выполняет только в том случае, если процессор активен. Если процессор находится в маломощном состоянии, сведения о состоянии не создаются, и нет необходимости в пробуждении процессора.
Чтобы создать таймер без пробуждения, драйвер WDM вызывает подпрограмму ExAllocateTimer . В этом вызове драйвер задает бит флага EX_TIMER_NO_WAKE в параметре Attributes .
Чтобы установить срок действия таймера без пробуждения в определенное время, драйвер вызывает подпрограмму 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. Эта подпрограмма позволяет драйверу указать допустимое значение в течение срока действия таймера. Часто операционная система может использовать эти сведения для объединения двух или более прерываний таймера в одно прерывание. Если время окончания срока действия нескольких таймеров достаточно близко друг к другу, что их окна допуска перекрываются, одно прерывание таймера в области перекрытия может удовлетворить требования по времени всех этих таймеров.
Главное преимущество объединения таймера заключается в том, что оно увеличивает время, в течение которых процессор может оставаться в состоянии низкой мощности между истечением срока действия таймера. Таким образом, водители используют таймер объединения и таймеры без пробуждения для аналогичных целей.
Однако сцежимые таймеры работают иначе, чем таймеры без пробуждения. В частности, допускаемая задержка, указанная для таймера без пробуждения, применяется только в том случае, если процессор находится в маломощном состоянии, тогда как допуск, заданный для истечения срока действия объединенного таймера, применяется независимо от того, находится ли процессор в маломощном состоянии. Для объединенного таймера драйвер может увеличить допустимость в течение срока действия, чтобы снизить вероятность того, что таймер разбудит процессор, но увеличение допустимости приводит к снижению точности таймера, когда процессор активен. Напротив, недопустимая задержка, указанная для таймера без пробуждения, не влияет на точность таймера, когда процессор активен. Для многих драйверов таймеры без пробуждения могут быть лучшим способом снижения энергопотребления.