Re: Catalyst: увеличиваем скорость реакции

Alexandr Ciornii alexchorny at gmail.com
Mon Sep 13 15:00:08 PDT 2010


14 сентября 2010 г. 0:18 пользователь Sergeev Serge <simne at yandex.ru> написал:
> 13.09.10, 23:40, "Alexandr Ciornii" <alexchorny at gmail.com>:
>> 13 сентября 2010 г. 22:30 пользователь Ivan Иван  написал:
>>
>>  >>  Как я написал раньше, fork - это не копирование. Память помечается как
>>  >>  используемая несколькими процессами. fork был специально так
>>  >>  оптимизирован. В частности, system() работает через fork().
>>  >>
>>  >
>>  > Тут вот, можно поподробнее. Я думал всегда, что идёт всё же копирование скопа. И, для threads, в отличии от классического fork можно указать совместно используемые переменные (= память). Если форк тупо помечает память, то при изменении переменных, это бы видели остальные чилды. Что как бэ не так. Значит ссылки на переменные - откопированны, а не просто помеченны.
>>
>>  Страница памяти (не вся память занятая процессом, а какой-то небольшой
>>  кусок) копируется только при модификации. Поэтому и называется COW -
>>  copy-on-write. Техника широко применяется не только в Unix fork() но и
>>  в самом Perl невидимо для пользователя.
>>
>>  http://en.wikipedia.org/wiki/Copy-on-write
>
> Думаю что вы путаете.
> То есть да, сам интерпретатор Перл конечно разделяется между несколькими процессами - потому что это тот случай, когда система может однозначно определить что эти данные неизменяемые - в исполняемых файлах форматов exe и elf действительно есть пометки, указывающие что данный код неизменяемый.

fork() делает не Perl. Его делает операционная система. Perl просто
вызывает fork() из C. fork() помечает ВСЮ область занятую программой и
ее данными как заблокированную для записи. Эта память разделяется
обоими процессами. При любой попытке записи происходит копирование
соответствующей страницы памяти. Блокировка записи выполняется
процессором, а копирование - ОС по сигналу процессора.

Все это выполняется для людой программы и любых данных. ОС нет
никакого дела что данная программа - интерпретатор Perl.

> Но сами данные не могут разделяться без специальной поддержки при написании интерпретатора, потому что например у каждого процесса интерпретатора Перл они генерятся с нуля и могут "в зависимости от погоды в Африке" каждый раз построить разное дерево.

fork() - это не новый запуск, это клонирование всего, поэтому все
одинаковое. Просто копия "ленивая", поэтому разделение происходит по
необходимости.

Из http://perldoc.perl.org/functions/fork.html
On most systems supporting fork(), great care has gone into making it
extremely efficient (for example, using copy-on-write technology on
data pages), making it the dominant paradigm for multitasking over the
last few decades.

-- 
Alexandr Ciornii, http://chorny.net


More information about the Kiev-pm mailing list