Linux上下文开关内部:当进程在计时器中断之前退出时会发生什么?

Linux上下文开关内部:当进程在计时器中断之前退出时会发生什么?,linux,scheduler,ucontext,Linux,Scheduler,Ucontext,当进程在计时器中断之前退出时,linux内核中如何进行上下文切换 我知道,如果进程正在运行,并且出现计时器中断,则会自动调用调度函数。如果设置了标志,则调度函数会选择下一个进程运行。基本上,在这种情况下,调度函数在当前进程的上下文中运行,但当进程甚至在计时器中断之前退出时会发生什么?在这种情况下,谁调用schedule函数?它是在什么环境下运行的?重要的是要理解,计时器中断只是调用调度的数百个不同原因之一。只有运行时由计算控制的程序(比你想象的要少)才会耗尽它们的时间片。更常见的情况是,程序一次

当进程在计时器中断之前退出时,linux内核中如何进行上下文切换


我知道,如果进程正在运行,并且出现计时器中断,则会自动调用
调度
函数。如果设置了标志,则调度函数会选择下一个进程运行。基本上,在这种情况下,调度函数在当前进程的上下文中运行,但当进程甚至在计时器中断之前退出时会发生什么?在这种情况下,谁调用
schedule
函数?它是在什么环境下运行的?

重要的是要理解,计时器中断只是调用
调度
的数百个不同原因之一。只有运行时由计算控制的程序(比你想象的要少)才会耗尽它们的时间片。更常见的情况是,程序一次只运行几微秒——是的,几微秒——在系统调用的“阻塞”之间,等待用户输入或其他什么

当一个进程以任何方式退出时,最终都会在该进程的(内核)上下文中调用always
do_exit
调用作为其最后一个操作,并且
schedule
永远不会返回到该上下文。注意,在
do_exit
的末尾,有一个调用
schedule
,后面紧跟着
BUG()和无限循环

在此之前,
do_exit
调用
exit_notify
,它负责将
SIGCHLD
发送到父进程和/或从调用
wait
中释放它。因此,很多时候,当调用
schedule
时,父进程将准备好运行,并将被选中

do_exit
还解除分配所有用户空间状态和与进程相关的大部分内核状态,释放内存,关闭文件描述符,等等。
task_struct
本身必须生存,直到有人调用
wait
,我无法准确地理解内核如何决定现在可以解除分配它;这个代码太复杂了

如果进程被调用,那么内核调用链就是到
do\u group\u exit
do\u exit
。如果它使用了致命的同步信号(例如,
SIGSEGV
),则呼叫链会更长,并且会有一个棘手的转移。硬件陷阱由特定于体系结构的代码(例如x86)通过
force_sig_info
send_signal
部署到,这会调整任务状态,然后通知调度程序唤醒有问题的进程。有问题的进程被唤醒,一个迷宫般的特定于体系结构的信号处理逻辑最终将其传递给调用
do\u group\u exit
,调用
do\u exit
。致命的异步信号(例如,在shell提示下键入
kill 12345
)从开始并经过
kill\u something\u info
group\u send\u sig\u info
do\u send\u info
send\u sign
,然后一切按上述方式进行。在这两种情况下,
complete\u signal
之前的所有步骤都可能发生在任何流程上下文中,但“违规流程唤醒”之后的所有步骤都发生在该流程上下文中


本说明中唯一特定于Linux的部分是内核代码中的函数名。Unix的任何实现都会有一些内核函数,这些函数或多或少地完成Linux的
do\u exit
schedule
所做的工作,部署
\u exit
所涉及的操作序列、致命的同步信号和致命的异步信号都会非常相似,当一个进程调用
exit()
时会发生什么情况,在这种情况下也会调用schedule。很多时候,进程可以不调用
exit()
而退出。在大多数情况下,它们返回到父进程,并且很可能执行
exit\u group()
来完成任务;它最后还调用了
schedule()
。它们返回到父级是什么意思?家长在您的准备队列中的某个位置..要
返回家长
您的调度器必须安排家长如果您在此处没有得到任何响应,您可能会得到更多的信息。哇!这才是我真正想要的。。谢谢另外,如果您可以在答案中添加当进程意外退出(如SEGFULT)时会发生什么情况?do_exit在这种情况下不会被调用,对吗?不,事实上,如果一个进程被信号终止,
do_exit
将被调用。我会在答案中加上一些注释。