web-dev-qa-db-fra.com

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

Je voudrais savoir ce qu'est la copie sur écriture et à quoi sert-elle? Le terme 'tableau de copie sur écriture' est mentionné à plusieurs reprises dans les didacticiels JDK de Sun, mais je ne comprenais pas ce que cela signifiait.

103
hhafez

J'allais écrire ma propre explication mais cet article de Wikipedia le résume assez bien.

Voici le concept de base:

La copie sur écriture (parfois appelée "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 sur la même ressource. Cette fonction peut être maintenue jusqu'à ce qu'un appelant tente de modifier sa "copie" de la ressource. Une véritable copie privée est alors créée pour éviter que les modifications deviennent visibles par tout le monde. Tout cela se passe de manière transparente pour les appelants. Le principal avantage est que si un appelant n’apporte aucune modification, aucune copie privée n’a besoin d’être créée.

Voici également une application d'une utilisation courante de COW:

Le concept COW est également utilisé dans la maintenance des instantanés instantanés sur des serveurs de base de données tels que Microsoft SQL Server 2005. Les instantanés instantanés préservent une vue statique d'une base de données en stockant une copie des données de pré-modification lors de la mise à jour des données. Les instantanés instantanés sont utilisés pour tester des utilisations ou des rapports dépendants d'un moment et ne doivent pas être utilisés pour remplacer des sauvegardes.

119
Andrew Hare

"Copier à l'écriture" signifie plus ou moins ce que 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, la copie sur écriture est utilisée pour résoudre des problèmes de types d'accès simultanés. Dans ZFS, par exemple, les blocs de données sur disque se voient attribuer une copie sur écriture; tant qu'il n'y a pas de changement, vous conservez les blocs d'origine; une modification n'a modifié que les blocs affectés. Cela signifie que le nombre minimum de nouveaux blocs est alloué.

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

51
Charlie Martin

Je ne répéterai pas la même réponse en copie sur écriture. Je pense que réponse d'Andrew et réponse de Charlie l'ont déjà clairement indiqué. Je vais vous donner un exemple tiré du monde des systèmes d’exploitation, pour mentionner à quel point ce concept est largement 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 forgeage. Il est prévu d'utiliser vfork si vous exécutez exec suivi de vfork. Donc, vfork créera le processus enfant qui partagera les données et le segment de code avec son parent mais lorsque nous appellerons exec, il chargera l'image d'un nouvel exécutable dans l'espace d'adressage du processus enfant.

9
Shamik

Juste pour donner un autre exemple, Mercurial utilise la copie sur écriture pour faire du clonage des référentiels locaux une opération vraiment "économique".

Le principe est identique à celui des autres exemples, sauf que vous parlez de fichiers physiques au lieu d'objets en mémoire. Initialement, un clone n'est pas une copie 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
harpo

J'ai trouvé ceci bon article sur zval en PHP, qui mentionne aussi COW:

Copy On Write (en abrégé "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 mémoire)) lorsque vous écrivez sur un symbole, si celui-ci pointait déjà sur un zval.

2
Amir Shabani

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

0
Chris