Linux 是否为僵尸进程保留内核堆栈?

hoh*_*e12 5 c linux memory-management linux-kernel

我在一本教科书中了解到,当进程变成僵尸时,Linux 会保留进程描述符,直到未来的父进程验证退出状态。我知道进程描述符有两个结构:task_structslab 和thread_info内核堆栈(忘记 x86)。

我正在阅读do_exit()源代码的<kernel/exit.c>部分,但我不太明白内核堆栈的释放位置。我可以发现exit_notify()将进程的状态更改为僵尸。其余的代码看起来主要是清理锁和东西,直到schedule().

我似乎找不到释放内核堆栈的部分?还是我不明白内核堆栈是如何工作的?或者也许thread_info根本不考虑保留并且在变成僵尸之前已经与内核堆栈一起丢弃了?

到底发生了什么?

hoh*_*e12 1

经过一番挖掘,我想我终于找到了......

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);
}
Run Code Online (Sandbox Code Playgroud)

在父母验证僵尸时,

put_task_struct()->__put_task_struct()->free_task()确实释放内核堆栈。

所以,答案是肯定的。僵尸进程确实保留内核堆栈。