Les threads du noyau Linux sont-ils vraiment des processus du noyau?
19
J'ai lu à de nombreux endroits que Linux crée un thread de noyau pour chaque thread utilisateur dans une machine virtuelle Java. (Je vois le terme "fil du noyau" utilisé de deux manières différentes:
un fil créé pour faire le travail de base du système d'exploitation et
un thread que le système d'exploitation connaît et planifie pour effectuer le travail de l'utilisateur.
Je parle de ce dernier type.)
Un thread de noyau est-il identique à un processus de noyau, car les processus Linux prennent en charge les espaces de mémoire partagée entre le parent et l'enfant, ou s'agit-il vraiment d'une entité différente?
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 fils qui ne partagent rien; vous pouvez partager quels composants 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 importantes.
La documentation peut être assez déroutante, voici donc le " vrai " modèle Linux:
à l'intérieur du noyau Linux, quelque chose qui peut être exécuté (et planifié) est appelé un "processus",
chaque processus a 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 "fileté" 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 des gestionnaires de signaux (parfois plus),
si un processus "threadé" a PID = TGID, il peut être appelé "le thread principal",
l'appel getpid()de n'importe quel processus retournera son TGID (= PID "thread principal"),
l'appel gettid()de n'importe quel processus retournera son PID (!),
tout type de processus peut être créé avec l' clone(2)appel système,
les noms numériques des dossiers que vous pouvez lister avec ls /procles /proc/NUMBERTGID,
les noms numériques des dossiers en /proc/TGID/tasktant que /proc/TGID/task/NUMBERPID,
même si vous ne voyez pas tous les PID existants avec ls /proc, vous pouvez toujours le faire cd /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 de processus différent.
Remarque: l'implémentation du concept de "thread" sous Linux a conduit à une confusion de vocabulaire, et si getpid()vous mentir ne fait pas ce que vous pensiez, c'est parce que son comportement suit la compatibilité POSIX (les threads sont supposés partager un PID commun) .
Suggestion: l' utilisation du mot «tâche» peut aider à faire référence à quelque chose d'exécutable sans trop entrer dans la confusion processus / thread.
Totor
17
Les threads sont des processus sous Linux. Ils sont créés avec l' cloneappel système, qui renvoie un ID de processus auquel un signal peut être envoyé via l' killappel système, tout comme un processus. Les processus de thread sont visibles dans la pssortie. L' cloneappel reçoit des indicateurs qui déterminent la proportion de l'environnement du processus parent qui est partagée avec le processus de thread.
L'homme pthreads(7)dit que pour l'implémentation NPTL (Native POSIX Threads Library) actuelle, "tous les threads d'un processus sont placés dans le même groupe de threads; tous les membres d'un groupe de threads partagent le même PID". Dans l'implémentation obsolète de LinuxThreads, chaque "thread" a son propre PID.
Les threads sont des processus sous Linux. Ils sont créés avec l'
clone
appel système, qui renvoie un ID de processus auquel un signal peut être envoyé via l'kill
appel système, tout comme un processus. Les processus de thread sont visibles dans laps
sortie. L'clone
appel reçoit des indicateurs qui déterminent la proportion de l'environnement du processus parent qui est partagée avec le processus de thread.la source
pthreads(7)
dit que pour l'implémentation NPTL (Native POSIX Threads Library) actuelle, "tous les threads d'un processus sont placés dans le même groupe de threads; tous les membres d'un groupe de threads partagent le même PID". Dans l'implémentation obsolète de LinuxThreads, chaque "thread" a son propre PID.