Qu'entend-on par utilisation d'une barrière de mémoire explicite?
Réponses
Trop de publicités?Pour des gains de performance Processeurs modernes souvent d'exécuter des instructions de commande à utiliser au maximum le silicium (y compris la mémoire en lecture/écriture). Parce que le matériel met en œuvre les instructions de l'intégrité vous ne remarquerez ce dans un seul thread d'exécution. Cependant, pour plusieurs threads ou des environnements avec de la mémoire volatile (memory mapped I/O par exemple), cela peut entraîner un comportement imprévisible.
Un mémoire en clôture/barrière est une classe d'instructions qui signifie mémoire de lecture/écriture se produisent dans l'ordre que vous attendez. Par exemple une "clôture" désigne toutes les lectures/écritures avant la clôture sont partie prenante avant que ceux-ci après la clôture.
Note de la mémoire clôtures sont un concept hardware. Dans un langage de haut niveau, nous sommes habitués à traiter avec les mutex et les sémaphores - celles-ci peuvent être mis en œuvre à l'aide de la mémoire des clôtures au faible niveau de l'explicite et l'utilisation de barrières de mémoire ne sont pas nécessaires. L'utilisation de barrières de mémoire nécessite une étude approfondie de l'architecture matérielle et le plus souvent à des pilotes de périphérique que le code de l'application.
Le CPU réorganisation est différent des optimisations du compilateur - bien que les objets peuvent être similaires. Vous avez besoin de prendre des mesures distinctes pour arrêter le compilateur réorganisation de vos instructions si cela peut provoquer des comportements indésirables (par exemple, l'utilisation du mot clé volatile en C).
Copie de ma réponse à une autre question, Quels sont les trucs qu'un processeur ne pour optimiser le code?:
Le plus important serait d'accès à la mémoire de réorganisation.
Absent de la mémoire de clôtures ou de la sérialisation d'instructions, le processeur est libre de réorganiser les accès à la mémoire. Certaines architectures de processeurs ont des restrictions sur la façon dont beaucoup qu'ils peuvent réorganiser; Alpha est connu pour être le plus faible (c'est à dire, celui qui peut réorganiser le plus).
Un très bon traitement du sujet peuvent être trouvés dans les sources du noyau Linux documentation, à Documentation/memory-barriers.txt.
La plupart du temps, il est préférable d'utiliser le verrouillage de primitives à partir de votre compilateur ou de la bibliothèque standard; ils sont bien testés, devrait avoir toutes les barrières de la mémoire en place, et sont probablement tout à fait optimisé (optimisation de verrouillage primitives est difficile; même les experts peuvent obtenir leur mal parfois).
Dans mon expérience, il se réfère à une barrière de mémoire, qui est une instruction (explicite ou implicite) pour synchroniser les accès à la mémoire entre plusieurs threads.
Le problème se produit dans la combinaison de moderne agressive compilateurs (ils ont un incroyable liberté de réorganiser les instructions, mais généralement ne sais rien de votre fils) et des Processeurs multicœurs.
Une bonne introduction au problème est "Le "Double-Vérifier le Verrouillage est Cassé" Déclaration". Pour beaucoup, c'était le réveil qu'il y a des dragons.
Implicite de mémoire pleine obstacles sont généralement inclus dans la plate-forme de synchronisation de thread routines, qui couvrent l'essentiel. Toutefois, pour les sans verrouillage de la programmation et de la mise en œuvre de la coutume, léger synchronisation de modèles, souvent, vous avez juste besoin de la barrière, ou même un obstacle.
Barrière de mémoire, aussi connu comme membar ou de la mémoire de la clôture, est une classe de les instructions qui cause une centrale unité de traitement (CPU) pour appliquer une la commande de contrainte sur la mémoire les opérations émises avant et après la de barrière d'instruction.
Les processeurs employer des optimisations de performances qui peut entraîner de d'exécution, y compris la charge de la mémoire et de les opérations de banque. Fonctionnement de la mémoire la réorganisation normalement passe inaperçu dans un seul thread d'exécution, mais les causes des comportements imprévisibles dans simultanée des programmes et des pilotes de périphériques à moins d'être soigneusement contrôlée. La exact la nature d'un ordre de contrainte est dépendant du matériel, et définie par l' l'architecture du modèle de mémoire. Certains les architectures de fournir de multiples les barrières de l'application de différentes la commande de contraintes.
Les barrières de la mémoire sont généralement utilisés lors de la mise en œuvre de bas niveau de la machine code qui fonctionne sur la mémoire partagée par l' plusieurs appareils. Ce code comprend des primitives de synchronisation et sans verrouillage des structures de données sur les systèmes multiprocesseurs, et de l'appareil les pilotes qui communiquent avec l'ordinateur matériel.