Mémoire partagée dans le multitraitement : démêler la copie sur écriture et le comptage de références
Contexte
Dans le monde du multitraitement, le partage de données entre processus pose une question cruciale : si plusieurs processus accèdent à la même mémoire physique ou en gèrent des copies. Le concept de copie sur écriture sous Linux et le comptage de références jouent un rôle important dans la détermination de l'utilisation de la mémoire de tels processus.
Aperçu du problème
Dans un scénario multitraitement , la question se pose de savoir si trois grandes listes (une contenant des tableaux de bits et les autres contenant des tableaux d'entiers) seront partagées entre les sous-processus ou copiées pour chacun. Les sous-processus nécessitent uniquement un accès en lecture aux listes, mais la grande taille des structures de données soulève des inquiétudes quant à la consommation de mémoire.
Copie sur écriture sous Linux
Linux utilise une optimisation de la mémoire par copie sur écriture. Généralement, lors de la création d'une copie d'un objet, la nouvelle copie partage les mêmes pages de mémoire physique que l'original. Toute modification apportée à l'une de ces pages est d'abord copiée dans une nouvelle page exclusive, garantissant que toute modification ultérieure n'affectera qu'une seule entité. Cette optimisation réduit l'utilisation de la mémoire et la corruption potentielle des données.
Comptage de références
En Python, chaque objet a un décompte de références, qui suit le nombre de variables qui le référencent. Lorsque le nombre de références atteint zéro, l'objet est supprimé par le garbage collector.
Cependant, dans le cas du multitraitement, chaque sous-processus crée sa propre variable référençant la liste partagée, augmentant ainsi le nombre de références. Cela peut conduire à la copie de la liste entière pour chaque sous-processus, augmentant considérablement l'utilisation de la mémoire.
L'énigme
Malgré le mécanisme de copie sur écriture sous Linux , une idée fausse courante est que les listes seront partagées entre les sous-processus. Cependant, le comptage de références en Python introduit la possibilité de copier des objets entiers.
Solution : mémoire partagée avec Python 3.8.0
Heureusement, Python version 3.8.0 introduit la « vraie » mémoire partagée, fournissant un mécanisme permettant de créer une mémoire visible par plusieurs processus sans avoir besoin de copie. À l'aide du module multiprocessing.shared_memory, les développeurs peuvent allouer des blocs de mémoire partagée et créer des tableaux NumPy soutenus par ces blocs, permettant un partage efficace des données entre les processus.
Conclusion
Comprendre l'interaction entre la copie sur écriture et le comptage de références est crucial dans les scénarios de multitraitement. Bien que Linux optimise l'utilisation de la mémoire, le comptage de références peut toujours conduire à une copie excessive. Pour les grandes structures de données, l'utilisation de la « vraie » mémoire partagée introduite dans Python 3.8.0 offre une solution fiable pour un partage de données efficace sans les frais de copie.
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!