Die vier Threads haben dieselbe PID, jedoch nur von oben gesehen. Was Sie (als Benutzer) eine PID nennen, ist nicht das, was der Kernel (von unten gesehen) eine PID nennt.
Im Kernel hat jeder Thread eine eigene ID, die als PID bezeichnet wird (obwohl es möglicherweise sinnvoller wäre, dies als TID oder Thread-ID zu bezeichnen), und sie haben auch eine TGID (Thread-Gruppen-ID), die die PID des Threads ist das hat den ganzen Prozess gestartet.
Wenn ein neuer Prozess erstellt wird, wird er vereinfacht als Thread angezeigt, in dem sowohl die PID als auch die TGID dieselbe (neue) Nummer haben.
Wenn ein Thread einen anderen Thread startet , erhält dieser gestartete Thread eine eigene PID (damit der Scheduler sie unabhängig planen kann), erbt jedoch die TGID vom ursprünglichen Thread.
Auf diese Weise kann der Kernel Threads unabhängig davon planen, zu welchem Prozess sie gehören, während Prozesse (Threadgruppen-IDs) an Sie gemeldet werden.
Die folgende Hierarchie von Threads kann (a) helfen :
USER VIEW
<-- PID 43 --> <----------------- PID 42 ----------------->
+---------+
| process |
_| pid=42 |_
_/ | tgid=42 | \_ (new thread) _
_ (fork) _/ +---------+ \
/ +---------+
+---------+ | process |
| process | | pid=44 |
| pid=43 | | tgid=42 |
| tgid=43 | +---------+
+---------+
<-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->
KERNEL VIEW
Sie können sehen, dass Sie durch Starten eines neuen Prozesses (links) eine neue PID und eine neue TGID (beide auf denselben Wert gesetzt) erhalten, während Sie durch Starten eines neuen Threads (rechts) eine neue PID erhalten, während Sie dieselbe beibehalten TGID als Thread, der es gestartet hat.
(a) Zittern Sie vor Ehrfurcht vor meinen beeindruckenden grafischen Fähigkeiten :-)
getpid()
Ihrer Information , gibt tgid zurück:,asmlinkage long sys_getpid(void) { return current->tgid;}
wie in www.makelinux.com/gettgid(2)
Funktion finden. Und diegetpid()
TID (die "PID" des Threads) wird nicht zurückgegeben, und dagettid(2)
kommt sie ins Spiel . Auf diese Weise kann ich feststellen, ob wir im Haupt-Thread sind oder nicht.Threads werden anhand von PIDs und TGID (Thread Group ID) identifiziert. Sie wissen auch, welcher Thread ein übergeordneter Thread ist, von dem ein Prozess im Wesentlichen seine PID mit allen von ihm gestarteten Threads teilt. Thread-IDs werden normalerweise von der Thread-Bibliothek selbst verwaltet (z. B. pthread usw.). Wenn die 4 Threads gestartet werden, sollten sie dieselbe PID haben. Der Kernel selbst übernimmt die Thread-Planung und dergleichen, aber die Bibliothek ist diejenige, die die Threads verwaltet (ob sie ausgeführt werden können oder nicht, abhängig von Ihrer Verwendung der Thread-Join- und Wartemethoden).
Hinweis: Dies ist aus meiner Erinnerung an Kernel 2.6.36. Meine Arbeit in aktuellen Kernelversionen befindet sich in der E / A-Ebene, daher weiß ich nicht, ob sich dies seitdem geändert hat.
quelle
Linux bietet dem
fork()
Systemaufruf die traditionelle Funktionalität, einen Prozess zu duplizieren. Linux bietet auch die Möglichkeit, Threads mithilfe desclone()
Systemaufrufs zu erstellen. Linux unterscheidet jedoch nicht zwischen Prozessen und Threads.quelle