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

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

1 ответ

Решение

Если вы загрузите и распакуете его (linux-3.13) из http://www.kernel.org/, вы увидите, что в linux-3.13/kernel/fork.c есть хорошо документированный набор функций. Один из них, do_fork(...), претендует на фактическую форк. Здесь эта функция вызывает статическую структуру 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. Поисковая система Интернета дает такие результаты: wikipedia... и lwn.

Другие вопросы по тегам