Copy-on-write

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Copy-on-write (COW) je v programování technika optimalizace a správy dat,[1] která při kopírování (nezměněných) dat nevede ihned k jejich duplikaci (v paměti, na disku atp.), nýbrž je duplikace odložena na později (ke zkopírování dochází až v okamžiku první změny). Za cenu malého zvýšení režie (pro evidenci úseků dat sdílených mezi originálem a kopií) je možné dosáhnout významné úspory systémových prostředků určených pro uložení dat. COW se používá při vzniku nových procesů (např. systémové volání fork() v unixových systémech, duplikaci virtuálních strojů, vytváření snapshotů u souborových systémů a podobně).

Charakteristika[editovat | editovat zdroj]

Copy-on-write se někdy označuje jako „implicitní sdílení“[2] nebo stínování.[3]

Princip spočívá v tom, že v okamžiku, kdy je vydán příkaz k pořízení kopie dat, se ve skutečnosti fyzická kopie nevytvoří, a aplikaci je předán toliko jiný odkaz na již existující data. Skutečná kopie je vytvořena teprve ve chvíli, kdy jedna z aplikací sdílejících společnou kopii vydá pokyn k zápisu dat.

Tak je podstatně zkrácen čas k „vytvoření kopie“, ale zároveň nehrozí, že by došlo k problémům se zápisem na stejné místo, protože obě dvě kopie používají stejná fyzická data jen tak dlouho, dokud je jejich shoda zaručena prostým faktem, že je od doby, kdy byly shodné, nikdo neměnil.

Postup copy-on-write se používá například v implementaci systémového volání fork na unixových systémech (které vytváří identickou kopii procesu), nebo v operaci snapshot v GoogleFS.

Podobnou techniku kopírování, ovšem pro proměnné, používají některé skriptovací jazyky, např. PHP.

Reference[editovat | editovat zdroj]

  1. Bovet, Daniel Pierre (2002-01-01). Understanding the Linux Kernel(in en). "O'Reilly Media, Inc.", 295. ISBN 9780596002138. 
  2. Implicit Sharing [online]. [cit. 2016-08-04]. [1]. (anglicky) 
  3.  "B-trees, shadowing, and clones"(1 February 2008). ACM Transactions on Storage 3 (4). doi:10.1145/1326542.1326544.