Pourquoi un pthread mutex considéré comme “plus lent” que d'une futex?
Pourquoi les mutex POSIX considéré comme plus lourd ou plus lent que futexes? Où est la surcharge en venant dans le pthread mutex type? J'ai entendu dire que pthread mutex sont basés sur les futexes, et quand incontestée, ne pas faire des appels dans le noyau. Il semble alors qu'un pthread mutex est simplement un "wrapper" autour d'un futex.
Est la surcharge simplement dans la fonction-wrapper appel et la nécessité pour le mutex la fonction "setup" le futex (c'est à dire, en gros le programme d'installation de la pile pour la pthread mutex appel de fonction)? Ou sont-il une mémoire supplémentaire de la barrière étapes avec pthread mutex?
- Futex? Ai-je raté quelque chose dans la classe il y a 15 ans?
- vous ne manquerez de rien à l'époque, il n'existait pas! On les retrouve dans Linux 2.6.x (développé au cours de 2.5.le développement de x de la série)
- en fait, les mêmes types de serrures existe beaucoup plus tôt. Je crois que l'original de la DRI de verrouillage (autour de '91, SGI) a été similaire à l'actuelle futexes.
- Avez-vous une référence pour "mutex POSIX considéré comme plus lourd ou plus lent que futexes"? Car autant que je sache, depuis plusieurs années (depuis NPTL) pthreads sur Linux ont travaillé comme vous le décrivez.
- Juste par curiosité, si ils travaillent comme je l'ai décrit dans ma question (c'est à dire, les deux restent dans l'espace utilisateur lorsque incontestée, et les deux ont noyau des appels en cas de contestation), alors pourquoi passer par la difficulté de l'utilisation d'un futex sur un mutex?
- BTW, il me semble que sur ce thread les gens aime vraiment le fait que j'ai répondu en suggérant une futex sur un mutex, depuis mon hypothèse était un mutex doit l'emporter, même dans le uncontended cas, faire un appel dans le noyau. J'ai remarqué que certains des affiches ont été de mentionner que sur Linux, pthread mutex et les sémaphores sont des wrappers sur futexes, ce qui pose alors la question de savoir pourquoi traiter le problème de l'utilisation d'un futex lorsque des abstractions de niveau supérieur sont facilement disponibles?
- Autant que je sache, il n'y a pas de raison. Un "futex" est juste un Linux primitive afin de permettre une mise en œuvre efficace des mutex et les variables de condition. Maintenant que ces implémentations efficaces font partie de la bibliothèque standard, il n'y a pas de raison d'utiliser futexes directement pour autant que je sais.
- Toute moderne, saine de la mise en œuvre de pthread mutex aura recours à un mécanisme sous-jacent qui est une des futex ou quelque chose d'à peu près équivalente. Ainsi, le "mutex ou de futex" façon que vous encadrées votre question a une fausse supposition construit en elle.
- Merci pour l'info ... alors qu'il peut être une fausse hypothèse construite sur la question, j'ai vu d'autres threads sur S. O. établir une distinction entre les deux, de sorte que l'audition de certaines sources qu'il n'y a pas de distinction, et à partir d'autres sources qu'il y a une distinction, m'a laissé perplexe.
- La distinction n'est pas entre les mutex et les futex. La distinction entre un mutex mis en œuvre avec futexes, et un mutex mis en œuvre avec un utilisateur de la file d'attente et les signaux (l'ancien LinuxThreads façon). Je suppose que vous pourriez aussi envisager de mutex avec pas rapide de l'espace utilisateur chemin, comme Windows mutex qui implique toujours un syscall, mais ils sont une blague, personne ne l'a jamais utilisé pour la mise en œuvre de mutex POSIX, à ma connaissance...
- Je crois que la version Windows de pthreads utilise Win32 mutex, ainsi que le coup de pouce de threads et de C++0x threads lors de la compilation et de le lancer sous windows. S'il vous plaît corrigez-moi si je me trompe ...
- La vraie question ici est de repérer une saine mise en œuvre de pthreads qui serait "moderne" assez pour être à l'aide de futexes de mettre en œuvre un mutex.
Vous devez vous connecter pour publier un commentaire.
Parce qu'ils restent dans l'espace utilisateur, autant que possible, ce qui signifie qu'ils nécessitent moins d'appels système, qui est intrinsèquement plus rapide parce que le changement de contexte entre l'utilisateur et en mode noyau est cher.
Je suppose que vous parlez de noyau threads quand vous parlez des threads POSIX. Il est tout à fait possible d'avoir un tout utilisateur mise en œuvre des threads POSIX qui ne nécessitent pas d'appels système, mais ont d'autres problèmes qui leur sont propres.
Ma compréhension est que l'un des futex est à mi-chemin entre un noyau POSIX thread et un espace utilisateur POSIX thread.
Futexes ont été créés pour améliorer les performances de pthread mutex. NPTL utilise futexes, LinuxThreads précédé futexes, qui je pense est où le "plus lent" l'on vient. NPTL mutex peut avoir une certaine charge supplémentaire, mais il ne devrait pas être beaucoup.
Edit:
Les frais généraux réels se compose essentiellement sur:
Donc, un certain nombre de cycles (cas typique) à quelques cycles + une branche erreurs de prédiction + un supplément de cache miss (pire cas).
int
condition) en une seule fois. Il est plus de temps et d'espace efficaces et d'éviter l'écueil de l'POSIX que quelqu'un pourrait attendre une condition en utilisant différents mutex.La réponse courte à votre question est que futexes sont connus pour être mis en œuvre sur le plus efficacement possible, tout en un pthread mutex peut ou peut ne pas l'être. Au minimum, un pthread mutex a frais généraux associés à la détermination du type de mutex et futexes ne le font pas. Ainsi, un futex sera presque toujours être au moins aussi efficace qu'une pthread mutex, jusqu'à ce que et à moins que quelqu'un pense à une structure plus légère qu'une futex et dégage alors une pthreads de mise en œuvre qui utilise que pour son défaut de mutex.
Techniquement parlant pthread mutex ne sont pas plus lent ou plus rapide que futexes. pthread est juste une API standard, de sorte qu'ils soient lents ou rapides, dépend de la mise en œuvre de l'API.
Spécifiquement dans Linux pthread mutex sont mis en œuvre comme futexes et sont donc rapide. En fait, vous ne voulez pas utiliser le futex API en elle-même, car il est très difficile à utiliser, ne pas avoir les fonctions wrapper dans la glibc, et nécessite un codage de l'assemblée qui serait non portable. Heureusement pour nous, la glibc responsables déjà codé tout cela pour nous sous le capot de la pthread mutex API.
Maintenant, parce que la plupart des systèmes d'exploitation ne pas mettre en œuvre les futexes alors les programmeurs signifient généralement par pthread mutex est le rendement que vous obtenez à partir d'habitude la mise en œuvre de pthread mutex, qui est plus lent.
C'est donc une statistique fait que dans la plupart des systèmes d'exploitation qui sont conformes à POSIX pthread mutex est mis en œuvre dans l'espace noyau et est plus lent qu'un futex. Sous Linux, ils ont le même rendement. Il pourrait être qu'il existe d'autres systèmes d'exploitation où pthread mutex sont mis en œuvre dans l'espace utilisateur (dans le uncontended cas) et donc avoir de meilleures performances, mais je ne suis au courant de Linux à ce point.
futex
et la__psync_mutexdrop/wait
Api dans le courant de macOS sont des Api spécial, FWIW, mais je ne vois pas l'argument que vous avez mis de l'avant qui empêche le type d'approche que vu dans le macOS avant 10.10.Sur AMD64 un futex est de 4 octets, tandis qu'un NPTL pthread_mutex_t est de 56 octets! Oui, il y a une surcharge importante.