Вход:  Пароль:  
FreeSource: Технологии/CopyOnWrite ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |
Это старая версия Технологии/CopyOnWrite за 2016-11-18 10:06:44..

Copy On Write (копирование при записи)


В Linux, как и других UNIX-like операционных системах, широко используется функция fork (). Смысл её в том, что от вызвавшего её («материнского», «родительского», “parent”) процесса отделяется «дочерний» процесс («child”), который полностью наследует все данные материнского процесса (и не только их, но это уже отдельная тема).


Если при выполнении fork() мы скопируем данные одного процесса другому (как это произойдёт, например, в Windows), то мы во-первых потеряем время на копировании данных, а во-вторых память на данных, которые будут одинаковы у обоих процессов. При этом обычно лишь небольшое количество унаследованых данных дочерним процессом изменяется, а основной объём остаётся неизменным, то есть память на копирвание была потрачена впустую.


Для экономии памяти и времени используется механизм копирования при записи (Copy-On-Write). Суть этого механизма в том, что вместо копирования выполняетcя отображение (mapping) данных материнского процесса в адресное пространство дочернего процесса и запрещает обоим процессам запись в эту память.


При попытке записи в отображённые страницы любым из процессов сработает механизм защиты, он вызовет функцию-обработчик исключения, которая и скопирует эти данные в другую область памяти, которая будет теперь принадлежать только этому процессу, и в которую он будет иметь право записи. Большая задерка во время fork() заменяется на несколько меньших (в том числе меньших по сумме), возникающих в момент первой записи в каждую страницу общей памяти.


Таким образом копирование выполняется только если оно нужно, и тогда, когда оно нужно. В результате мы получаем и экономию памяти, и выигрыш в производительности. Редкая удача в программировании, не правда ли?


Смотри также: Memory Mapped Files, getpagesize(2), fork(2)


Ссылок на эту страницу нет



 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]