Копирование при записи ( COW ), также называемое неявным разделением [1] или затенением [2] , — это метод управления ресурсами [3], используемый в программировании для эффективного управления общими данными. Вместо того чтобы копировать данные сразу, когда их используют несколько программ, одни и те же данные передаются между программами до тех пор, пока одна из них не попытается их изменить. Если изменения не вносятся, частная копия не создается, что экономит ресурсы [3] . Копия создается только при необходимости, гарантируя, что каждая программа будет иметь свою собственную версию при внесении изменений. Этот метод обычно применяется к памяти, файлам и структурам данных.
Копирование при записи находит свое основное применение в операционных системах , разделяя физическую память компьютеров, работающих с несколькими процессами , в реализации системного вызова fork() . Обычно новый процесс не изменяет память и немедленно выполняет новый процесс, полностью заменяя адресное пространство. Это было бы пустой тратой процессорного времени и памяти для копирования всей памяти старого процесса во время fork только для того, чтобы немедленно отбросить копию. [4]
Копирование при записи может быть эффективно реализовано с использованием таблицы страниц , путем пометки определенных страниц памяти как доступных только для чтения и ведения подсчета количества ссылок на страницу. Когда данные записываются на эти страницы, ядро операционной системы перехватывает попытку записи и выделяет новую физическую страницу, инициализированную данными копирования при записи, хотя выделение может быть пропущено, если есть только одна ссылка. Затем ядро обновляет таблицу страниц новой (доступной для записи) страницей, уменьшает количество ссылок и выполняет запись. Новое выделение гарантирует, что изменение в памяти одного процесса не будет видно в другом. [ необходима цитата ]
Метод копирования при записи может быть расширен для поддержки эффективного выделения памяти путем сохранения одной страницы физической памяти заполненной нулями. Когда память выделяется, все возвращаемые страницы ссылаются на страницу нулей и все помечены как копирование при записи. Таким образом, физическая память не выделяется для процесса, пока данные не будут записаны, что позволяет процессам резервировать больше виртуальной памяти, чем физической, и использовать память нерегулярно, рискуя исчерпать виртуальное адресное пространство. Комбинированный алгоритм похож на подкачку по требованию . [3]
Страницы копирования при записи также используются в функции слияния тех же страниц ядра Linux . [ 5]
COW также используется в библиотечном , прикладном и системном коде.
Класс string , предоставляемый стандартной библиотекой C++, был специально разработан для реализации копирования при записи в первоначальном стандарте C++98 [6] , но не в более новом стандарте C++11: [7]
std :: string x ( "Привет" ); std :: string y = x ; // x и y используют один и тот же буфер. y += ", World!" ; // Теперь y использует другой буфер; x по-прежнему использует тот же старый буфер.
В языке программирования PHP все типы, кроме ссылок, реализованы как copy-on-write. Например, строки и массивы передаются по ссылке, но при изменении они дублируются, если имеют ненулевое количество ссылок. Это позволяет им действовать как типы значений без проблем с производительностью копирования при назначении или неизменяемости. [8]
В фреймворке Qt многие типы копируются при записи («неявно разделяются» в терминах Qt). Qt использует атомарные операции сравнения и обмена для увеличения или уменьшения внутреннего счетчика ссылок. Поскольку копии обходятся дешево, типы Qt часто могут безопасно использоваться несколькими потоками без необходимости использования механизмов блокировки, таких как мьютексы . Таким образом, преимущества COW действительны как в однопоточных, так и в многопоточных системах. [9]
COW используется в качестве базового механизма в таких файловых системах, как ZFS , Btrfs , ReFS и Bcachefs [10] , а также в управлении логическими томами и серверах баз данных, таких как Microsoft SQL Server .
В традиционных файловых системах изменения файлов перезаписывают исходные данные. С COW, когда вносятся изменения, создается новая версия файла, при этом оригинал остается нетронутым. Этот подход позволяет использовать такие функции, как моментальные снимки , которые фиксируют состояние файла в определенное время, не занимая много дополнительного места. Моментальные снимки обычно хранят только измененные данные и хранятся близко к оригиналу. Однако они считаются слабой формой инкрементного резервного копирования и не могут заменить полное резервное копирование. [11]
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка )