我在一本教科书中了解到,当进程成为僵尸时,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()确实释放了内核堆栈。
因此,答案是肯定的。僵尸进程的确保留内核堆栈。

09-09 21:02