c - 子进程内存分配和收获子进程的目的
问题描述
我是流程的初学者,仍在努力理解为它们获取子进程和内存分配的目的,所以我的问题是:
Q1。为什么Linux没有自动收割子进程的机制,我的意思是所有子进程一旦完成就会像垃圾回收一样被终止并删除,这样用户就不需要waitpid
手动收割子进程了?
Q2。我的教科书说,当用户使用 fork() 创建新的子进程时,子进程会获得父进程的文本、数据和 bss 段、堆和用户堆栈的相同(但单独)副本。那么这是否意味着父母的相同大小的内存地址也分配给了孩子,并且孩子的内存内容与其父母完全相同?如果是这样,假设我们创建了大量的子进程,堆栈不是很容易溢出吗?
您可以看到以红色突出显示的用户堆栈是父堆栈。那么如果父程序使用fork(),当它执行fork()函数时,子进程的栈是如何分配的呢?是当前堆栈旁边的子堆栈
解决方案
Q1。为什么Linux没有自动收割子进程的机制,我的意思是所有子进程一旦完成就会像垃圾回收一样被终止并删除,这样用户就不需要使用waitpid手动收割子进程了?
确实如此。只需将 SIGCHLD 设置为被忽略,您的孩子就会为您收获。
Q2。我的教科书说,当用户使用 fork() 创建新的子进程时,子进程会获得父进程的文本、数据和 bss 段、堆和用户堆栈的相同(但单独)副本。那么这是否意味着父母的相同大小的内存地址也分配给了孩子,并且孩子的内存内容与其父母完全相同?
这是一个实现细节。大多数现代系统只是在两个进程之间共享内存。
如果是这样,假设我们创建了大量的子进程,堆栈不是很容易溢出吗?
不会。当您在特定进程的内存视图中用完地址空间时,堆栈会溢出。由于每个进程都会fork
创建一个新进程,因此您不会在任何特定进程中耗尽地址空间。
Q3。假设下图是父进程在此处输入图像描述......您可以看到以红色突出显示的用户堆栈是父进程的堆栈。那么如果父程序使用fork(),当它执行fork()函数时,子进程的栈是如何分配的呢?子堆栈在当前堆栈旁边吗?
子进程的堆栈在另一个进程中。因此,如果这是父进程段的地址空间,则子进程的堆栈根本不在其中。子进程从父地址空间的副本开始——通常共享实际的内存页面,至少在任一进程尝试修改它们(取消共享它们)之前。
推荐阅读
- authentication - Nuxt - 如何防止登录后重定向到主页
- python - 如何销毁使用 for 循环生成的按钮(单击后)
- visual-c++ - 具有多个条件的 if 语句无法使用 || 或 $$
- html - 个人资料卡 - 将图像放在我的 div 的底部中心
- python - 尝试将斐波那契项添加到文件名时获取不完整的数据
- rust - Rust 中 Bool 的打印值
- r - 在 .Rprofile 为什么不加载(“.RData”)工作,但它会在 .Rprofile 调用的 R 脚本中工作?
- java - 如何进入 Cream Text Editor 的命令模式?
- python - 如何将 unicode 写入 txt?Python
- c++ - 为什么 std::map 代码在未为其数据类型定义 operator < 时编译?