web-dev-qa-db-fra.com

La bibliothèque Pthread est-elle réellement une solution de thread utilisateur?

Le titre n'est peut-être pas assez clair car je ne sais pas vraiment comment définir mes questions.

Je comprends que Pthread est une bibliothèque de threads conforme à la norme POSIX (à propos de POSIX, voir wikipedia: http://en.wikipedia.org/wiki/Posix ). Il est disponible dans un système d'exploitation de type Unix.

À propos du fil, j'ai lu qu'il existe trois modèles différents:

Fil de niveau utilisateur: le noyau ne le sait pas. L'utilisateur lui-même crée/implémente/détruit les threads.

Thread de niveau noyau: le noyau supporte directement plusieurs threads de contrôle dans un processus.

Processus léger (LWP): planifié par le noyau mais peut être délimité par des threads utilisateur.

Avez-vous vu ma confusion? Lorsque j'appelle pthread_create() pour créer un thread, ai-je créé un thread de niveau utilisateur? Je suppose. Puis-je dire que Pthread propose une solution de niveau utilisateur pour les threads? Il ne peut pas manipuler le noyau/LWP?

44
Mengfei Murphy

Q: Je comprends que Pthread est une bibliothèque de threads conforme à la norme POSIX

R: Oui. En fait, "Pthreads" signifie "fils Posix": http://en.wikipedia.org/wiki/Pthreads

Q: Il est disponible dans un système d'exploitation de type Unix.

R: En fait, il est disponible pour de nombreux systèmes d'exploitation différents ... y compris Windows, MacOS ... et, bien sûr, Linux, BSD et Solaris.

Q: À propos du fil, j'ai lu qu'il existe trois modèles différents

Maintenant, vous devenez flou. "Threads" est un terme très générique. Il existe de très nombreux modèles différents. Et de nombreuses façons différentes de caractériser et/ou d'implémenter des "threads". Y compris des trucs comme le modèle de thread Java ou le modèle de thread Ada.

Q: Lorsque j'appelle pthread_create () pour créer un thread, ai-je créé un thread de niveau utilisateur?

R: Oui: Presque tout ce que vous faites dans l'espace utilisateur est "protégé" dans votre propre "espace utilisateur" privé.

Q: Fil de niveau utilisateur: le noyau ne le sait pas.

R: Non. Le noyau sait tout :)

Q: Fil de niveau noyau: le noyau prend directement en charge plusieurs threads de contrôle dans un processus.

R: Oui, il existe des "threads du noyau".

Et, en l'occurrence, Linux fait un usage intensif des threads du noyau. Par exemple, chaque processus unique dans un système Linux est un "thread noyau". Et chaque pthread créé par l'utilisateur est également implémenté en tant que nouveau "thread de noyau". De même que les "threads de travail" (qui sont complètement invisibles pour tout processus de niveau utilisateur).

Mais c'est un sujet avancé que vous n'avez PAS besoin de comprendre pour utiliser efficacement les pthreads. Voici un excellent livre qui en a discuté - et de nombreux autres sujets - en détail:

Développement du noyau Linux, Robert Love

N'oubliez pas: "Pthreads" est une interface. La façon dont il est implémenté dépend de la plate-forme. Linux utilise des threads du noyau; Windows utilise des threads Win32, etc.

================================================== ========================= ADDENDUM:

Étant donné que les gens semblent toujours frapper ce vieux fil, j'ai pensé qu'il serait utile de référencer ce post:

https://stackoverflow.com/a/11255174/421195

Linux utilise généralement deux implémentations de pthreads: LinuxThreads et Native POSIX Thread Library (NPTL) , bien que la première soit largement obsolète. Le noyau de 2.6 fournit NPTL, qui offre une conformité beaucoup plus étroite avec SUSv3, et fonctionne mieux surtout quand il y a beaucoup de threads.

Vous pouvez interroger l'implémentation spécifique de pthreads sous Shell à l'aide de la commande:

getconf GNU_LIBPTHREAD_VERSION

Vous pouvez également obtenir une différence d'implémentation plus détaillée dans The Linux Programming Interface .

"Pthreads" est une bibliothèque , basée sur la norme Posix. La façon dont une bibliothèque pthreads est implémentée diffère d'une plateforme à l'autre et d'une bibliothèque à l'autre.

18
paulsm4

