Du task_structpoint de vue, les threads d'un processus ont le même leader de groupe de threads ( group_leaderintask_struct ), tandis que les processus enfants ont un leader de groupe de threads différent (chaque processus enfant individuel).
Ces informations sont exposées à l'espace utilisateur via le /procsystème de fichiers. Vous pouvez retrouver les parents et les enfants en regardant le ppidchamp dans /proc/${pid}/statou .../status(cela donne le parent pid); vous pouvez suivre les threads en regardant le tgidchamp dans .../status(cela donne l'ID du groupe de threads, qui est également le pid du chef de groupe). Les threads d'un processus sont rendus visibles dans le /proc/${pid}/taskrépertoire: chaque thread a son propre sous-répertoire. (Chaque processus a au moins un thread.)
Dans la pratique, les programmes souhaitant garder une trace de leurs propres threads s'appuieraient sur les API fournies par la bibliothèque de threads qu'ils utilisent, au lieu d'utiliser des informations spécifiques au système d'exploitation. Généralement sur les systèmes de type Unix, cela signifie utiliser pthreads.
Chaque processus dans un pipeline shell (echo foo | cat) partage le même chef de groupe (le shell), mais ils ne sont pas des threads dans le même processus.
psusi
2
Vous parlez de groupes de processus; dans ma réponse, le chef de groupe est du point de vue du noyau. Dans la comptabilité du noyau, les processus séparés sont leur propre chef de groupe. Vous pouvez le voir en exécutant (sleep 120 | sleep 120) &et en regardant les Tgidvaleurs dans sleeple /proc/${pid}/statusfichier de chaque processus .
Stephen Kitt
Oh bizarre. Je ne savais pas qu'il existait un "leader de groupe de threads" et je pensais que tous les threads d'un processus multithread sont supposés égaux et qu'il n'y a pas de "leader". Chacun d'entre eux peut sortir et tant qu'il en reste un, le processus n'est pas mort.
psusi
5
Cela exécute la topcommande avec quelques options supplémentaires:
top -H -b -n 1
L' -Hargument indique à top d'afficher chaque thread individuel. Normalement, top résume tous les threads sous leur processus parent.
L' -bargument permet l'exécution supérieure en mode batch - les informations sont collectées, affichées, puis transférées vers stdout au lieu de s'exécuter en mode interactif et d'actualiser les données affichées.
Avec l' -boption, l'utilisateur doit indiquer au début combien de fois exécuter, cela se fait avec l' -nargument et un argument final avec combien de fois exécuter.
Ordonne donc top -H -b -n 1au système de «exécuter en haut, d'afficher les threads individuels, de s'exécuter en mode batch et de ne s'exécuter qu'une seule fois».
La pscommande signale un instantané des processus en cours d'exécution.
ps -eLf
L' -eLfargument (peut également être utilisé -e -L -f) se décompose comme suit:
eindique psd'afficher tous les processus, quel que soit leur propriétaire ou leur état actuel - actif, en veille, en pause, en attente d'E / S, etc.
Lindique psd'afficher les threads individuels
le findique psde formater la sortie sous forme de liste au format complet et, conjointement avec l' Largument, les colonnes NLWP (nombre de threads) et LWP (ID de thread) sont ajoutées à la sortie.
Vous dites donc la même chose que Stephen Kitt , mais beaucoup moins clairement. PS Pourquoi s'embêter à introduire PPID dans la discussion si vous n'allez pas dire quel est le PPID d'un thread?
(sleep 120 | sleep 120) &
et en regardant lesTgid
valeurs danssleep
le/proc/${pid}/status
fichier de chaque processus .Cela exécute la
top
commande avec quelques options supplémentaires:-H
argument indique à top d'afficher chaque thread individuel. Normalement, top résume tous les threads sous leur processus parent.-b
argument permet l'exécution supérieure en mode batch - les informations sont collectées, affichées, puis transférées vers stdout au lieu de s'exécuter en mode interactif et d'actualiser les données affichées.-b
option, l'utilisateur doit indiquer au début combien de fois exécuter, cela se fait avec l'-n
argument et un argument final avec combien de fois exécuter.Ordonne donc
top -H -b -n 1
au système de «exécuter en haut, d'afficher les threads individuels, de s'exécuter en mode batch et de ne s'exécuter qu'une seule fois».La
ps
commande signale un instantané des processus en cours d'exécution.L'
-eLf
argument (peut également être utilisé-e -L -f
) se décompose comme suit:e
indiqueps
d'afficher tous les processus, quel que soit leur propriétaire ou leur état actuel - actif, en veille, en pause, en attente d'E / S, etc.L
indiqueps
d'afficher les threads individuelsf
indiqueps
de formater la sortie sous forme de liste au format complet et, conjointement avec l'L
argument, les colonnes NLWP (nombre de threads) et LWP (ID de thread) sont ajoutées à la sortie.la source
Considérons un processus avec PID p1
L'
task_struct
objet d'un processus enfant aura PPID (PID parent) en tant que p1, et ses PID et TGID définis sur, disons, p2.L'
task_struct
objet d'un thread de p1 aura PID défini comme, disons p3, mais TGID défini sur p1.la source