我在一本教科书中了解到,当进程成为僵尸时,Linux会保留进程描述符,直到将来的父级验证退出状态为止。我知道进程描述符有两种结构:平板中的task_struct
和内核堆栈中的thread_info
(忘记x86)。
我正在阅读源代码的 do_exit()
部分,但是我不太了解内核堆栈的释放位置。我发现exit_notify()
将进程的状态更改为僵尸。其余的代码看起来像是清理大部分锁和东西直到schedule()
。
我似乎找不到用于释放内核堆栈的部分?还是我不了解内核堆栈如何工作?
也许thread_info
根本不被保留,并且在变成僵尸之前已经与内核堆栈一起丢弃了吗?
到底是怎么回事?
最佳答案
经过一番挖掘,我想我终于找到了...
void free_task(struct task_struct *tsk)
{
prop_local_destroy_single(&tsk->dirties);
account_kernel_stack(tsk->stack, -1);
free_thread_info(tsk->stack);
rt_mutex_debug_task_free(tsk);
ftrace_graph_exit_task(tsk);
free_task_struct(tsk);
}
在 parent 验证僵尸时,put_task_struct()->__put_task_struct()->free_task()
确实释放了内核堆栈。因此,答案是肯定的。僵尸进程的确保留内核堆栈。