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

Je voudrais savoir ce qu'est la copie sur écriture et à quoi elle sert? Le terme 'copy-on-write array' est mentionné plusieurs fois dans les tutoriels Sun JDK mais je ne comprenais pas ce que cela signifiait.

83
demandé sur hhafez 2009-03-10 07:27:26

6 réponses

J'allais écrire ma propre explication, mais cet article de Wikipédia assez bien, il résume.

Ici est le concept de base:

Copy-on-write (parfois appelé "COW") est une stratégie d'optimisation utilisée en programmation informatique. L'idée fondamentale est que si plusieurs appelants demandent des ressources qui sont initialement indiscernables, vous pouvez leur donner des pointeurs vers la même ressource. Cette fonction peut être maintenue jusqu'à ce qu'un appelant tente de modifiez sa "copie" de la ressource, à quel point une véritable copie privée est créée pour éviter que les modifications ne deviennent visibles pour tout le monde. Tout cela se passe de manière transparente aux appelants. Le principal avantage est que si un appelant ne fait jamais de modifications, aucune copie privée n'a jamais besoin d'être créée.

Ici Aussi, est une application d'un usage commun de la VACHE:

Le concept COW est également utilisé dans la maintenance d'instantanés instantanés sur des serveurs de bases de données comme Microsoft SQL Server 2005. Les instantanés instantanés conservent une vue statique d'une base de données en stockant une copie de pré-modification des données lorsque les données sous-jacentes sont mises à jour. 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.

98
répondu Andrew Hare 2009-03-10 04:29:57

"copier en écriture" signifie plus ou moins à quoi cela ressemble: tout le monde a une seule copie partagée des mêmes données jusqu'à ce qu'elle soit écrite, puis une copie est faite. Généralement, copie sur écriture est utilisée pour résoudre la simultanéité sortes de problèmes. Dans ZFS, par exemple, les blocs de données sur le disque sont alloués copie sur écriture; tant qu'il n'y a pas de modifications, vous conservez les blocs d'origine; un changement a changé seulement les blocs affectés. Cela signifie que le nombre minimum de nouveaux blocs sont alloués.

Ces les changements sont également généralement implémentés pour être transactionnel , c'est-à-dire qu'ils ont les propriétés acides. Cela élimine certains problèmes de concurrence, car vous êtes assuré que toutes les mises à jour sont atomiques.

42
répondu Charlie Martin 2009-03-10 04:32:17

Je ne répéterai pas la même réponse sur Copie sur écriture. Je pense que la réponse D'Andrew et la réponse de Charlie ont déjà été très claires. Je vais vous donner un exemple de OS world, juste pour mentionner à quel point ce concept est utilisé.

On peut 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 les données et le segment de code avec le processus parent. Cela accélère le temps de fourche. Il est prévu d'utiliser vfork si vous effectuez exec suivi de vfork. Ainsi, vfork va créer le processus enfant qui partagera les données et le segment de code avec son parent, mais quand nous appelons exec, il chargera l'image d'un nouvel exécutable dans l'espace d'adressage du processus enfant.

7
répondu Shamik 2018-02-04 10:35:17

Juste pour fournir un autre exemple, Mercurial utilise copy-on-write pour faire du clonage des dépôts locaux une opération vraiment "bon marché".

Le principe est le même que les autres exemples, sauf que vous parlez de fichiers physiques au lieu d'objets en mémoire. Initialement, un clone n'est pas un duplicata mais un lien dur vers l'original. Lorsque vous modifiez des fichiers dans le clone, des copies sont écrites pour représenter la nouvelle version.

6
répondu harpo 2010-09-24 05:08:41

Il est également utilisé dans Ruby 'Enterprise Edition' comme un moyen efficace d'économiser de la mémoire.

1
répondu Chris 2009-03-10 05:24:08

J'ai trouvé CE bon article sur zval en PHP, qui mentionnait aussi la vache:

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 pointait déjà vers un zval.

1
répondu Amir Shabani 2016-10-24 06:36:48