我是进程的初学者,仍在努力理解为它们获取子进程和内存分配的目的,所以我的问题是:
一季度。为什么Linux没有自动收割子进程的机制,我的意思是所有的子进程在完成后就像垃圾回收一样被终止和删除,这样用户就不需要waitpid
手动收割子进程了?
Q2。我的教科书说,当用户使用 fork() 创建新的子进程时,子进程会获得父进程的文本、数据和 bss 段、堆和用户堆栈的相同(但独立)副本。那么这是否意味着父母的相同大小的内存地址也分配给孩子并且孩子的内存内容与其父母完全相同?如果是这样,假设我们创建了大量的子进程,是不是堆栈很容易溢出?
您可以看到以红色突出显示的用户堆栈是父级的堆栈。那么如果父程序使用 fork() 并且当它执行 fork() 函数时,子进程的堆栈如何分配?是当前堆栈旁边的子堆栈
一季度。为什么Linux没有自动收割子进程的机制,我的意思是所有的子进程在完成后就像垃圾回收一样被终止和删除,这样用户就不需要使用waitpid来手动收割子进程了?
确实如此。只需将 SIGCHLD 设置为忽略,您的孩子就会为您收割。
Q2。我的教科书说,当用户使用 fork() 创建新的子进程时,子进程会获得父进程的文本、数据和 bss 段、堆和用户堆栈的相同(但独立)副本。那么这是否意味着父母的相同大小的内存地址也分配给孩子并且孩子的内存内容与其父母完全相同?
这是一个实现细节。大多数现代系统只是在两个进程之间共享内存。
如果是这样,假设我们创建了大量的子进程,是不是堆栈很容易溢出?
不。当您在特定进程的内存视图中用完地址空间时,堆栈会溢出。由于每个fork
进程都会创建一个新进程,因此您不会在任何特定进程中耗尽地址空间。
Q3。假设下图是父进程在此处输入图像描述...您可以看到以红色突出显示的用户堆栈是父进程的堆栈。那么如果父程序使用 fork() 并且当它执行 fork() 函数时,子进程的堆栈如何分配?子堆栈是否在当前堆栈旁边?
子进程的堆栈在另一个进程中。因此,如果这是父进程段的地址空间,则子进程的堆栈根本不在其中。子进程从父进程的地址空间的副本开始——通常共享实际的内存页面,至少在任一进程尝试修改它们(取消共享它们)之前。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句