форумы  рассылка  download Перейти на новую версию сайта:
www.slackware.ru
Искать    где:    






    
slackware.ru > Программирование > Системное программирование > Copy On Write (COW) ID:324
 
2003-07-04 Andru
Copy On Write (COW)
Денис Смирнов
mithraen@freesource.info
15 Oct 2001

В линуксе очень широко используется Copy-On-Write механизм. Суть этого механизма в том, что если нам надо предоставить нескольким процессам доступ и на чтение, и на запись к одинаковым данным, но так, чтобы изменения внесенные одним процессом не оказывали влияния на другой, то мы делаем mapping (отображение) группы страниц памяти, содержащих эти данные, в адресное пространство всех этих процессов, но в режиме _read-only_. До первой попытки любого из процессов изменить эту область памяти все хорошо. Но вот к какой-то момент один из процессов попытался изменить данные в этой области данных. Что произойдет? Сработает механизм защиты, который вызовет функцию-обработчик исключения. Эта функция скопирует эти данные в другую область памяти, и сделает remapping на эту область памяти. Уже на эту область будут установлены права и на чтение, и на запись. Таким образом процесс получает свой личный участок памяти, в котором он делает все что хочет.

Звучит хорошо. Но для чего это может реально использоваться? В линуксе эта технология используется в первую очередь для реализации механизма fork(). В момент вызова функции fork() от материнского процесса отделяется "детеныш", который мало чем отличается от материнского, и полностью наследует все данные материнского. Представим себе, что материнский процесс предварительно для каких-то своих целей выделил себе, ну, скажем, 100Mb памяти. Ситуация в наше время вполне реальная. Что произойдет при вызове fork()? Если начать копировать все данные, то это займет много времени, причем чаще всего дочерний процесс либо вообще не будет изменять унаследованые данные, либо будет изменять минимальное их количество. Однако, в момент вызова fork() мы не можем сказать какие именно данные будут изменены, поэтому мы обязаны на все данные, на которые у родителя был доступ на чтение/запись дать такие же права дитю. И тут нас выручает copy-on-write - благодаря ему момент копирование откладывается до того времени, когда это копирование окажется действительно необходимым. Причем копироваться будут только отдельные страницы памяти. В результате мы получаем и экономию памяти, и выигрыш в скорости. Редкая удача в программировании, не правда ли?

See also: Memory Mapped Files
getpagesize(2)




оставить комментарий
Как Вы оцениваете эту статью? 
коментарии к статье

 развернуть комментарии (всего 0,персональных 0)