Введение
Копирование при записи (COW), иногда называемое неявным разделением или теневым копированием, — это методика управления ресурсами, используемая в программировании для эффективной реализации операций "дублирования" или "копирования" изменяемых ресурсов (наиболее часто страниц памяти, секторов хранения, файлов и структур данных).
Copy on write (COW), sometimes referred to as implicit sharing or shadowing, is a resource management technique used in computer programming to efficiently implement a "duplicate" or "copy" operation on modifiable resources (most commonly memory pages, storage sectors, files, and data structures).
В управлении виртуальной памятью
Копирование при записи находит основное применение в операционных системах, обеспечивая совместное использование физической памяти компьютеров, работающих с несколькими процессами, при реализации системного вызова `fork`. Обычно новый процесс не изменяет память и сразу же начинает выполнять новый код, полностью заменяя адресное пространство. Копирование всей памяти старого процесса во время `fork` только для немедленного отбрасывания копии было бы неэффективной тратой процессорного времени и памяти. Копирование при записи может быть эффективно реализовано с использованием таблицы страниц, помечая определенные страницы памяти как доступные только для чтения и подсчитывая количество ссылок на каждую страницу. Когда данные записываются на эти страницы, ядро операционной системы перехватывает попытку записи и выделяет новую физическую страницу, инициализированную данными для копирования, хотя выделение можно пропустить, если существует только одна ссылка. Затем ядро обновляет таблицу страниц, указывая на новую (записываемую) страницу, уменьшает счетчик ссылок и выполняет запись. Такое новое выделение гарантирует, что изменение памяти одного процесса не будет видно другому. Техника копирования при записи может быть расширена для поддержки эффективного выделения памяти, поддерживая одну физическую страницу, заполненную нулями. При выделении памяти все возвращаемые страницы ссылаются на страницу с нулями и помечаются как копируемые при записи. Таким образом, физическая память не выделяется для процесса до тех пор, пока не будут записаны данные, что позволяет процессам резервировать больше виртуальной памяти, чем физической, и экономно использовать память, рискуя исчерпать виртуальное адресное пространство. Комбинированный алгоритм аналогичен подкачке по требованию.
В программном обеспечении
COW также используется в библиотечном, прикладном и системном коде.
В компьютерном хранилище
COW также может использоваться как базовый механизм для создания снимков, например, тех, что предоставляются системами управления логическими томами, файловыми системами, такими как Btrfs, ZFS, ReFS и Bcachefs, и серверами баз данных, такими как Microsoft SQL Server. Обычно снимки хранят только измененные данные и располагаются рядом с исходными, поэтому они представляют собой лишь слабую форму инкрементного резервного копирования и не могут заменить полное резервное копирование.