Różnica między PID i TID

Jaka jest różnica między PID i TID?

Standardowa odpowiedź brzmiałaby, że PID jest dla procesów, a TID dla wątków. Widziałem jednak, że niektóre polecenia używają ich zamiennie. Na przykład htop ma kolumnę dla PID, w której wyświetlane są PID dla wątków tego samego procesu (z różnymi wartościami). Kiedy PID reprezentuje wątek lub proces?

 48
Author: Mateusz Piotrowski, 2010-12-23

4 answers

To skomplikowane: pid jest identyfikatorem procesu; tid jest identyfikatorem wątku.

Ale tak się składa, że jądro nie robi między nimi prawdziwego rozróżnienia: wątki są jak procesy, ale dzielą pewne rzeczy (pamięć, fds...)z innymi instancjami tej samej grupy .

Tak więc tid jest w rzeczywistości identyfikatorem obiektu schedulable w jądrze (wątku), podczas gdy pid jest identyfikatorem grupy obiektów schedulable które dzielą pamięć i fds (proces).

Ale żeby było ciekawiej, gdy proces ma tylko jeden wątek (sytuacja początkowa i w starych dobrych czasach jedyna), pid i tid są zawsze takie same. Tak więc każda funkcja, która działa z tid będzie działać automatycznie z pid.

Warto zauważyć, że wiele funkcji/wywołań systemowych/narzędzi wiersza poleceń udokumentowanych do pracy z pid faktycznie używa tids. Ale jeśli efekt jest cały proces po prostu nie zauważysz różnicy.

 69
Author: rodrigo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-09 11:43:58

Właściwie każdy wątek w procesie Linuksa jest procesem lekkim (LWP). Tak więc ludzie mogą nazywać wątek jako proces... Ale z pewnością jest różnica. Każdy wątek w procesie ma inny identyfikator wątku (TID) i ten sam identyfikator procesu (PID).

Jeśli pracujesz z funkcjami biblioteki pthread, to funkcje te nie używają tych znaczników, ponieważ są to identyfikatory wątków na poziomie jądra / systemu operacyjnego.

 2
Author: sandeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-21 11:57:54

Aby dodać do innych odpowiedzi, zgodnie z man gettid:

identyfikator wątku zwracany przez to wywołanie nie jest tym samym co identyfikator wątku POSIX(tzn. nieprzezroczysta wartość zwracana przez pthread_self (3)).

Więc są dwie różne rzeczy, które można rozumieć przez TID!

 1
Author: wick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-21 12:02:51

Pid i tid są takie same, chyba że proces jest tworzony z wywołaniem clone z CLONE_THREAD (na stronach podręcznika gettid). W takim przypadku otrzymuje się unikalny identyfikator wątku, ale wszystkie wątki należące do tej samej grupy wątków mają ten sam identyfikator procesu.

Przypominam sobie jednak również czytanie (choć nie mogę znaleźć źródła), że wartości zwracane z getpid mogą być buforowane.

[UPDATE] Zobacz NOTES Sekcja tutaj {[12] } do dyskusji na temat efektów buforowania pids.

 0
Author: ezpz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-23 10:00:57