Modèles de cohérence de la mémoire
Un modèle de cohérence de la mémoire spécifie les valeurs que les lectures peuvent observer lorsque des threads concurrents accèdent à une mémoire partagée, définissant ainsi les garanties d'ordonnancement sur lesquelles les programmeurs peuvent s'appuyer.
Definition
Un modèle de cohérence de la mémoire est une spécification formelle des valeurs que les opérations de lecture peuvent retourner dans une exécution concurrente, fixant les ordonnancements des accès mémoire que le langage, le compilateur et le matériel doivent respecter.
Scope
Ce sujet couvre l'éventail des modèles de cohérence, de la cohérence séquentielle aux modèles relâchés et faibles, la relation 'happens-before' et les garanties d'absence de course aux données, les ordonnancements de la mémoire matérielle (tels que l'ordre total des écritures), et les modèles de mémoire au niveau du langage pour C++ et Java. Il aborde les raisons de l'existence des modèles relâchés, la manière dont les barrières mémoire (fences) et les opérations atomiques rétablissent l'ordonnancement, et comment raisonner de manière fiable sur la mémoire concurrente.
Core questions
- Quels ordonnancements d'opérations mémoire un programme peut-il légalement observer ?
- Pourquoi les modèles de mémoire relâchés existent-ils et que permettent-ils ?
- Comment la garantie d'absence de course aux données simplifie-t-elle le raisonnement ?
- Comment les barrières mémoire et les opérations atomiques imposent-elles l'ordonnancement ?
Key theories
- Cohérence séquentielle
- Lamport a défini la cohérence séquentielle, selon laquelle une exécution multiprocesseur doit apparaître comme un unique entrelacement d'opérations respectant l'ordre du programme de chaque processeur, constituant le modèle de base intuitif le plus fort.
- Cohérence relâchée et la garantie SC-pour-DRF
- Adve et Gharachorloo expliquent les modèles relâchés et le principe selon lequel les programmes sans course aux données se comportent comme s'ils étaient séquentiellement cohérents, conciliant performance et programmabilité.
- Modèles de mémoire au niveau du langage
- Manson, Pugh et Adve ont formalisé le modèle de mémoire Java en utilisant une relation 'happens-before', définissant les optimisations légales et les garanties que reçoivent même les programmes avec des courses aux données.
Clinical relevance
Étant donné que les processeurs multicœurs et les compilateurs optimisants réordonnent les opérations mémoire, les modèles de mémoire des langages sont essentiels pour écrire du code concurrent correct et portable. Ils indiquent aux programmeurs quand une synchronisation est nécessaire et définissent les garanties que les bibliothèques et les environnements d'exécution peuvent offrir.
History
Lamport a formalisé la cohérence séquentielle en 1979. À mesure que le matériel adoptait des ordonnancements relâchés pour des raisons de performance, le tutoriel de 1996 d'Adve et Gharachorloo a codifié le paysage des modèles de cohérence et le cadre d'absence de course aux données. Les concepteurs de langages ont ensuite intégré des modèles de mémoire dans les spécifications, le modèle de mémoire Java (2005) et le modèle de mémoire C++11 établissant l'approche moderne.
Debates
- Sémantique des programmes avec des courses aux données
- Une question difficile est de savoir quelles garanties, le cas échéant, donner aux programmes contenant des courses aux données ; les modèles de langage doivent empêcher les valeurs 'sorties de nulle part' (out-of-thin-air) tout en permettant des optimisations agressives du compilateur et du matériel.
Key figures
- Leslie Lamport
- Sarita Adve
- Kourosh Gharachorloo
- William Pugh
- Jeremy Manson
Related topics
Seminal works
- lamport1979
- adve1996
- manson2005
Frequently asked questions
- Pourquoi tous les systèmes n'utilisent-ils pas simplement la cohérence séquentielle ?
- La cohérence séquentielle interdit de nombreuses optimisations du compilateur et du matériel qui améliorent les performances ; la plupart des systèmes réels adoptent donc des modèles relâchés et fournissent des primitives de synchronisation pour retrouver un ordonnancement plus fort uniquement là où c'est nécessaire.
- Qu'est-ce que la garantie d'absence de course aux données ?
- Selon de nombreux modèles de mémoire de langage, un programme qui ne contient pas de courses aux données (tous les accès conflictuels sont correctement synchronisés) est garanti de se comporter comme si la mémoire était séquentiellement cohérente.