@ paulsm4 Je doute de votre commentaire selon lequel le noyau sait tout. Dans ce contexte particulier des threads au niveau utilisateur, le noyau ne sait pas qu'une telle chose se produit. L'ordonnancement d'un thread au niveau de l'utilisateur est maintenu par l'utilisateur lui-même (via l'interface fournie par une bibliothèque) et le noyau finit par attribuer un seul thread du noyau à l'ensemble du processus. Le noyau traiterait le processus comme un seul thread et tout appel de blocage par l'un des threads finirait par bloquer tous les threads de ce processus. Reportez-vous à http://www.personal.kent.edu/~rmuhamma/OpSystems/Myos/threads.htm

33
pareshverma91

pthreads, en soi, n'est pas vraiment une bibliothèque de threads. pthreads est l'interface qu'une bibliothèque de threads spécifique implémente, en utilisant les ressources de concurrence disponibles sur cette plate-forme. Il y a donc une implémentation de pthreads sur linux, sur bsd, sur solaris, etc., et bien que l'interface (les fichiers d'en-tête et la signification des appels) soit la même, l'implémentation de chacun est différente.

Ainsi, ce que pthread_create fait réellement, en termes d'objets de thread du noyau, varie entre les systèmes d'exploitation et les implémentations de la bibliothèque pthread. En première approximation, vous n'avez pas besoin de savoir (c'est ce que l'abstraction pthread vous permet de ne pas avoir besoin de savoir). Finalement, vous devrez peut-être voir "derrière le rideau", mais pour la plupart des utilisateurs de pthread, ce n'est pas nécessaire.

Si vous voulez savoir ce que fait une implémentation de/specific/pthread, sur un OS spécifique, vous devrez clarifier votre question. Ce que Solaris et Linux font, par exemple, est très différent.

14
FIn

Sous Linux, pthread est implémenté comme un processus léger . Le noyau (v2.6 +) est en fait implémenté avec NPTL . Permettez-moi de citer le contenu du wiki:

NPTL est une soi-disant bibliothèque de threads 1 × 1, en ce que les threads créés par l'utilisateur (via la fonction de bibliothèque pthread_create ()) sont en correspondance 1-1 avec les entités programmables dans le noyau (tâches, dans le cas Linux). Il s'agit de l'implémentation de threading la plus simple possible.

Donc pthread dans le noyau linux est en fait implémenté en tant que thread du noyau.

10
Junji Zhi

Je trouve que les réponses précédentes ne sont pas aussi satisfaisantes ou claires que j'aurais aimé, alors voici:

Quand vous appelez

pthread_create(...)

vous créez toujours un nouveau thread au niveau utilisateur. Et en supposant qu'il existe un OS, il y a toujours un ou plusieurs threads du noyau ... mais approfondissons:

Selon la 10e édition des "concepts de système d'exploitation", la classification réelle que nous devrions examiner (en ce qui concerne les bibliothèques de threads) est de savoir comment les threads de niveau utilisateur sont mappés sur les threads du noyau (et c'est ce que la question signifiait vraiment).

Les modèles sont n à un (chaque thread de niveau utilisateur dans un seul processus est mappé à un thread de noyau différent), plusieurs à un (la bibliothèque de threads est "au niveau utilisateur "donc tous les différents threads d'un même processus sont mappés sur un seul thread du noyau, et les structures de données des threads, le changement de contexte, etc. sont traités au niveau de l'utilisateur et non par l'OS [ce qui signifie que si un thread se bloque sur certains I/O appel, l'ensemble du processus peut potentiellement bloquer]), et plusieurs à plusieurs (quelque chose entre les deux, évidemment le nombre de threads au niveau de l'utilisateur est supérieur ou égal au nombre de threads du noyau qu'il est mappé sur).

Maintenant, pthreads est un spécification et non un implémentation, et l'implémentation dépend du système d'exploitation sur lequel il est écrit. Il peut s'agir de n'importe lequel de ces modèles (notez que "plusieurs à plusieurs" est très flexible).

Ainsi, à titre d'exemple, sous Linux et Windows (les systèmes d'exploitation les plus populaires depuis des années, où le modèle est "un à un"), l'implémentation est "un à un".

1
Yoni Keren

Pthreads n'est qu'une interface standardisée pour les bibliothèques de threads. La création d'un thread OS ou d'un thread léger dépend de la bibliothèque que vous utilisez. Néanmoins, mon premier invité serait que vos threads sont de "vrais" threads de niveau OS.

0
Eser Aygün