【发布时间】:2017-03-15 20:21:28
【问题描述】:
子进程退出时需要僵尸状态,在僵尸状态下,它的退出值被保存,直到其父进程调用wait()。
但是为什么不在子进程退出时将退出值保存在父进程描述符中并立即完全释放子进程的资源呢?
例如,我们向进程描述符添加了一个堆栈子进程的退出值。
【问题讨论】:
标签: process linux-kernel kernel
子进程退出时需要僵尸状态,在僵尸状态下,它的退出值被保存,直到其父进程调用wait()。
但是为什么不在子进程退出时将退出值保存在父进程描述符中并立即完全释放子进程的资源呢?
例如,我们向进程描述符添加了一个堆栈子进程的退出值。
【问题讨论】:
标签: process linux-kernel kernel
fork -> wait 模型的关键不是你可以获得退出状态(和其他一些信息),而是进程的 pid 一直在使用,直到你等待它。这意味着您可以确信没有其他人会突然分叉并获得相同的 pid,这在某些情况下具有很大的价值。
僵尸本身真的不怎么吃。所有重量级的东西都被长期释放,出于实际目的,您可以假设开销归结为描述进程的结构和 pid 表中标记为已使用的插槽..
【讨论】:
来自wikipedia:
当一个进程通过退出结束时,所有的内存和资源 与它相关的被释放,因此它们可以被其他人使用 过程。但是,进程表中的进程条目仍然存在。
所以这里没有资源问题。现在来回答你的问题,
为什么不在父进程描述符中保存退出值? 孩子退出
原因是子进程无法访问/修改父进程描述符。它只能与父级通信。
因此子进程向父进程发送SIGCHLD,由父进程来处理信号。
【讨论】: