Dört iş parçacığı aynı PID'ye sahip olacaktır, ancak yalnızca yukarıdan bakıldığında . Ne sen (bir kullanıcı olarak) bir PID çağrı çekirdek (alttan bakarak) bir PID dediği değil.
In kernel, her iplik iplik PID (muhtemelen bu TID veya iplik kimliğini aramaya daha mantıklı olsa da) ve onlar da bir TGID (iplik grubu kimliğini) sahip bir PID denen o kendi kimliği var bu tüm süreci başlattı.
Basit bir şekilde, yeni bir işlem oluşturulduğunda, hem PID hem de TGID'nin aynı (yeni) sayı olduğu bir iş parçacığı olarak görünür.
Bir iş parçacığı başka başladığında iplik, yani başlatan iplik kendi PID alır (zamanlayıcı bağımsız olarak planı yapsın) ama orijinal iplikle TGID devralır.
Bu şekilde, süreçler (iş parçacığı grubu kimlikleri) size bildirilirken, çekirdek hangi sürece ait olduklarından bağımsız olarak iş parçacıklarını mutlu bir şekilde planlayabilir.
Aşağıdaki iş parçacığı hiyerarşisi yardımcı olabilir (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
Yeni bir işlem başlatmanın (solda) size yeni bir PID ve yeni bir TGID (her ikisi de aynı değere ayarlanmış) verirken, yeni bir iş parçacığı başlatmanın (sağda) aynı kalırken size yeni bir PID verdiğini görebilirsiniz. Onu başlatan iş parçacığı olarak TGID.
(a) Etkileyici grafik becerilerime hayranlıkla titreyin :-)
getpid()
tgid döndürür: www.makelinux.com/asmlinkage long sys_getpid(void) { return current->tgid;}