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根本不考虑保留并且在变成僵尸之前已经与内核堆栈一起丢弃了?
到底发生了什么?
经过一番挖掘,我想我终于找到了......
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()确实释放内核堆栈。
所以,答案是肯定的。僵尸进程确实保留内核堆栈。