Вся ли память, помеченная как копируемая при записи, копируется после одного изменения одного фрагмента данных? - PullRequest
4 голосов
/ 19 января 2011

Мой вопрос, возможно, плохо сформулирован и проистекает из моего любительского понимания управления памятью.

Моя проблема заключается в следующем: у меня есть Perl-скрипт, который разветвляется много раз.Как я понял из страницы ветки в perldoc, копирование при записи осуществляется.Затем каждый из детей вызывает system(), снова разветвляясь, чтобы вызвать внешнюю программу.Данные из внешней программы считываются обратно в дочерний процесс и выгружаются в виде сохраняемого файла, который должен быть собран и обработан родителем после того, как все дочерние объекты завершены.

Меня беспокоит моя воспринимаемая изменчивость этой ситуации.Подумайте, что я вижу в своем наихудшем сценарии: для каждого из детей, как только поступают новые данные, вся память копирования при записи становится, ну, в общем, копируемой.Если это так, я собираюсь быстро столкнуться с проблемами памяти после создания нескольких вилок.

Но в качестве альтернативы, копирование-при-записи копирует только самый маленький кусок памяти, который содержит необходимые данные?Тогда что это за кванты памяти?Как устанавливается его размер?

Я не уверен, зависит ли специфика того, о чем я спрашиваю, от языка или какого-либо процесса более низкого уровня.

Ответы [ 2 ]

6 голосов
/ 19 января 2011

Да, разветвление увеличит вашу память.Если это проблема, используйте модуль типа Parallel::ProcManager или Forks::Super, который может регулировать количество активных фоновых процессов.Ограничение количества активных вилок также является хорошей идеей, когда ваши процессы связаны с процессором, вводом-выводом или могут чрезмерно использовать любые другие ограниченные ресурсы на вашем компьютере.

use Forks::Super MAX_PROC => 10, ON_BUSY => block;

...
$pid = fork();        # blocks if there are already 10 child processes
...                   # unblocks when one of the children finishes
6 голосов
/ 19 января 2011

Память организована по страницам, обычно по 4 КБ каждая (это может быть установлено на разные значения и зависит от оборудования, но это норма для платформ Intel со стандартными операционными системами). Когда дочерний процесс записывает на страницу копирования при записи, он будет скопирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...