La tâche inactive (aussi appelée tâche d'échange) est choisie pour s'exécuter lorsqu'il n'y a plus de tâches exécutables dans la file d'attente au moment de la planification des tâches. Mais quel est l'usage de cette tâche si particulière ? Une autre question est de savoir pourquoi je ne peux pas trouver ce thread/processus dans la sortie "ps aux" (PID=0) de l'userland ?
Réponses
Trop de publicités?La raison est historique et programmatique. La tâche inactive est la tâche qui s'exécute, si aucune autre tâche n'est exécutable, comme vous l'avez dit. Elle a la priorité la plus basse possible, c'est pourquoi elle s'exécute si aucune autre tâche n'est exécutable.
Raison programmatique : Cela simplifie beaucoup la programmation des processus, parce que vous n'avez pas à vous soucier du cas particulier : "Que se passe-t-il si aucune tâche n'est exécutable ?", car il y a toujours au moins une tâche exécutable, la tâche inactive. Vous pouvez également compter le temps processeur utilisé par tâche. Sans la tâche inactive, quelle tâche reçoit le temps processeur dont personne n'a besoin ?
Raison historique : avant que nous ayons des processeurs capables de réduire leur puissance ou de passer en mode d'économie d'énergie, ils devaient fonctionner à plein régime à tout moment. Il exécutait une série d'instructions NOP, si aucune tâche n'était exécutable. Aujourd'hui, la programmation de la tâche inactive réduit généralement le processeur en utilisant des instructions HLT (arrêt), ce qui permet d'économiser de l'énergie. Il y a donc une fonctionnalité dans la tâche inactive de nos jours.
Dans Windows, vous pouvez voir la tâche inactive dans la liste des processus, c'est le processus inactif.
Le noyau linux maintient une liste d'attente des processus qui sont "bloqués" sur les E/S/mutex etc. S'il n'y a pas de processus exécutable, le processus inactif est placé dans la file d'attente d'exécution jusqu'à ce qu'il soit préempté par une tâche sortant de la file d'attente.
La raison pour laquelle il y a une tâche est que vous pouvez mesurer (approximativement) combien de temps le noyau perd à cause des blocs sur IO / verrous, etc. De plus, cela rend le code plus facile pour le noyau car la tâche inactive est la même que toutes les tâches qu'il doit changer de contexte, au lieu d'une tâche inactive "spéciale" qui pourrait rendre plus difficile le changement de comportement du noyau.
Il y a en fait une tâche inactive par processeur, mais elle ne se trouve pas dans la liste des tâches principales, mais dans la structure runqueue "struct rq" du processeur, en tant que struct task_struct * .
Il est activé par le planificateur lorsqu'il n'y a rien de mieux à faire (sur ce processeur) et exécute un code spécifique à l'architecture pour mettre le processeur en veille dans un état de faible consommation.