Jump to content

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

(Перенаправлено из Копировать при записи )

Копирование при записи ( COW ), иногда называемое неявным общим доступом. [1] или слежка , [2] это метод управления ресурсами , используемый в компьютерном программировании для эффективной реализации операции «дублирования» или «копирования» изменяемых ресурсов. [3] (чаще всего страницы памяти, сектора хранения, файлы и структуры данных).

В управлении виртуальной памятью

[ редактировать ]

Копирование при записи находит свое основное применение в операционных системах , разделяющих физическую память компьютеров, на которых запущено несколько процессов , в реализации системного вызова fork() . Обычно новый процесс не изменяет память и немедленно запускает новый процесс, полностью заменяя адресное пространство. Было бы потрачено время и память процессора, чтобы скопировать всю память старого процесса во время разветвления только для того, чтобы немедленно удалить копию. [ нужна ссылка ]

Копирование при записи можно эффективно реализовать с помощью таблицы страниц , помечая определенные страницы памяти как доступные только для чтения и ведя подсчет количества ссылок на страницу. ​​операционной системы Когда данные записываются на эти страницы, ядро перехватывает попытку записи и выделяет новую физическую страницу, инициализированную данными копирования при записи, хотя выделение можно пропустить, если имеется только одна ссылка. Затем ядро ​​обновляет таблицу страниц новой (доступной для записи) страницей, уменьшает количество ссылок и выполняет запись. Новое распределение гарантирует, что изменения в памяти одного процесса не будут видны в памяти другого. [ нужна ссылка ]

Метод копирования при записи можно расширить для поддержки эффективного распределения памяти , сохраняя одну страницу физической памяти заполненной нулями. Когда память выделяется, все возвращаемые страницы ссылаются на страницу нулей и все помечены как копирование при записи. Таким образом, физическая память не выделяется для процесса до тех пор, пока не будут записаны данные, что позволяет процессам резервировать больше виртуальной памяти, чем физической, и экономно использовать ее, рискуя исчерпать виртуальное адресное пространство. Комбинированный алгоритм аналогичен пейджинговой связи по требованию . [3]

Страницы копирования при записи также используются в Linux ядра функции слияния страниц . [4]

В программном обеспечении

[ редактировать ]

COW также используется в библиотеке , приложении и системном коде.

Строковый класс , предоставляемый стандартной библиотекой C++, был специально разработан для реализации копирования при записи в исходном стандарте C++98. [5] но не в новом стандарте C++11: [6]

std::string x("Hello");

std::string y = x;  // x and y use the same buffer.

y += ", World!";    // Now y uses a different buffer; x still uses the same old buffer.

В языке программирования PHP все типы, кроме ссылок, реализуются методом копирования при записи. Например, строки и массивы передаются по ссылке, но при изменении они дублируются, если их счетчик ссылок не равен нулю. Это позволяет им действовать как типы значений без проблем с производительностью, связанных с копированием при назначении или созданием неизменяемых. [7]

В среде Qt многие типы копируются при записи («неявно разделяемые» в терминах Qt). Qt использует атомарные операции сравнения и замены для увеличения или уменьшения внутреннего счетчика ссылок. Поскольку копии дешевы, типы Qt часто могут безопасно использоваться несколькими потоками без необходимости использования механизмов блокировки, таких как мьютексы . Таким образом, преимущества COW действительны как в однопоточных, так и в многопоточных системах. [8]

В памяти компьютера

[ редактировать ]

COW также может использоваться в качестве основного механизма для моментальных снимков , например, предоставляемых управлением логическими томами , файловыми системами, такими как Btrfs , ZFS , ReFS и Bcachefs . [9] и серверы баз данных, такие как Microsoft SQL Server . Обычно в моментальных снимках хранятся только измененные данные и они хранятся близко к исходным, поэтому они представляют собой лишь слабую форму инкрементного резервного копирования и не могут заменить полную резервную копию . [10]

См. также

[ редактировать ]
  1. ^ «Неявное разделение» . Qt-проект . Проверено 10 ноября 2023 г.
  2. ^ Роде, Охад (1 февраля 2008 г.). «B-деревья, затенение и клоны» (PDF) . Транзакции ACM в хранилище . 3 (4): 1. CiteSeerX   10.1.1.161.6863 . дои : 10.1145/1326542.1326544 . S2CID   207166167 . Архивировано из оригинала (PDF) 2 января 2017 года . Проверено 10 ноября 2023 г.
  3. ^ Jump up to: а б Бове, Даниэль Пьер; Чезати, Марко (1 января 2002 г.). Понимание ядра Linux . О'Рейли Медиа. п. 295. ИСБН  9780596002138 . Проверено 10 ноября 2023 г.
  4. ^ Аббас, Али. «Процесс слияния одной страницы ядра» . alouche.net . Архивировано из оригинала 8 августа 2016 года . Проверено 10 ноября 2023 г. {{cite web}}: CS1 maint: неподходящий URL ( ссылка )
  5. ^ Мейерс, Скотт (2012). Эффективный STL . Аддисон-Уэсли. стр. 64–65. ISBN  9780132979184 .
  6. ^ «Модификации параллельной обработки базовой строки» . Открытые стандарты . Проверено 10 ноября 2023 г.
  7. ^ Паули, Жюльен; Феррара, Энтони; Попов, Никита (2013). «Управление памятью» . PhpInternalsBook.com . Проверено 10 ноября 2023 г.
  8. ^ «Потоки и неявно разделяемые классы» . Qt-проект . Проверено 10 ноября 2023 г.
  9. ^ Касампалис, Сакис (2010). «Анализ производительности файловых систем на основе копирования при записи и реализация» (PDF) . п. 19 . Проверено 10 ноября 2023 г.
  10. ^ Чиен, Тим. «Снимки НЕ являются резервными копиями» . Oracle.com . Оракул . Проверено 10 ноября 2023 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f432f0c0f2198e7c53090b89a9ac1e7e__1714127820
URL1:https://arc.ask3.ru/arc/aa/f4/7e/f432f0c0f2198e7c53090b89a9ac1e7e.html
Заголовок, (Title) документа по адресу, URL1:
Copy-on-write - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)