Atomicité des charges et des magasins sur x86
Malgré l'impression que les opérations de mémoire dans std::atomic reposent uniquement sur le verrouillage du bus, les opérations atomiques sont en fait exécutés dans le cache.
Cache Cohérence
La cohérence du cache garantit que tous les cœurs ont une vue cohérente de la mémoire. Les lignes de cache sont transférées entre les cœurs et la mémoire sous forme de morceaux atomiques. Cela permet aux opérations atomiques de se produire dans le cache, sans dépendre du verrouillage de bus externe.
Opérations alignées
Les opérations de chargement et de stockage alignées jusqu'à 64 bits sont garanties. atomique sur les processeurs x86. En effet, les accès alignés peuvent être transférés sur des chemins de données suffisamment larges pour s'adapter à l'ensemble de l'opération.
Opérations non alignées
Les charges et les magasins non alignés peuvent devenir non atomiques. , car ils peuvent nécessiter plusieurs accès pour être complétés. Par exemple, un chargement ou un stockage qui traverse une limite de ligne de cache doit être effectué dans deux accès distincts, ce qui le rend non atomique.
Opérations atomiques de lecture-modification-écriture
Les opérations atomiques de lecture-modification-écriture, telles que lock add [mem], eax, sont plus complexes à mettre en œuvre que de simples chargements ou magasins. Ces opérations nécessitent que le cœur maintienne la ligne de cache affectée dans un état modifié et empêche toute modification externe jusqu'à ce que l'opération soit terminée. Les opérations de lecture-modification-écriture non alignées peuvent nécessiter l'activation du signal LOCK# pour verrouiller le bus et empêcher les autres cœurs d'accéder à la mémoire affectée.
Optimisation du compilateur
Les compilateurs peuvent optimisez les charges seq_cst en omettant l'instruction mfence, car l'ordre de la mémoire x86 empêche la réorganisation de LoadLoad et LoadStore. Cependant, des clôtures sont toujours nécessaires pour les magasins seq_cst afin d'empêcher la réorganisation de StoreLoad.
En résumé, l'atomicité sur les processeurs x86 est obtenue grâce à une combinaison de cohérence du cache, d'opérations alignées et de verrouillage de bus pour les opérations de lecture-modification-écriture non alignées. . Cela permet aux opérations atomiques de se produire efficacement et sans affecter les performances globales du système.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!