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


21

Linux ne fait pas réellement la distinction entre les processus et les threads, et implémente les deux en tant que structure de données task_struct.

Alors, qu'est-ce que Linux fournit à certains programmes pour leur permettre de distinguer les threads d'un processus de ses processus enfants? Par exemple, existe-t-il un moyen de voir les détails de tous les threads d'un processus sous Linux?

Merci.

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.


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.

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.