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/