wake-up-neo.com

Was ist Copy-on-Write?

Ich möchte wissen, was Copy-on-Write ist und wofür es verwendet wird. Der Begriff "Copy-on-Write-Array" wird in den Sun JDK-Tutorials mehrmals erwähnt, aber ich habe nicht verstanden, was er bedeutet.

103
hhafez

Ich wollte meine eigene Erklärung aufschreiben, aber dieser Wikipedia-Artikel fasst es so ziemlich zusammen.

Hier ist das Grundkonzept:

Copy-on-Write (manchmal als "COW" bezeichnet) ist eine Optimierungsstrategie, die bei der Computerprogrammierung verwendet wird. Die Grundidee ist, dass, wenn mehrere Anrufer nach Ressourcen fragen, die anfangs nicht zu unterscheiden sind, Sie ihnen Zeiger auf dieselbe Ressource geben können. Diese Funktion kann beibehalten werden, bis ein Anrufer versucht, seine "Kopie" der Ressource zu ändern. Zu diesem Zeitpunkt wird eine echte private Kopie erstellt, um zu verhindern, dass die Änderungen für alle anderen sichtbar werden. All dies geschieht transparent für die Anrufer. Der Hauptvorteil ist, dass, wenn ein Anrufer niemals Änderungen vornimmt, niemals eine private Kopie erstellt werden muss.

Auch hier ist eine Anwendung einer allgemeinen Verwendung von COW:

Das COW-Konzept wird auch für die Wartung von Sofort-Snapshots auf Datenbankservern wie Microsoft SQL Server 2005 verwendet. Sofort-Snapshots behalten eine statische Ansicht einer Datenbank bei, indem sie eine Kopie der Daten vor der Änderung speichern, wenn zugrunde liegende Daten aktualisiert werden. Instant Snapshots werden zum Testen von Verwendungen oder für momentabhängige Berichte verwendet und sollten nicht zum Ersetzen von Sicherungen verwendet werden.

119
Andrew Hare

"Beim Schreiben kopieren" bedeutet mehr oder weniger, wie es sich anhört: Jeder hat eine gemeinsame Kopie derselben Daten bis sie geschrieben sind, und dann wird eine Kopie erstellt. Normalerweise wird Copy-on-Write verwendet, um Probleme zu lösen, die gleichzeitig auftreten. In ZFS werden beispielsweise Datenblöcke auf der Festplatte beim Schreiben kopiert. Solange keine Änderungen vorgenommen wurden, behalten Sie die ursprünglichen Blöcke bei. Eine Änderung änderte nur die betroffenen Blöcke. Dies bedeutet, dass die minimale Anzahl neuer Blöcke zugewiesen wird.

Diese Änderungen werden normalerweise auch als Transaktions- implementiert, dh sie haben die ACID-Eigenschaften. Dadurch werden einige Probleme mit der Parallelität beseitigt, da sichergestellt ist, dass alle Aktualisierungen atomar sind.

51
Charlie Martin

Ich werde die gleiche Antwort bei Copy-on-Write nicht wiederholen. Ich denke Andrews Antwort und Charlies Antwort haben es bereits sehr deutlich gemacht. Ich werde Ihnen ein Beispiel aus der OS-Welt geben, um nur zu erwähnen, wie weit dieses Konzept verbreitet ist.

Wir können fork() oder vfork() verwenden, um einen neuen Prozess zu erstellen. vfork folgt dem Konzept des Copy-on-Write. Beispielsweise teilt der von vfork erstellte untergeordnete Prozess das Daten- und Codesegment mit dem übergeordneten Prozess. Dies beschleunigt die Gabelzeit. Es wird erwartet, dass Sie vfork verwenden, wenn Sie exec gefolgt von vfork ausführen. Vfork erstellt also den untergeordneten Prozess, der Daten und Codesegmente mit dem übergeordneten Prozess teilt. Wenn wir exec aufrufen, wird jedoch das Image einer neuen ausführbaren Datei im Adressraum des untergeordneten Prozesses geladen.

9
Shamik

Um nur ein weiteres Beispiel zu nennen: Mercurial verwendet Copy-on-Write um das Klonen lokaler Repositorys zu einem wirklich "billigen" Vorgang zu machen.

Das Prinzip ist dasselbe wie in den anderen Beispielen, außer dass es sich um physische Dateien handelt und nicht um Objekte im Speicher. Anfänglich ist ein Klon kein Duplikat, sondern ein fester Link zum Original. Wenn Sie Dateien im Klon ändern, werden Kopien geschrieben, um die neue Version darzustellen.

6
harpo

Ich fand this einen guten Artikel über zval in PHP, der auch COW erwähnte:

Copy On Write (abgekürzt als "COW") ist ein Trick, der entwickelt wurde, um Speicherplatz zu sparen. Es wird allgemeiner in der Softwareentwicklung verwendet. Dies bedeutet, dass PHP) den Speicher kopiert (oder einen neuen Speicherbereich zuweist), wenn Sie in ein Symbol schreiben, wenn dieses bereits auf ein zval zeigt.

2
Amir Shabani

Es wird auch in Ruby 'Enterprise Edition') verwendet, um ordentlich Speicherplatz zu sparen.

0
Chris