Question

Quel est le modèle de mémoire pour la simultanéité en C ++ 03?

(Et C ++ 11 modifie-t-il le modèle de mémoire pour mieux prendre en charge la concurrence?)

Était-ce utile?

La solution

Le modèle de mémoire C ++ spécifie quand et pourquoi la mémoire physique est lue / écrite par rapport au code C ++.

Jusqu'à la prochaine norme C ++, le modèle de mémoire C ++ est identique à C. Dans la norme C ++ 0x, un modèle de mémoire approprié pour le multithreading devrait être inclus (voir here ), et cela fera peut-être partie de la prochaine révision de la norme C, C1X. L’actuel est rudimentaire:

  • il spécifie uniquement le comportement des opérations de mémoire observables par le programme en cours.
  • il ne dit rien sur les accès simultanés à la mémoire lorsque plusieurs processus accèdent à la même mémoire (il n’existe aucune notion de mémoire partagée ni de processus).
  • cela ne dit rien sur les accès simultanés à la mémoire lorsque plusieurs threads accèdent à la même mémoire (il n'y a pas de notion de threads).
  • il n’offre aucun moyen de spécifier un ordre pour les accès en mémoire (les optimisations du compilateur incluent le mouvement du code et les accès récents des processeurs, les deux peuvent rompre des modèles tels que l’initialisation à double contrôle).

Ainsi, l'état actuel est le suivant: Les opérations de mémoire C ++ ne sont spécifiées que lorsque vous avez 1 processus, avec son thread principal et n'écrivez pas de code qui dépend d'un ordre spécifique de lecture / écriture de variable et le tour est joué. En gros, cela signifie que, mis à part le programme traditionnel Hello World, vous êtes foutu.

Bien sûr, vous serez prompt à ajouter que "cela fonctionne aujourd'hui sur ma machine, vous ne pouvez peut-être pas avoir raison" . La phrase correcte serait "cela fonctionne aujourd'hui sur ma machine avec cette combinaison spécifique de matériel, système d'exploitation (librairie de threads) et compilateur qui se connaissent suffisamment pour implémenter quelque chose qui fonctionne un peu mais qui risque de ne plus fonctionner correctement. point ".

D'accord, c'est un peu dur mais bon sang, même Herb Sutter le reconnaît (il suffit de lire l'intro) et parle de toutes les versions antérieures à 2007 de l'une des chaînes d'outils C / C ++ les plus répandues ...

Le comité standard C ++ tente de proposer quelque chose qui résoudra tous ces problèmes tout en restant moins contraignant (et donc plus performant) que le modèle de mémoire de Java.

Hans Boehm a rassemblé ici quelques pointeurs vers des articles sur le sujet, à la fois académiques, et du comité C ++.

Autres conseils

En regardant d'autres réponses, il semble que de nombreux programmeurs C ++ ne savent même pas ce que le "modèle de mémoire" & ";" vous parlez de moyens.

La question concerne le modèle de mémoire dans le sens actuel: quelles garanties (le cas échéant) existe-t-il concernant le réordonnancement écriture / lecture (ce qui peut arriver du côté du compilateur ou du côté de l'exécution)? Cette question est très importante pour la programmation multithread, car sans de telles règles, écrire de bons programmes multithreads n’est pas possible, et une vérité quelque peu surprenante tient au manque actuel de modèle de mémoire explicite, de nombreux programmes multithread fonctionnent plus ou moins "par pure chance". - le plus souvent grâce aux compilateurs qui supposent un alias de pointeur entre les appels de fonctions. - voir Les threads ne peuvent pas être implémentés en tant que bibliothèque

En C ++ actuel, il n'y a pas de modèle de mémoire standard. Certains compilateurs définissent un modèle de mémoire pour les variables volatiles, mais cela n’est pas standard. C ++ 0x définit le nouveau " atomique " primitives à cet effet. Vous trouverez un point de départ exhaustif pour vérifier le statut récent à l'adresse Modèle de threads et de mémoire. pour C ++

Les liens importants sont également Modèle de mémoire simultanée , Types atomiques et Classement C ++ des dépendances de données: modèle de mémoire et de mémoire atomique propositions standard.

Malheureusement, en C ++, il n’existe pas de "modèle de mémoire standard". comme celle de Java. L'implémentation réelle est laissée au compilateur, aux bibliothèques d'exécution et aux processeurs.

Ainsi, le modèle de mémoire C ++ == mélange chaotique de modèles, ce qui signifie que vous devez toujours essayer d’écrire du code sécurisé qui ne dépend pas d’un modèle de mémoire spécifique, ce qui est également valable pour la programmation par thread, car Le compilateur peut effectuer toutes les optimisations qu’il souhaite en dehors d’une section critique, même en cas de traitement hors service!

Qu'en est-il de consulter les documents sur le site Web du comité de standard C ++:

?

Si vous souhaitez mieux comprendre les modèles de cohérence de la mémoire partagée, veuillez vous reporter au didacticiel suivant.

http://rsim.cs.uiuc.edu/~sadve /Publications/computer96.pdf

Réponse courte: il n'y en a pas

Réponse longue: C ++ n’a pas de mémoire gérée, vous devez l’allouer et la libérer vous-même. Les classes de pointeurs intelligents peuvent alléger cette tâche. Si vous oubliez de libérer de la mémoire que vous avez allouée, c'est une fuite de mémoire et un bogue. Si vous essayez d'utiliser la mémoire après l'avoir libérée, ou si vous essayez de libérer de la mémoire plus d'une fois, ce sont également des bugs méchants.

En ce qui concerne les détails de bas niveau, C ++ ne le spécifie pas - cela dépend du matériel. L'accès à la mémoire se fait par des pointeurs contenant une sorte d'adresse mémoire. Les adresses mémoire peuvent être des adresses physiques ou des adresses virtuelles. Vous ne verrez les adresses physiques que si vous travaillez sur un noyau de système d'exploitation ou si vous lisez un ancien code DOS qui fonctionnait en mode réel. Pour plus de détails, lisez la mémoire virtuelle , il y a beaucoup de bonnes ressources.

L’architecture x86 permet également d’adresser de la mémoire à l’aide de descripteurs de segment. C’est une véritable boîte de Pandore, qui n’a plus été utilisée depuis l’histoire de Win16, et si vous êtes chanceux, vous n’aurez jamais à vous en occuper.

En résumé, le modèle de mémoire C ++ consiste en ...

  • Une pile qui se développe vers le bas - c’est-à-dire que lorsque vous poussez un cadre de pile, le pointeur de pile a une valeur inférieure à ce qu’il était

  • Un tas qui augmente, c'est-à-dire que l'adresse de fin de la mémoire nouvellement allouée est plus grande qu'elle ne l'était avant. Vous allouez de la mémoire dans le tas à l'aide de malloc () ou new. S'il n'y a pas assez de mémoire disponible dans le tas, alors malloc (ou nouveau) appelle la fonction système brk () sbrk () pour augmenter la taille du tas. Si l'appel à brk () ou à sbrk () échoue, alors malloc ou new échoue avec une exception de mémoire insuffisante.

Vous ne devriez jamais avoir à vous soucier de savoir si la pile ou le tas grossit ou monte et, dans certains systèmes, ils peuvent fonctionner en sens inverse. Considérez simplement que la pile et le tas grandissent vers l'intérieur à partir des extrémités de l'espace d'adressage.

  • Un allocateur de mémoire, malloc, qui alloue de la mémoire en octets 8 bits. Nouveau alloue également de la mémoire, mais la quantité de mémoire allouée dépend de la taille de l’objet en cours de création.

  • Espace texte contenant le code exécutable. Le texte réside sous le tas. Vous ne pouvez pas modifier l'espace de texte pendant l'exécution

Un programme peut avoir d'autres sections à usage particulier sous le texte.

Vous pouvez voir comment un programme est organisé de manière statique (avant son chargement) à l'aide de objdump sur les systèmes linux.

J'ai remarqué que, même si vous ne l'avez pas mentionné dans votre question, "concomitance". est l'un des mots-clés que vous avez assignés à cette question. Les systèmes de threads utilisent un espace supplémentaire sur le thread pour chaque thread, puis gèrent le pointeur de pile pour basculer entre les threads.

Il y a beaucoup plus de détails, dont beaucoup sont spécifiques au matériel, systèmes d’exploitation ou systèmes de threads particuliers, mais c’est l’idée essentielle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top