Копирование при записи
Копирование при записи ( COW ), иногда называемое неявным общим доступом. [1] или слежка , [2] это метод управления ресурсами , используемый в компьютерном программировании для эффективной реализации операции «дублирования» или «копирования» изменяемых ресурсов. [3] (чаще всего страницы памяти, сектора хранения, файлы и структуры данных).
В управлении виртуальной памятью
[ редактировать ]Копирование при записи находит свое основное применение в операционных системах , разделяющих физическую память компьютеров, на которых запущено несколько процессов , в реализации системного вызова fork() . Обычно новый процесс не изменяет память и немедленно запускает новый процесс, полностью заменяя адресное пространство. Было бы потрачено время и память процессора, чтобы скопировать всю память старого процесса во время разветвления только для того, чтобы немедленно удалить копию. [ нужна ссылка ]
Копирование при записи можно эффективно реализовать с помощью таблицы страниц , помечая определенные страницы памяти как доступные только для чтения и ведя подсчет количества ссылок на страницу. операционной системы Когда данные записываются на эти страницы, ядро перехватывает попытку записи и выделяет новую физическую страницу, инициализированную данными копирования при записи, хотя выделение можно пропустить, если имеется только одна ссылка. Затем ядро обновляет таблицу страниц новой (доступной для записи) страницей, уменьшает количество ссылок и выполняет запись. Новое распределение гарантирует, что изменения в памяти одного процесса не будут видны в памяти другого. [ нужна ссылка ]
Метод копирования при записи можно расширить для поддержки эффективного распределения памяти , сохраняя одну страницу физической памяти заполненной нулями. Когда память выделяется, все возвращаемые страницы ссылаются на страницу нулей и все помечены как копирование при записи. Таким образом, физическая память не выделяется для процесса до тех пор, пока не будут записаны данные, что позволяет процессам резервировать больше виртуальной памяти, чем физической, и экономно использовать ее, рискуя исчерпать виртуальное адресное пространство. Комбинированный алгоритм аналогичен пейджинговой связи по требованию . [3]
Страницы копирования при записи также используются в Linux ядра функции слияния страниц . [4]
В программном обеспечении
[ редактировать ]Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( октябрь 2017 г. ) |
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]
См. также
[ редактировать ]- Выделение при сбросе
- Dirty COW — уязвимость компьютерной безопасности ядра Linux.
- Модель наилегчайшего веса
- Управление памятью
- Постоянная структура данных
- Выравнивание износа
Ссылки
[ редактировать ]- ^ «Неявное разделение» . Qt-проект . Проверено 10 ноября 2023 г.
- ^ Роде, Охад (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 г.
- ^ Jump up to: а б Бове, Даниэль Пьер; Чезати, Марко (1 января 2002 г.). Понимание ядра Linux . О'Рейли Медиа. п. 295. ИСБН 9780596002138 . Проверено 10 ноября 2023 г.
- ^ Аббас, Али. «Процесс слияния одной страницы ядра» . alouche.net . Архивировано из оригинала 8 августа 2016 года . Проверено 10 ноября 2023 г.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка ) - ^ Мейерс, Скотт (2012). Эффективный STL . Аддисон-Уэсли. стр. 64–65. ISBN 9780132979184 .
- ^ «Модификации параллельной обработки базовой строки» . Открытые стандарты . Проверено 10 ноября 2023 г.
- ^ Паули, Жюльен; Феррара, Энтони; Попов, Никита (2013). «Управление памятью» . PhpInternalsBook.com . Проверено 10 ноября 2023 г.
- ^ «Потоки и неявно разделяемые классы» . Qt-проект . Проверено 10 ноября 2023 г.
- ^ Касампалис, Сакис (2010). «Анализ производительности файловых систем на основе копирования при записи и реализация» (PDF) . п. 19 . Проверено 10 ноября 2023 г.
- ^ Чиен, Тим. «Снимки НЕ являются резервными копиями» . Oracle.com . Оракул . Проверено 10 ноября 2023 г.