Wie unterscheidet Linux Threads von untergeordneten Prozessen?

Antworten:

28

Aus einer task_structPerspektive haben die Threads eines Prozesses den gleichen Thread-Gruppenleiter ( group_leaderintask_struct ), während untergeordnete Prozesse einen anderen Thread-Gruppenleiter haben (jeder einzelne untergeordnete Prozess).

Diese Informationen werden über das /procDateisystem dem Benutzerbereich zugänglich gemacht. Sie können Eltern und Kinder verfolgen, indem Sie auf das ppidFeld in /proc/${pid}/statoder schauen .../status(dies gibt die Eltern-PID). Sie können Threads verfolgen, indem Sie sich das tgidFeld in .../statusansehen (dies gibt die Thread-Gruppen-ID an, die auch die PID des Gruppenleiters ist). Die Threads eines Prozesses werden im /proc/${pid}/taskVerzeichnis sichtbar gemacht : Jeder Thread erhält ein eigenes Unterverzeichnis. (Jeder Prozess hat mindestens einen Thread.)

In der Praxis stützen sich Programme, die den Überblick über ihre eigenen Threads behalten möchten, auf APIs, die von der verwendeten Threading-Bibliothek bereitgestellt werden, anstatt betriebssystemspezifische Informationen zu verwenden. In der Regel auf Unix-ähnlichen Systemen bedeutet dies die Verwendung von pthreads.

Stephen Kitt
quelle
Jeder Prozess in einer Shell-Pipeline (echo foo | cat) hat denselben Gruppenleiter (die Shell), sie sind jedoch keine Threads im selben Prozess.
Psusi
2
Sie sprechen von Prozessgruppen. In meiner Antwort ist Gruppenleiter aus der Kernel-Perspektive. In der Buchhaltung des Kernels sind separate Prozesse ihre eigenen Gruppenleiter. Sie können dies sehen, indem Sie (sleep 120 | sleep 120) &die TgidWerte in den einzelnen sleepProzessdateien ausführen und /proc/${pid}/statusüberprüfen.
Stephen Kitt
Oh, komisch. Ich wusste nicht, dass es so etwas wie einen "Threadgruppenführer" gibt, und ich dachte, dass angeblich alle Threads in einem Multithread-Prozess gleich sind und es keinen "Führer" gibt. Jeder von ihnen kann austreten und solange einer übrig bleibt, ist der Prozess nicht tot.
Psusi
5
  1. Dies führt den topBefehl mit einigen zusätzlichen Optionen aus:

    top -H -b -n 1
    
    • Das -HArgument weist top an, jeden einzelnen Thread anzuzeigen. Normalerweise fasst top alle Threads unter ihrem übergeordneten Prozess zusammen.
    • Das -bArgument wird im Batch-Modus als Top-Run ausgeführt - die Informationen werden gesammelt, angezeigt und dann auf stdout ausgegeben, anstatt im interaktiven Modus ausgeführt und die angezeigten Daten aktualisiert zu werden.
    • Mit der -bOption muss der Benutzer angeben, wie oft ausgeführt werden soll. Dies erfolgt mit dem -nArgument und mit einem abschließenden Argument, wie oft ausgeführt werden soll.

    top -H -b -n 1Das System wird daher angewiesen, "top auszuführen, einzelne Threads anzuzeigen, im Batch-Modus auszuführen und nur einmal auszuführen".

  2. Der psBefehl meldet eine Momentaufnahme der aktuell ausgeführten Prozesse.

    ps -eLf
    

    Das -eLfArgument (kann auch verwendet werden -e -L -f) setzt sich wie folgt zusammen:

    • eWeist psan, alle Prozesse anzuzeigen, unabhängig davon, wem sie gehören oder welchen aktuellen Status sie haben - aktiv, schlafend, pausiert, auf E / A wartend usw.
    • Lsagt ps, dass einzelne Threads angezeigt werden sollen
    • Das fweist psan, die Ausgabe als vollständige Liste zu formatieren, und in Verbindung mit dem LArgument werden die Spalten NLWP (Anzahl der Threads) und LWP (Thread-ID) zur Ausgabe hinzugefügt.
ivanivan
quelle
1

Betrachten Sie einen Prozess mit PID p1

Das task_structObjekt eines untergeordneten Prozesses hat die PPID (übergeordnete PID) als p1, und die PID und TGID sind beispielsweise auf p2 festgelegt.

Für das task_structObjekt eines Threads von p1 wird PID auf p3 gesetzt, aber TGID auf p1.

NOLFXceptMe
quelle
Sie sagen also dasselbe wie Stephen Kitt , aber viel weniger deutlich. PS Warum sollten Sie PPID in die Diskussion einbeziehen, wenn Sie nicht sagen wollen, wie die PPID eines Threads lautet?
Scott
PID und TGID sind immer gleich.
Tim