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.
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
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".
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.
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.
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?
(sleep 120 | sleep 120) &
dieTgid
Werte in den einzelnensleep
Prozessdateien ausführen und/proc/${pid}/status
überprüfen.Dies führt den
top
Befehl mit einigen zusätzlichen Optionen aus:-H
Argument weist top an, jeden einzelnen Thread anzuzeigen. Normalerweise fasst top alle Threads unter ihrem übergeordneten Prozess zusammen.-b
Argument 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.-b
Option muss der Benutzer angeben, wie oft ausgeführt werden soll. Dies erfolgt mit dem-n
Argument und mit einem abschließenden Argument, wie oft ausgeführt werden soll.top -H -b -n 1
Das System wird daher angewiesen, "top auszuführen, einzelne Threads anzuzeigen, im Batch-Modus auszuführen und nur einmal auszuführen".Der
ps
Befehl meldet eine Momentaufnahme der aktuell ausgeführten Prozesse.Das
-eLf
Argument (kann auch verwendet werden-e -L -f
) setzt sich wie folgt zusammen:e
Weistps
an, alle Prozesse anzuzeigen, unabhängig davon, wem sie gehören oder welchen aktuellen Status sie haben - aktiv, schlafend, pausiert, auf E / A wartend usw.L
sagtps
, dass einzelne Threads angezeigt werden sollenf
weistps
an, die Ausgabe als vollständige Liste zu formatieren, und in Verbindung mit demL
Argument werden die Spalten NLWP (Anzahl der Threads) und LWP (Thread-ID) zur Ausgabe hinzugefügt.quelle
Betrachten Sie einen Prozess mit PID p1
Das
task_struct
Objekt eines untergeordneten Prozesses hat die PPID (übergeordnete PID) als p1, und die PID und TGID sind beispielsweise auf p2 festgelegt.Für das
task_struct
Objekt eines Threads von p1 wird PID auf p3 gesetzt, aber TGID auf p1.quelle