copy-on-write
Le copy-on-write ou copie Ă lâĂ©criture (souvent dĂ©signĂ© par son sigle anglais COW) est une stratĂ©gie d'optimisation utilisĂ©e en programmation informatique. L'idĂ©e fondamentale : si de multiples appelants demandent des ressources initialement impossibles Ă distinguer, vous pouvez leur donner des pointeurs vers la mĂȘme ressource. Cette fiction peut ĂȘtre maintenue jusqu'Ă ce qu'un appelant modifie sa « copie » de la ressource. Ă ce moment-lĂ , une copie privĂ©e est crĂ©Ă©e. Cela Ă©vite que le changement soit visible ailleurs. Ceci se produit de maniĂšre transparente pour les appelants. L'avantage principal est que si un appelant ne fait jamais de modifications, la copie privĂ©e n'est jamais crĂ©Ă©e.
L'utilisation principale du Copy-on-write est la mĂ©moire virtuelle de systĂšmes d'exploitation. Lorsqu'un processus crĂ©e une copie de lui-mĂȘme, les pages de la mĂ©moire qui doivent ĂȘtre modifiĂ©es soit par le processus soit par sa copie sont marquĂ©es copy-on-write. Lorsque le processus modifie une page mĂ©moire, le noyau du systĂšme d'exploitation intercepte l'opĂ©ration et copie la page mĂ©moire pour que les changements de la mĂ©moire d'un processus n'affectent pas celle d'un autre.
Une autre utilisation est la fonction calloc. Elle peut ĂȘtre implĂ©mentĂ©e en ayant une page de mĂ©moire vive remplie par des zĂ©ros. Quand la mĂ©moire est allouĂ©e, les pages retournĂ©es font toutes rĂ©fĂ©rence Ă la page de zĂ©ros et sont marquĂ©es copy-on-write. De cette façon, la quantitĂ© de mĂ©moire vive allouĂ©e pour le processus n'augmente pas tant que les donnĂ©es ne sont pas Ă©crites dans le tampon retournĂ© par calloc. Typiquement, cela n'est fait que pour les allocations mĂ©moire importantes.
Le Copy-on-write peut ĂȘtre implĂ©mentĂ© en disant Ă la MMU que certaines pages dans l'espace d'adresses du processus sont en lecture seule. Quand des donnĂ©es sont Ă©crites dans ces pages, la MMU lĂšve une exception qui est gĂ©rĂ©e par le noyau. Celui-ci alloue de la mĂ©moire vive et fait que la page Ă©crite corresponde Ă ce nouvel endroit de la mĂ©moire vive.
L'utilisation frugale de la mĂ©moire est un avantage majeur du COW. Puisque l'utilisation de la mĂ©moire vive ne s'accroĂźt que quand des donnĂ©es sont stockĂ©es, des tables de hachage trĂšs efficaces peuvent ĂȘtre implĂ©mentĂ©es. Elles utilisent Ă peine plus de mĂ©moire que les objets qu'elles contiennent. NĂ©anmoins, de tels programmes risquent de tomber Ă court d'espace de mĂ©moire virtuelle. Les pages virtuelles non utilisĂ©es par la table de hachage ne peuvent pas ĂȘtre utilisĂ©es par d'autres parties du programme. Le principal problĂšme du COW au niveau du noyau est la complexitĂ© qu'il ajoute, mais les soucis sont similaires Ă ceux levĂ©s par des problĂ©matiques plus basiques de la mĂ©moire virtuelle comme paginer vers le disque. Quand le noyau Ă©crit ces pages, il doit les copier comme si elles Ă©taient marquĂ©es copy-on-write.
Le COW peut ĂȘtre utilisĂ© en dehors du noyau, dans des bibliothĂšques logicielles, du logiciel applicatif ou systĂšme. La classe string
fournie par la Standard Template Library de C++ a Ă©tĂ© conçue pour supporter des implĂ©mentations COW. Un des risques du COW dans ces contextes provient du code avec plusieurs processus lĂ©gers oĂč des verrous additionnels sont requis pour les objets dans diffĂ©rents processus lĂ©gers pour qu'ils partagent la mĂȘme reprĂ©sentation. La complexitĂ© d'implĂ©mentation induite peut annuler les bĂ©nĂ©fices supposĂ©s de la technique COW.
Illustration de la technique de COW dans la STL C++
std::string x("Hello");
std::string y = x; // x et y utilisent le mĂȘme tampon
y += ", World!"; // maintenant y utilise un tampon différent
// x continue Ă utiliser le mĂȘme buffer
Les logiciels de virtualisation/Ă©mulation tels que Bochs, QEMU ou UML utilisent le COW pour le stockage virtuel sur disque. Cela permet une grande rĂ©duction de l'espace disque requis quand de multiples machines virtuelles sont fondĂ©es sur la mĂȘme image disque. De plus les performances sont accrues car les lectures sur le disque peuvent ĂȘtre cachĂ©es en RAM et les lectures suivantes pour les autres machines virtuelles peuvent ĂȘtre servies Ă partir du cache.
Voir aussi
Liens externes
- (en)
Ext3 Copy-on-write filesystemLien mort, lien archive mort Ă©galement. - (en) ext3cow sur Freecode