Das Programm pstree und htop zeigt Threads mit eindeutigen PIDS. Wie ist das möglich?

7

Ich habe das Programm pstree -p 31872 ausgeführt, das die folgende Ausgabe gedruckt hat:

 ruby(31872)─┬─{ruby}(31906)         
             └─{ruby}(32372)

Die Manpage für pstree sagt:

Untergeordnete Threads eines Prozesses befinden sich unter dem übergeordneten Prozess und werden mit dem Prozessnamen in geschweiften Klammern angezeigt, z

       icecast2---13*[{icecast2}]

(Das Obige wird aufgrund der fehlenden Option -p, die die Komprimierung deaktiviert, anders angezeigt.)

Wenn Sie pstree 31872 ohne -p ausführen, erhalten Sie:

ruby───2*[{ruby}] 

Wenn ich versuche, diese PIDS mit ps zu beobachten , werden keine Ergebnisse gefunden. Die Pids existieren jedoch in / proc.

Meine Frage ist, warum Threads unterschiedliche Pids haben sollten. Ich würde erwarten, dass sie mit dem Prozess identisch sind (31872). Das gleiche Verhalten wird beim Ausführen von htop beobachtet.

Stantona
quelle

Antworten:

8

Der Fehler bestand darin, anzunehmen, dass diese Zahlen PIDS waren, obwohl es sich tatsächlich um TIDS (Thread-IDs) handelt. Siehe Linux-Funktion gettid (2). Das Lesen von Klon (2) liefert viele zusätzliche (und interessante) Details.

Stantona
quelle
1

Threads sind oft unterschiedliche Prozesse. Zumindest unter Linux ist ein "Thread" oft ein Klon des Prozesses, der zufällig etwas Speicher mit dem übergeordneten Prozess teilt.

In einigen Sprachen bleiben Threads jedoch Teil des Hauptprozesses, da es sich um "grüne" Threads handelt, die in der Sprach-VM simuliert werden. Java und Python sind dafür bekannt.

Hack Saw
quelle
1
Threads gehören zu Prozessen und teilen sich den Speicherplatz des Prozesses. Sie sind definitiv kein separater Prozess von dem Prozess, der sie erstellt hat. Wenn Sie sagen, "ein Thread ist oft ein Klon eines Prozesses", denken Sie möglicherweise an den Fork-Systemaufruf, der einen untergeordneten Prozess und keinen Thread erstellt.
Stantona
1
Nein. Wenn Sie unter Linux etwas erstellen möchten, das separat vom Hauptthread geplant werden kann, können Sie entweder einen neuen Thread oder einen Fork deklarieren. In beiden Fällen ist das erste, was passiert, ein Klon, der den Prozess dupliziert, ohne einen neuen Speicherbereich dafür zu erstellen. Wenn es gegabelt wird, ist das nächste, was passiert, die Zuweisung eines getrennten Prozessspeicherplatzes. Siehe den Linux-Funktionsklon (2)
Hack Saw
Ich denke, Sie haben irgendwie näher auf das eingegangen, was ich gesagt habe, nein?
Stantona
1
Kurz gesagt, der einzige Unterschied zwischen echten Threads und Prozessen unter Linux besteht darin, dass ein Thread den Speicher mit einem anderen Prozess teilt und ein Prozess nicht. Was das Proc-Verzeichnis und die dahinter stehende Maschinerie und vor allem den Scheduler betrifft, ist dies nur ein weiterer Prozess.
Hack Saw