La documentation peut être assez déroutante, alors voici le "vrai " Modèle Linux :
- à l'intérieur du noyau Linux, quelque chose qui peut être exécuté (et planifié) s'appelle un "processus",
- chaque processus possède un ID de processus (PID) unique au système et un ID de groupe de threads (TGID),
- un processus "normal" a PID=TGID et aucun autre processus ne partage cette valeur TGID,
- un processus "threadé" est un processus dont la valeur TGID est partagée par d'autres processus,
- plusieurs processus partageant le même TGID partagent également, au moins, le même espace mémoire et les mêmes gestionnaires de signaux (parfois plus),
- si un processus "threadé" a PID=TGID, il peut être appelé "le thread principal",
- appelant le
getpid()
de n'importe quel processus renverra son TGID (="main thread" PID), - appelant le
gettid()
de n'importe quel processus renverra son PID (!), - tout type de processus peut être créé avec le
clone(2)
appel système, - ce qui est partagé entre les processus est décidé en passant des drapeaux spécifiques à
clone(2)
, - les noms numériques des dossiers que vous pouvez répertorier avec
ls /proc
comme/proc/NUMBER
sont des TGID, - noms numériques des dossiers en
/proc/TGID/task
comme/proc/TGID/task/NUMBER
sont des PID, - même si vous ne voyez pas tous les PID existants avec
ls /proc
, vous pouvez toujours fairecd /proc/any_PID
.
Conclusion :du point de vue du noyau, seuls les processus existent, chacun ayant son propre PID unique, et un soi-disant thread est juste un type différent de processus (partageant, au moins, le même espace mémoire et les mêmes gestionnaires de signaux avec un ou plusieurs autres -s).
Remarque : l'implémentation du concept de "thread" sous Linux a conduit à une confusion de vocabulaire, et si getpid()
vous ment ne fait pas ce que vous pensiez, c'est parce que son comportement suit la compatibilité POSIX (les threads sont censés partager un PID commun).
Il n'y a absolument aucune différence entre un thread et un processus sous Linux. Si vous regardez clone(2), vous verrez un ensemble d'indicateurs qui déterminent ce qui est partagé et ce qui ne l'est pas entre les threads.
Les processus classiques ne sont que des threads qui ne partagent rien; vous pouvez partager les composants que vous voulez sous Linux.
Ce n'est pas le cas sur d'autres implémentations de système d'exploitation, où il existe des différences beaucoup plus substantielles.
Les threads sont des processus sous Linux. Ils sont créés avec le clone
appel système, qui renvoie un ID de processus qui peut être envoyé un signal via le kill
appel système, tout comme un processus. Les processus de thread sont visibles en ps
production. Le clone
l'appel reçoit des indicateurs qui déterminent la part de l'environnement du processus parent qui est partagée avec le processus de thread.