Когда родитель использует fork, дочерний процесс создается в непрерывном пространстве памяти?

826
ddmichael

При разветвлении копируется точное окружение родительского процесса. Распределяется ли это пространство в случайном пространстве в ОЗУ или родительский и дочерний процессы получают непрерывное пространство ОЗУ (например, элементы массива)?

0
Прочитайте всю свою справочную страницу, держу пари, что вы не обнаружите, что ребенок создан в таком непрерывном пространстве памяти. Так что тогда? uprego 10 лет назад 0
Я не думаю, что эта информация должна быть в справочной странице в любом случае. ddmichael 10 лет назад 0
Вам нужна операционная система, которая создает дочерние процессы рядом с родителями, когда это возможно? uprego 10 лет назад 0
Нет, мне нужно знать, если это общий случай из любопытства. Должен быть алгоритм для этого распределения. ddmichael 10 лет назад 0
Я попытаюсь (и вы могли бы сделать это тоже) взглянуть на текущую конкретную реализацию форка в Linux 3.13 и попытаться привести пример [очевидно], не применимый к другим ядрам. Между тем, будем надеяться, что конкретный специалист по ОС разъяснит нам общие приемы. uprego 10 лет назад 0
[Этот вопрос SO] (http://stackoverflow.com/questions/15315482/how-come-forked-processes-do-not-affect-each-other-when-there-is-a-global-pointe) может помочь , Varaquilex 10 лет назад 0
Будьте осторожны с тем «типом» памяти, о котором вы спрашиваете… существует разница между «адресами / страницами виртуальной памяти» и «адресами / страницами физической памяти», которые ОБРАЩАЮТСЯ в виртуальные ... например… а » непрерывный диапазон виртуальных адресов для вашего простого массива C может быть неконфликтным, когда запекается страницами физической памяти. Память пространства пользователя похожа на это .. если только не используются специальные типы распределителей памяти для запроса определенных атрибутов страницы. Heston T. Holtmann 10 лет назад 0

1 ответ на вопрос

1
uprego

Если вы загрузите и распакуете его (linux-3.13) из kernel.org, вы увидите, что в linux-3.13 / kernel / fork.c есть хорошо документированный набор функций. Один из них, do_fork (...), претендует на фактическую форк. Здесь эта функция вызывает 'static struct task_struct * copy_process (...)' вокруг строки 1129. То, что вы ищете, должно быть где-то рядом.

ОК, как я вижу, эта функция после проверки прав доступа selinux вызывает dup_task_struct (...), который вызывает alloc_task_struct_node (...), alloc_thread_info_node (...) и arch_dup_task_struct (...) ', Учитывая тот факт, что alloc_task_struct_node (...) делает «немного больше, чем вызов kmem_cache_alloc_node (...)» и тот факт, что эта функция объявлена ​​в файле linux-3.13 / mm / slab.c, который намекает на память управление и тот факт, что многие потоки ядра могут работать против обязанностей по управлению памятью (непрерывно создавая и удаляя структуры), я бы поспорил, что Linux, в частности, не создает структуры данных процесса один за другим, поскольку многие потоки выполняют те же общие распределения, которые использует fork .

Если вы откроете linux-3.13 / mm / slub.c, он начнет говорить, что это распределитель памяти slab. Поисковая система Интернета дает эти результаты этому: википедия ... и lwn .

Похожие вопросы