分叉时,会复制父进程的确切环境。该空间是在 RAM 中的随机空间中分配的,还是父进程和子进程都获得连续的 RAM 空间(例如数组元素)?
答案1
如果你从以下网址下载并解压它(linux-3.13)内核网站,您可以看到在 linux-3.13/kernel/fork.c 中有一组记录良好的函数。其中一个函数“do_fork(...)”声称执行实际的 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 内存分配器。互联网搜索引擎给出了以下结果:维基百科……和淋巴结。