Что такое копирование на запись?


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

6 83

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.