2 votes

Synchronisation des fils : Comment garantir la visibilité des écritures

Il existe déjà beaucoup d'informations sur les modèles de mémoire logiciels et matériels, les barrières de mémoire, le réordonnancement du stockage/chargement, etc. Cependant, tout cela semble se concentrer sur la garantie de l'ordre relatif des lectures et des écritures vers et depuis la mémoire partagée.

Serait-il légal qu'un tel système retarde l'écriture d'un fil de discussion pendant une période potentiellement longue ?

Prenons l'exemple d'un thread qui effectue des mises à jour d'une structure de données en mémoire, puis lève un drapeau censé informer les autres threads de la mise à jour :

(dataWritten is initially false)
store value1
store value2
store value3
mfence
store dataWritten (true)

Selon la plupart des modèles de mémoire que j'ai lus, la barrière mémoire garantit qu'aucun autre thread ne peut observer dataWritten comme vrai, tout en lisant les valeurs 1, 2 ou 3 périmées, c'est-à-dire qu'elle rend ces écritures atomiques.

Mais puis-je être sûr que les écrits seront vus du tout ? Serait-il légal, selon le modèle de mémoire, de retarder les écritures indéfiniment, tant que le drapeau n'est pas écrit avant les valeurs ?

En termes de base de données, les modèles de mémoire peuvent-ils être utilisés pour raisonner sur la durabilité (en plus de l'atomicité et de la cohérence, qui peuvent être garanties en utilisant des barrières et des drapeaux de mémoire comme dans l'exemple ci-dessus) ?

Mise à jour : Sémantique détaillée de la volatile concernant l'opportunité de la visibilité traite du même sujet dans le contexte du modèle de mémoire Java, et Ordre et visibilité des modèles de mémoire ? Cette discussion s'applique-t-elle également aux modèles de mémoire matérielle, c'est-à-dire que les ISA des CPU ne donnent que des garanties fermes pour une séquence de visibilité correcte, mais des garanties "souples" pour une visibilité retardée ?

4voto

Jamey Sharp Points 4794

Il est difficile de prouver une négation - il existe de nombreuses architectures de jeux d'instructions. Cependant, je pense que vous avez raison de dire qu'aucun modèle de mémoire matérielle ne garantit la visibilité éventuelle des écritures.

Je recommande vivement de lire Une spécification formelle de l'ordonnancement de la mémoire de la famille des processeurs Intel® Itanium®. En effet, même si vous ne vous intéressez probablement pas à l'Itanium, il s'agit d'une description excellente et facile à lire de ce qui concerne les modèles de mémoire matérielle garantie.

En pratique, tant qu'une unité centrale exécute des instructions, elle doit finir par vider ses écritures. De plus, tant que l'écriture a atteint le cache L2, elle devrait normalement être visible pour les autres CPU grâce aux protocoles de cohérence du cache. Je ne pense donc pas qu'il faille s'en inquiéter particulièrement.

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