web-dev-qa-db-fra.com

Différence entre PID et TID

Quelle est la différence entre PID et TID?

La réponse standard serait que PID est pour les processus tandis que TID est pour les threads. Cependant, j'ai vu que certaines commandes les utilisent de manière interchangeable. Par exemple, htop a une colonne pour les PID, dans laquelle les PID pour les threads du même processus sont affichés (avec des valeurs différentes). Alors, quand un PID représente-t-il un thread ou un processus?

57
apoorv020

C'est compliqué: pid est l'identifiant du processus; tid est l'identifiant du thread.

Mais en l'occurrence, le noyau ne fait pas vraiment de distinction entre eux: les threads sont comme des processus mais ils partagent certaines choses (mémoire, fds ...) avec d'autres instances de la même group.

Ainsi, un tid est en fait l'identifiant de l'objet planifiable dans le noyau (thread), tandis que le pid est l'identifiant du groupe d'objets planifiables qui partagent la mémoire et fds (processus).

Mais pour rendre les choses plus intéressantes, quand un processus n'a qu'un seul thread (la situation initiale et dans le bon vieux temps le seul) le pid et le tid sont toujours les même. Donc, toute fonction qui fonctionne avec un tid fonctionnera automatiquement avec un pid.

Il convient de noter que de nombreuses fonctions/appels système/utilitaires de ligne de commande documentés pour fonctionner avec pid utilisent réellement tids. Mais si l'effet est à l'échelle du processus, vous ne remarquerez tout simplement pas la différence.

84
rodrigo

En fait, chaque thread d'un processus Linux est un processus léger (LWP). Donc, les gens peuvent appeler le fil comme un processus ... Mais il y a sûrement une différence. Chaque thread d'un processus a un ID de thread (TID) différent et partage le même ID de processus (PID).

Si vous travaillez avec des fonctions de bibliothèque pthread, ces fonctions n'utilisent pas ces TID car ce sont des ID de threads de niveau noyau/OS.

3
sandeep

Juste pour ajouter à d'autres réponses, selon man gettid:

L'ID de thread retourné par cet appel n'est pas la même chose qu'un ID de thread POSIX (c'est-à-dire la valeur opaque retournée par pthread_self (3)).

Il y a donc deux choses différentes que l'on pourrait dire par TID!

2
wick

pid et tid sont identiques sauf lorsqu'un processus est créé avec un appel à clone avec CLONE_THREAD (selon les pages de manuel de gettid). Dans ce cas, vous obtenez un identifiant de thread unique mais tous les threads appartenant au même groupe de threads partagent le même identifiant de processus.

Cependant, je me souviens également d'avoir lu (bien que je ne trouve pas la source) que les valeurs renvoyées par getpid peuvent être mises en cache.

[MISE À JOUR] Voir la section NOTESici pour une discussion sur les effets de la mise en cache pids.

0
ezpz