39 votes

Les variables volatiles se lisent-elles aussi rapidement que les lectures normales?

Je sais que l'écriture dans une variable volatile la purge de la mémoire de tous les processeurs, mais je veux savoir si les lectures dans une variable volatile sont aussi rapides que les lectures normales?

Les variables volatile peuvent-elles être placées dans le cache du processeur ou sont-elles toujours extraites de la mémoire principale?

17voto

Vous devriez vraiment consulter cet article: http://brooker.co.za/blog/2012/09/10/volatile.html . L'article de blog soutient que les lectures volatiles peuvent être beaucoup plus lentes (également pour x86) que les lectures non volatiles sur x86.

13voto

Tim Bender Points 11611

La réponse est un peu dépendantes de l'architecture. Sur un système x86, il n'y a pas de frais généraux additionnels associés à la volatilité des lectures.

JMM livre de cuisine de Doug Lea, voir l'architecture de la table près du fond.

Pour clarifier les choses: Il n'y a aucune charge supplémentaire associé à la lecture elle-même. Les barrières de la mémoire sont utilisés pour s'assurer du bon de commande. La JSR-133 classe les quatre obstacles "LoadLoad, LoadStore, StoreLoad, et StoreStore". En fonction de l'architecture, de certains de ces obstacles correspondent à un "no-op", ce qui signifie qu'aucune mesure n'est prise, d'autres nécessitent une clôture. Il n'est pas implicite des coûts associés à la Charge elle-même, si l'on peut être engagée si une clôture est en place. Dans le cas de l'x86, seulement un StoreLoad barrière résultats dans une clôture.

1voto

sybreon Points 2328

Il est dépendants de l'architecture. Ce volatile fait est de dire au compilateur de ne pas optimiser cette variable à l'écart. Il oblige la plupart des opérations de traitement de la variable d'état comme une inconnue. Parce qu'il est instable, il peut être changé par un autre thread ou une autre opération du matériel. Donc, lit aurez besoin de re-lire la variable, ainsi que des actions de la lecture-modification-écriture genre.

Ce type de variable est utilisé pour les pilotes de périphérique et aussi pour la synchronisation avec en mémoire les mutex/sémaphores.

0voto

ripper234 Points 39314

Les lectures volatiles ne peuvent pas être aussi rapides, en particulier sur les processeurs multicœurs (mais aussi uniquement sur les cœurs). Le noyau en cours d'exécution doit récupérer à partir de l'adresse mémoire réelle pour s'assurer qu'il obtient la valeur actuelle - la variable ne peut en effet pas être mise en cache.

Contrairement à une autre réponse ici, les variables volatiles ne sont pas utilisées uniquement pour les pilotes de périphérique! Ils sont parfois indispensables pour écrire du code multithread haute performance!

-3voto

drudru Points 2101

volatile implique que le compilateur ne peut pas optimiser la variable en plaçant sa valeur dans un PROCESSEUR inscrire. Il doit être accessible à partir de la mémoire principale. Il peut, cependant, être placé dans un cache du PROCESSEUR. Le cache de garantie de la cohérence entre tous les autres Processeurs/cœurs dans le système. Si la mémoire est mappé à IO, alors les choses sont un peu plus compliquées. Si il a été conçu comme tel, le matériel d'empêcher que l'espace d'adressage d'être mis en cache et tous les accès à cette mémoire va aller pour le matériel. Si il n'y a pas une telle conception, les concepteurs de matériel nécessitent plus d'instructions du PROCESSEUR pour s'assurer que la lecture/écriture passe par les caches, etc.

Généralement, le "volatile" mot-clé est utilisé uniquement pour les pilotes de périphériques dans les systèmes d'exploitation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X