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

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

Ответ 1

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

Вот базовая концепция:

Copy-on-write (иногда называемая "COW" ) - это стратегия оптимизации, используемая в компьютерном программировании. Основная идея заключается в том, что если несколько вызывающих абонентов запрашивают ресурсы, которые изначально неразличимы, вы можете дать им указатели на один и тот же ресурс. Эта функция может поддерживаться до тех пор, пока вызывающий объект не попытается изменить свою "копию" ресурса, после чего создается подлинная личная копия, чтобы предотвратить изменение видимости для всех остальных. Все это происходит прозрачно для вызывающих. Основное преимущество заключается в том, что если вызывающий абонент никогда не вносит никаких изменений, личная копия никогда не создается.

Также здесь применяется общее использование COW:

Концепция COW также используется для обслуживания мгновенного моментального снимка на серверах баз данных, таких как Microsoft SQL Server 2005. Мгновенные снимки сохраняют статическое представление базы данных, сохраняя копию данных предварительной модификации при обновлении данных подкласса. Мгновенные снимки используются для тестирования использования или зависящих от моментов отчетов и не должны использоваться для замены резервных копий.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Он также используется в Ruby 'Enterprise Edition' в качестве аккуратного способа сохранения памяти.

Ответ 7

Хорошим примером является Git, который использует стратегию для хранения больших двоичных объектов. Почему он использует хэши? Отчасти потому, что их легче выполнять с разницей, но также потому, что упрощает оптимизацию стратегии COW. Когда вы делаете новый коммит с несколькими изменениями файлов, подавляющее большинство объектов и деревьев не изменится. Следовательно, фиксация с помощью различных указателей, сделанных из хэшей, будет ссылаться на группу объектов, которые уже существуют, в результате чего пространство для хранения, необходимое для хранения всей истории, будет значительно меньше.