Cztery wątki będą miały ten sam PID, ale tylko patrząc z góry. To , co ty (jako użytkownik) nazywasz PID, nie jest tym, co jądro (patrząc od dołu) nazywa PID.
W jądrze każdy wątek ma swój własny identyfikator, zwany PID (chociaż prawdopodobnie bardziej sensowne byłoby nazywanie go TID lub ID wątku), a także ma TGID (identyfikator grupy wątków), który jest PID wątku to zapoczątkowało cały proces.
Upraszczając, kiedy tworzony jest nowy proces , pojawia się on jako wątek, w którym zarówno PID, jak i TGID mają ten sam (nowy) numer.
Gdy wątek uruchamia inny wątek, ten rozpoczęty wątek otrzymuje swój własny PID (więc planista może zaplanować go niezależnie), ale dziedziczy TGID z oryginalnego wątku.
W ten sposób jądro może szczęśliwie planować wątki niezależnie od tego, do jakiego procesu należą, podczas gdy procesy (identyfikatory grup wątków) są raportowane do Ciebie.
Pomocna może być następująca hierarchia wątków (a) :
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
Możesz zobaczyć, że rozpoczęcie nowego procesu (po lewej) daje nowy PID i nowy TGID (oba ustawione na tę samą wartość), podczas gdy rozpoczęcie nowego wątku (po prawej) daje nowy PID przy zachowaniu tego samego TGID jako wątek, który go rozpoczął.
(a) Drżyj z podziwu dla moich imponujących umiejętności graficznych :-)
getpid()
zwraca tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
jak pokazano na www.makelinux.com/