minuteurs No-Wake
À compter de Windows 8.1, les pilotes peuvent utiliser des minuteurs sans veille pour éviter de réveiller inutilement un processeur d’un état de faible consommation. En gardant le processeur à faible consommation d’énergie, un minuteur sans veille réduit la consommation d’énergie et prolonge la durée pendant laquelle une tablette ou un autre ordinateur mobile peut fonctionner sur une charge de batterie.
Un minuteur peut expirer uniquement lorsque le processeur est dans un état actif et en cours d’exécution. Si un minuteur atteint son heure d’expiration lorsque le processeur est à faible consommation d’énergie et que le minuteur doit expirer immédiatement, le minuteur doit réveiller le processeur. Toutefois, lorsqu’un minuteur sans veille atteint son heure d’expiration et que le processeur est dans un état de faible consommation, ce minuteur attend d’expirer jusqu’à ce que le processeur se réveille pour une raison autre que le minuteur. En option, un pilote peut spécifier une tolérance de délai maximale pour un minuteur sans veille afin que si le processeur ne se réveille pas (pour une autre raison) dans la tolérance de délai maximale après l’heure d’expiration du minuteur, le minuteur réveille le processeur.
Un pilote peut utiliser un minuteur sans éveil pour lancer des opérations non critiques qui ne doivent être effectuées que lorsque le processeur est actif. Par exemple, un pilote peut utiliser un minuteur sans éveil pour vider régulièrement les informations status accumulées d’une mémoire tampon vers un fichier. Cette status informations décrit le travail de traitement que le pilote effectue uniquement lorsque le processeur est actif. Lorsque le processeur est à faible consommation d’énergie, aucune information status n’est générée et il n’est pas nécessaire de le réveiller.
Pour créer un minuteur sans éveil, un pilote WDM appelle la routine ExAllocateTimer . Dans cet appel, le pilote définit le EX_TIMER_NO_WAKE bit d’indicateur dans le paramètre Attributes .
Pour définir l’expiration d’un minuteur sans éveil à un moment donné, le pilote appelle la routine ExSetTimer . Dans cet appel, le pilote peut spécifier la durée pendant laquelle le minuteur sans veille doit attendre une fois qu’il a atteint son heure d’expiration avant que le minuteur ne réveille le processeur. Le pilote écrit ce délai tolérable dans le membre NoWakeTolerance dans la structure EXT_SET_PARAMETERS que le pilote transmet comme paramètre d’entrée à la routine ExSetTimer . Si le pilote définit le membre NoWakeTolerance sur la valeur spéciale EX_TIMER_UNLIMITED_TOLERANCE, le minuteur ne réveille jamais le processeur et, par conséquent, ne peut pas expirer tant que le processeur ne se réveille pas pour une autre raison.
Un pilote KMDF (Kernel-Mode Driver Framework) ou User-Mode Driver Framework (UMDF) peut appeler la méthode WdfTimerCreate pour créer un minuteur sans veille. Dans cet appel, le pilote passe un pointeur vers une structure WDF_TIMER_CONFIG en tant que paramètre. Pour créer un minuteur sans éveil qui ne réveille jamais le processeur, le pilote définit le membre TolerableDelay de cette structure sur la constante TolerableDelayUnlimited . Cette constante est prise en charge à partir de Windows 8.1 et KMDF version 1.13 ou UMDF 2.0.
Comparaison avec les minuteurs coalescables
La routine KeSetCoalescableTimer a été introduite dans Windows 7. Cette routine permet à un pilote de spécifier la tolérance à autoriser dans le temps d’expiration d’un minuteur. Souvent, le système d’exploitation peut utiliser ces informations pour fusionner deux ou plusieurs interruptions de minuteur en une seule interruption. Si les heures d’expiration de plusieurs minuteurs sont suffisamment proches les unes des autres pour que leurs fenêtres de tolérance se chevauchent, une seule interruption du minuteur dans la région de chevauchement peut répondre aux exigences de minutage de tous ces minuteurs.
Le principal avantage de la fusion du minuteur est qu’elle prolonge la durée pendant laquelle le processeur peut rester dans un état de faible puissance entre les expirations du minuteur. Ainsi, les conducteurs utilisent des minuteurs à coalescing et des minuteurs sans réveil à des fins similaires.
Toutefois, les minuteurs à coalesceables se comportent différemment des minuteurs sans veille. En particulier, le délai tolérable spécifié pour un minuteur sans veille s’applique uniquement lorsque le processeur est dans un état de faible puissance, tandis que la tolérance spécifiée pour l’expiration d’un minuteur pouvant être fusionné s’applique que le processeur soit ou non dans un état de faible puissance. Pour un minuteur à fusion, un pilote peut augmenter la tolérance dans le temps d’expiration afin de réduire la probabilité que le minuteur réveille le processeur, mais l’augmentation de la tolérance a pour effet secondaire de diminuer la précision du minuteur lorsque le processeur est actif. En revanche, le délai tolérable spécifié pour un minuteur sans veille n’affecte pas la précision du minuteur lorsque le processeur est actif. Pour de nombreux conducteurs, les minuteurs sans veille peuvent être un meilleur moyen de réduire la consommation d’énergie.