首页 > 解决方案 > 子进程内存分配和收获子进程的目的

问题描述

我是流程的初学者,仍在努力理解为它们获取子进程和内存分配的目的,所以我的问题是:

Q1。为什么Linux没有自动收割子进程的机制,我的意思是所有子进程一旦完成就会像垃圾回收一样被终止并删除,这样用户就不需要waitpid手动收割子进程了?

Q2。我的教科书说,当用户使用 fork() 创建新的子进程时,子进程会获得父进程的文本、数据和 bss 段、堆和用户堆栈的相同(但单独)副本。那么这是否意味着父母的相同大小的内存地址也分配给了孩子,并且孩子的内存内容与其父母完全相同?如果是这样,假设我们创建了大量的子进程,堆栈不是很容易溢出吗?

Q3。可以说下图是父进程 在此处输入图像描述

您可以看到以红色突出显示的用户堆栈是父堆栈。那么如果父程序使用fork(),当它执行fork()函数时,子进程的栈是如何分配的呢?是当前堆栈旁边的子堆栈

标签: clinuxprocessoperating-system

解决方案


Q1。为什么Linux没有自动收割子进程的机制,我的意思是所有子进程一旦完成就会像垃圾回收一样被终止并删除,这样用户就不需要使用waitpid手动收割子进程了?

确实如此。只需将 SIGCHLD 设置为被忽略,您的孩子就会为您收获。

Q2。我的教科书说,当用户使用 fork() 创建新的子进程时,子进程会获得父进程的文本、数据和 bss 段、堆和用户堆栈的相同(但单独)副本。那么这是否意味着父母的相同大小的内存地址也分配给了孩子,并且孩子的内存内容与其父母完全相同?

这是一个实现细节。大多数现代系统只是在两个进程之间共享内存。

如果是这样,假设我们创建了大量的子进程,堆栈不是很容易溢出吗?

不会。当您在特定进程的内存视图中用完地址空间时,堆栈会溢出。由于每个进程都会fork创建一个新进程,因此您不会在任何特定进程中耗尽地址空间。

Q3。假设下图是父进程在此处输入图像描述......您可以看到以红色突出显示的用户堆栈是父进程的堆栈。那么如果父程序使用fork(),当它执行fork()函数时,子进程的栈是如何分配的呢?子堆栈在当前堆栈旁边吗?

子进程的堆栈在另一个进程中。因此,如果这是父进程段的地址空间,则子进程的堆栈根本不在其中。子进程从父地址空间的副本开始——通常共享实际的内存页面,至少在任一进程尝试修改它们(取消共享它们)之前。


推荐阅读