Comment Linux distingue-t-il les threads des processus enfants?

Réponses:

28

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.

Stephen Kitt
la source
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
  1. 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».

  2. 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.
ivanivan
la source
1

Considérons un processus avec PID p1

L' task_structobjet d'un processus enfant aura PPID (PID parent) en tant que p1, et ses PID et TGID définis sur, disons, p2.

L' task_structobjet d'un thread de p1 aura PID défini comme, disons p3, mais TGID défini sur p1.

NOLFXceptMe
la source
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?
Scott
PID et TGID sont toujours les mêmes.
Tim