stringtranslate.com

Копирование при записи

Копирование при записи ( 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]

Смотрите также

Ссылки

  1. ^ "Implicit Sharing". Qt Project . Архивировано из оригинала 8 февраля 2024 г. Получено 10 ноября 2023 г.
  2. ^ Rodeh, Ohad (1 февраля 2008 г.). "B-деревья, затенение и клоны" (PDF) . ACM Transactions on Storage . 3 (4): 1. CiteSeerX 10.1.1.161.6863 . doi :10.1145/1326542.1326544. S2CID  207166167. Архивировано из оригинала (PDF) 2 января 2017 г. . Получено 10 ноября 2023 г. . 
  3. ^ abc Bovet, Daniel Pierre; Cesati, Marco (1 января 2002 г.). Understanding the Linux Kernel. O'Reilly Media. стр. 295. ISBN 9780596002138. Архивировано из оригинала 15 сентября 2024 . Получено 10 ноября 2023 .
  4. ^ Зильбершатц, Абрахам; Гэлвин, Питер Б.; Ганье, Грег (2018). Концепции операционных систем (10-е изд.). Wiley. С. 120–123. ISBN 978-1119456339.
  5. ^ Аббас, Али. «Процесс слияния ядра Samepage». alouche.net . Архивировано из оригинала 8 августа 2016 г. Получено 10 ноября 2023 г.{{cite web}}: CS1 maint: неподходящий URL ( ссылка )
  6. ^ Мейерс, Скотт (2012). Эффективный STL . Addison-Wesley. стр. 64–65. ISBN 9780132979184.
  7. ^ "Concurrency Modifications to Basic String". Open Standards . Архивировано из оригинала 10 ноября 2023 г. Получено 10 ноября 2023 г.
  8. ^ Паули, Жюльен; Феррара, Энтони; Попов, Никита (2013). «Управление памятью». PhpInternalsBook.com . Архивировано из оригинала 10 ноября 2023 г. . Получено 10 ноября 2023 г. .
  9. ^ "Threads and Implicitly Shared Classes". Qt Project . Архивировано из оригинала 3 декабря 2023 г. Получено 10 ноября 2023 г.
  10. ^ Касампалис, Сакис (2010). «Анализ и реализация производительности файловых систем на основе копирования при записи» (PDF) . стр. 19. Архивировано (PDF) из оригинала 5 мая 2024 г. . Получено 10 ноября 2023 г. .
  11. ^ Чиен, Тим. «Снимки — это НЕ резервные копии». Oracle.com . Oracle. Архивировано из оригинала 10 ноября 2023 г. . Получено 10 ноября 2023 г. .