En regardant la source de strace
j'ai trouvé l'utilisation du drapeau de clone CLONE_IDLETASK
qui est décrit comme suit:
#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Après une analyse plus approfondie, j’ai constaté que, bien que cet indicateur ne soit pas couvert, man clone
il est en fait utilisé par le noyau pendant le processus de démarrage pour créer des processus inactifs (qui doivent tous avoir le PID 0) pour chaque processeur de la machine. c'est-à-dire qu'une machine avec 8 processeurs aura au moins 7 (voir question ci-dessous) de tels processus "en cours d'exécution" (guillemets).
Cela m’amène à poser une ou deux questions sur le fonctionnement réel de ce processus "inactif". Mon hypothèse est qu'il exécute l'opération NOP de manière continue jusqu'à la fin de son délai et que le noyau assigne un processus réel à exécuter ou assigne à nouveau le processus inactif (si la CPU n'est pas utilisée). Pourtant, c'est une supposition complète. Alors:
Par exemple, sur une machine avec 8 CPU, 7 processus inactifs seront-ils créés? (et un processeur sera tenu par le noyau lui-même sans travail utilisateur performant?)
Le processus inactif est-il vraiment juste un flux infini d'opérations NOP? (ou une boucle qui fait la même chose).
Est-ce que l'utilisation du processeur (par exemple
uptime
) est simplement calculée en fonction de combien de temps le processus inactif était sur le processeur et combien de temps il n'était pas là pendant une certaine période?
PS Il est probable que cette question est en grande partie due au fait que je ne comprends pas tout à fait le fonctionnement d’un processeur. c'est-à-dire que je comprends l'assemblage, les délais et les interruptions mais je ne sais pas comment, par exemple, un processeur peut utiliser plus ou moins d'énergie en fonction de ce qu'il est en train d'exécuter. Je serais reconnaissant si quelqu'un peut m'éclairer là-dessus aussi.
la source
Réponses:
La tâche inactive sert à la comptabilisation des processus et à la réduction de la consommation d'énergie. Sous Linux, une tâche inactive est créée pour chaque processeur et verrouillée à ce processeur. chaque fois qu’aucun autre processus n’est exécuté sur cette CPU, la tâche inactive est planifiée. Le temps passé dans les tâches inactives apparaît comme un temps «inactif» dans des outils tels que
top
. (La disponibilité est calculée différemment.)Unix semble avoir toujours eu une boucle d'inactivité (mais pas nécessairement une tâche inactive, voir la réponse de Gilles ), et même en V1, il utilisait une
WAIT
instruction qui arrêtait le processeur jusqu'à ce qu'une interruption se produise (il valait "attendre interrompre"). Certains autres systèmes d'exploitation utilisaient des boucles occupés, notamment DOS, OS / 2 et les premières versions de Windows. Cela fait longtemps que les processeurs utilisent ce type d’instructions d’attente pour réduire leur consommation d’énergie et leur production de chaleur. Vous pouvez voir diverses implémentations de tâches inactives, par exemplearch/x86/kernel/process.c
dans le noyau Linux: celle de base appelle simplementHLT
, qui arrête le processeur jusqu’à ce qu’une interruption se produise (et active le mode d’économie d’énergie C1), les autres implémentations traitent divers bugs ou inefficacités ( par exemple, l’ utilisationMWAIT
au lieu deHLT
sur certains CPU).Tout cela est complètement séparé des états inactifs dans les processus, lorsqu'ils attendent un événement (E / S, etc.).
la source
play_dead()
est un nom mnémonique très sympa pour exécuter HALT. N'y aurait-il pas un risque à envoyer HALT à chaque CPU et par conséquent à bloquer? (c.-à-d. atteindre cette situation, HALT tous les processeurs, serait un bogue correct dans le noyau?)Dans la conception de manuel d'un planificateur de processus, si le planificateur n'a pas de processus à planifier (c'est-à-dire si tous les processus sont bloqués, attend une entrée), il attend une interruption du processeur. L'interruption peut indiquer une entrée provenant d'un périphérique (action de l'utilisateur, paquet réseau, lecture terminée sur un disque, etc.) ou peut être une interruption de la minuterie qui déclenche une minuterie dans un processus.
Le planificateur de Linux n'a pas de code spécial pour un cas rien à faire. Au lieu de cela, il code le cas rien à faire en tant que processus spécial, le processus inactif. Le processus inactif n'est planifié que si aucun autre processus n'est programmable (il a effectivement une priorité infiniment basse). Le processus inactif fait en fait partie du noyau: il s’agit d’un thread de noyau, c’est-à-dire un thread qui exécute le code dans le noyau, plutôt que le code dans un processus. (Plus précisément, il existe un tel thread pour chaque CPU.) Lorsque le processus inactif s'exécute, il effectue l'opération d'attente d'interruption.
Le fonctionnement de l'attente d'interruption dépend des capacités du processeur. Avec la conception de processeur la plus élémentaire, ce n'est qu'une boucle occupée -
Le processeur continue d'exécuter une instruction de branche pour toujours, ce qui n'apporte rien. La plupart des systèmes d'exploitation modernes ne le font que s'ils fonctionnent sur un processeur où rien ne peut être amélioré, et la plupart des processeurs ont quelque chose de mieux. Plutôt que de dépenser de l'énergie à ne rien faire à part chauffer la pièce, idéalement, le processeur devrait être éteint. Ainsi, le noyau exécute un code qui demande au processeur de s’éteindre tout au moins, ou du moins d’éteindre la plus grande partie du processeur. Il doit y avoir au moins une petite partie qui reste allumée, le contrôleur d'interruptions. Lorsqu'un périphérique déclenche une interruption, le contrôleur d'interruption envoie un signal de réveil au processeur principal (ou à une partie de celui-ci).
En pratique, les processeurs modernes tels qu'Intel / AMD et ARM ont de nombreux paramètres de gestion de l'alimentation complexes. Le système d'exploitation peut estimer la durée pendant laquelle le processeur reste en mode veille et choisit différents modes de consommation réduite. Les modes offrent différents compromis entre la consommation d'énergie en mode veille et le temps nécessaire pour entrer en mode veille et en sortir. Sur certains processeurs, le système d'exploitation peut également réduire la fréquence d'horloge du processeur lorsqu'il constate que les processus ne consomment pas beaucoup de temps processeur.
la source
HLT
pourrait éteindre les variantes SL des 386 et 486, avant la sortie du DX4 (l'article de Wikipedia est incorrect).Non, une tâche inactive ne gaspille pas les cycles du processeur. Le planificateur ne sélectionne tout simplement pas de processus inactif à exécuter. Un processus inactif attend qu'un événement se produise pour qu'il puisse continuer. Par exemple, il peut être en attente d'une entrée dans un
read()
appel système.À propos, le noyau n'est pas un processus séparé. Le code du noyau est toujours exécuté dans le contexte d'un processus (enfin, sauf dans le cas particulier d'un thread de noyau), il n'est donc pas correct de dire "et un processeur sera détenu par le noyau lui-même sans exécution de l'espace utilisateur".
la source