Qu’est-ce que la copie sur écriture?

J’aimerais savoir ce qu’est la copie sur écriture et dans quel cas est-elle utilisée? Le terme “tableau de copie sur écriture” est mentionné à plusieurs resockets dans les didacticiels de Sun JDK, mais je n’ai pas compris ce que cela signifiait.

J’allais écrire ma propre explication mais cet article de Wikipedia résume bien la situation.

Voici le concept de base:

La copie sur écriture (parfois appelée “COW”) est une stratégie d’optimisation utilisée dans la programmation informatique. L’idée fondamentale est que si plusieurs appelants demandent des ressources qui ne peuvent pas être distinguées au départ, vous pouvez leur donner des pointeurs vers la même ressource. Cette fonction peut être maintenue jusqu’à ce qu’un appelant essaie de modifier sa “copie” de la ressource. À ce stade, une copie privée réelle est créée pour empêcher que les modifications ne soient visibles par tout le monde. Tout cela se passe de manière transparente pour les appelants. Le principal avantage est que si un appelant ne modifie jamais, aucune copie privée ne doit être créée.

Voici aussi une application d’un usage commun de COW:

Le concept COW est également utilisé pour la maintenance des instantanés instantanés sur des serveurs de firebase database tels que Microsoft SQL Server 2005. Les instantanés instantanés conservent une vue statique d’une firebase database en stockant une copie de pré-modification des données. Les instantanés instantanés sont utilisés pour tester des utilisations ou des rapports dépendant du moment et ne doivent pas être utilisés pour remplacer les sauvegardes.

“Copier sur écriture” signifie plus ou moins ce à quoi cela ressemble: tout le monde a une seule copie partagée des mêmes données jusqu’à ce qu’il soit écrit , puis une copie est faite. Habituellement, la copie sur écriture est utilisée pour résoudre les problèmes de concurrence. Dans ZFS, par exemple, les blocs de données sur le disque reçoivent une copie sur écriture; tant qu’il n’y a pas de changement, vous conservez les blocs d’origine; un changement a seulement changé les blocs affectés. Cela signifie que le nombre minimum de nouveaux blocs est alloué.

Ces modifications sont généralement implémentées pour être transactionnelles , c’est-à-dire qu’elles ont les propriétés ACID. Cela élimine certains problèmes de simultanéité, car alors vous êtes assuré que toutes les mises à jour sont atomiques.

Pour donner un autre exemple, Mercurial utilise la copie sur écriture pour faire du clonage des référentiels locaux une opération vraiment “bon marché”.

Le principe est le même que les autres exemples, sauf que vous parlez de fichiers physiques plutôt que d’objects en mémoire. Au départ, un clone n’est pas un doublon mais un lien vers l’original. Lorsque vous modifiez des fichiers dans le clone, des copies sont écrites pour représenter la nouvelle version.

Je ne répéterai pas la même réponse sur Copy-on-Write. Je pense que la réponse d’Andrew et la réponse de Charlie ont déjà été très claire. Je vais vous donner un exemple du monde du système d’exploitation, simplement pour mentionner à quel point ce concept est utilisé.

Nous pouvons utiliser fork() ou vfork() pour créer un nouveau processus. vfork suit le concept de copie sur écriture. Par exemple, le processus enfant créé par vfork partagera le segment de données et de code avec le processus parent. Cela accélère le temps de frappe. Il est prévu d’utiliser vfork si vous effectuez exec suivi par vfork. Ainsi, vfork créera le processus fils qui partagera les données et le segment de code avec son parent, mais lorsque nous appelons exec, il chargera l’image d’un nouvel exécutable dans l’espace d’adressage du processus enfant.

Il est également utilisé dans Ruby ‘Enterprise Edition’ pour économiser de la mémoire.

J’ai trouvé ce bon article sur zval en PHP, qui mentionnait également COW:

Copy On Write (abrégé en «COW») est une astuce conçue pour économiser de la mémoire. Il est utilisé plus généralement en génie logiciel. Cela signifie que PHP va copier la mémoire (ou allouer une nouvelle région de mémoire) lorsque vous écrivez dans un symbole, si celui-ci pointe déjà vers un zval.