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

1 ответ1

1

Если вы загрузите и распакуете его (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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .