Что такое copy-on-write?

Я хотел бы знать, что такое copy-on-write и для чего он используется? Термин "массив копирования на запись" упоминается несколько раз в учебниках Sun JDK, но я не понял, что это значит.

6 ответов


Я собирался написать свое собственное объяснение, но эта статья в Википедии подведем итоги.


"копировать на запись" означает более или менее то, что это звучит: у каждого есть одна общая копия одних и тех же данных пока не будет написано, а затем делается копия. Обычно копирование при записи используется для решения проблем параллелизма. В ZFS, например, блоки данных на диске выделяются копией при записи; пока нет изменений, вы сохраняете исходные блоки; изменение изменило только затронутые блоки. Это означает, что минимальное количество новых блоков распределяемый.

эти изменения также обычно реализуются как транзакционные, т. е. они обладают свойствами кислоты. Это устраняет некоторые проблемы параллелизма, потому что тогда вы гарантируете, что все обновления являются атомарными.


Я не буду повторять тот же ответ на Copy-on-Write. Я думаю Эндрю и Чарли уже ясно. Я приведу вам пример из OS world, просто чтобы упомянуть, насколько широко используется эта концепция.

можно использовать fork() или vfork() для создания нового процесса. vfork придерживается концепции "копирования при записи". Например, дочерний процесс, созданный vfork, будет совместно использовать сегмент данных и кода с родительским процессом. Этот ускоряет время разветвления. Предполагается использовать vfork, если вы выполняете exec, за которым следует vfork. Таким образом, vfork создаст дочерний процесс, который будет делиться данными и сегментом кода со своим родителем, но когда мы вызовем exec, он загрузит образ нового исполняемого файла в адресном пространстве дочернего процесса.


чтобы привести еще один пример,Mercurial использует copy-on-write чтобы сделать клонирование локальных репозиториев действительно "дешевой" операцией.

принцип тот же, что и в других примерах, за исключением того, что вы говорите о физических файлах вместо объектов в памяти. Первоначально клон не является дубликатом, а ссылка к оригиналу. При изменении файлов в Клоне копии записываются для представления новой версии.


Он также используется в Ruby "Enterprise Edition" как аккуратный способ экономии памяти.


нашел этой хорошая статья о zval в PHP, в которой тоже упоминается корова:

копировать при записи (сокращенно "корова") - это трюк, предназначенный для сохранения памяти. Он используется в основном в программной инженерии. Это означает, что PHP будет копировать память (или выделять новую область памяти) при записи в символ, если этот символ уже указывал на zval.