2
votes

Pourquoi le thread NPTL sous Linux attribue-t-il toujours un PID unique à chaque thread?

Je lis pthread man et vois ce qui suit:

Avec NPTL, tous les threads d'un processus sont placés dans le même groupe de threads; tous les membres d'un groupe de discussion partagent le même PID.

Mon architecture actuelle fonctionne sur NPTL 2.17 et quand j'exécute htop qui affiche des threads, je vois que tous les PID sont uniques. Mais pourquoi? Je m'attends à ce que certains d'entre eux (par exemple, Chrome) partagent le même PID?

 entrez la description de l'image ici


0 commentaires

4 Réponses :



1
votes

Google documentation pour Chromium (qui fonctionne probablement de la même manière que Chrome en ce qui concerne ces concepts) indique qu'ils utilisent une" architecture multi-processus ". Votre citation de la page de manuel de pthread indique que tous les threads d'un même processus sont placés sous le même PID, ce qui ne s'appliquerait pas à l'architecture de Chrome.


2 commentaires

Tu n'as pas tort. Cependant, ces enregistrements verts google / chrome dans la capture d'écran htop ne sont pas des processus mais des threads.


@MaximEgorushkin Dans l'image actuellement publiée, un examen superficiel semble montrer au moins 22 processus Chrome différents, basés sur les variations de VIRT , RES et SHR valeurs de mémoire. Il n'y a que deux groupes qui peuvent éventuellement être plusieurs threads dans le même processus: les deux premiers répertoriés peuvent éventuellement être des threads dans le même processus, et les trois avec une courte ligne de commande composée uniquement de / opt / google / chrome / chrome peut également être un seul processus. Toutes les autres instances de Chrome semblent s'exécuter dans des espaces d'adressage de tailles différentes, ce qui en fait des processus distincts.



1
votes

Le noyau Linux a le concept de pids POSIX (explorable dans / proc / * ) mais il les appelle identifiants de groupe de threads dans la source du noyau et il fait référence à ses identifiants de thread internes comme pid s (explorable dans / proc / * / task / * ).

Je crois que cela est enraciné dans le traitement original par Linux des threads comme de "simples processus" qui partagent des espaces d'adressage et un tas d'autres choses entre eux.

Votre outil utilisateur propage probablement cette terminologie peut-être déroutante du noyau Linux.


0 commentaires

1
votes

Parce que les threads au niveau du noyau ne sont rien de plus que des processus avec (presque) le même espace d'adressage.

Cela a été "résolu" par le développement du noyau Linux en les renommant les processus en "threads", le "pid" -s en "tid" -s, et les anciens processus sont devenus des "groupes de threads".

Cependant, la triste vérité est que si vous créez le thread sous Linux ( clone () ), il créera un processus - en utilisant uniquement les (presque) mêmes segments de mémoire.

Cela signifie un modèle de filetage 1: 1. Cela signifie que tous les threads sont en fait des threads au niveau du noyau, ce qui signifie qu'ils sont essentiellement des processus dans le même espace d'adressage.

D'autres alternatives seraient:

  • 1: modèle de filetage M. Cela signifie que le noyau ne connaît pas les threads, c'est la tâche des bibliothèques de l'espace utilisateur de faire un "multitâche en cours" pour s'exécuter apparemment multi-thread.
  • Modèle de filetage N: M. C'est mieux, malheureusement certains avis favorisent encore 1: 1. Cela signifierait que nous avons à la fois des threads au niveau de l'utilisateur et du noyau et qu'un algorithme d'optimisation décide de ce qu'il faut exécuter et où.

Autrefois, Linux avait un modèle N: M (ngpt), mais il a été supprimé sur une autre solution de secours. C'était que les appels au noyau Linux sont intrinsèquement synchrones (bloquants). Par conséquent, une certaine coopération du noyau était nécessaire même pour la synchronisation de l'espace utilisateur. Personne ne voulait faire ça.

Il en est de même.

P.s. pour créer une application performante, vous devez en fait éviter de créer beaucoup de threads à la fois. Vous devez utiliser un pool de threads avec des protocoles de verrouillage bien pensés. Si vous ne minimisez pas l'utilisation des créations / jointures de threads, votre application sera lente et inefficace, peu importe qu'elle soit N: M ou non.


0 commentaires