当进程在定时器中断之前退出时,如何在linux内核中进行上下文切换?
我知道,如果进程正在运行,并且发生了定时器中断,那么如果标志被设置,则schedulefunction被自动地调用,调度function然后select下一个进程运行。 基本上在这种情况下,调度函数运行在当前进程的上下文中,但是当进程在计时器中断之前退出时会发生什么? 谁在这种情况下调用schedulefunction? 在什么情况下运行?
Windows任务调度器和python日志logging模块
了解renice
Linux CFS调度程序如何防止处理器挨饿导致任务执行很小的vruntime?
完全公平调度程序(CFS):长时间运行进程的vruntime
在自己的内核模块中,在磁盘睡眠时SIGSTOP任务
定时器中断只是schedule几百个不同原因之一,这一点很重要。 只有运行时间被计算占主导地位的程序,比你想象的要少得多,它们耗尽了时间片。 程序运行时间仅为几微秒(是,微秒),在系统调用的“阻塞”,等待用户输入或其他任何时间之间,更为常见。
当某个进程以任何方式退出时,最终都会在该进程的(内核)上下文中调用do_exit 。 do_exit将schedule作为其最后一个操作,并且schedule 永远不会返回到该上下文 。 请注意,在do_exit ,有一个schedule调用,紧接着是BUG(); 和一个无限循环。
在此之前, do_exit调用exit_notify ,它负责将SIGCHLD发送到父进程和/或将其从呼叫释放,以便wait 。 所以,很多时候,父进程将会在schedule时被准备好运行,并被选中。
do_exit还释放所有的用户空间状态以及与进程相关的大部分内核状态,释放内存,关闭文件描述符等task_struct本身必须存在,直到有人呼叫wait ,我无法弄清楚内核决定现在可以解除分配; 这段代码太复杂了。
如果进程名为_exit ,内核调用链就是sys_exit_group , do_group_exit为do_exit 。 如果它使用了一个致命的同步信号(例如SIGSEGV ),那么调用链的时间就会更长,而且会有一个棘手的问题。 硬件陷阱由架构特定的代码(例如x86 do_trap )通过force_sig_info和send_signal complete_signal ,它调整任务状态,然后通知调度器唤醒出错的进程。 违规过程唤醒,特定于架构的信号处理逻辑迷宫最终将其传递给get_signal , do_group_exit调用do_group_exit ,它调用do_exit 。 致命的异步信号(例如,在shell提示符下键入kill 12345 )从sys_kill启动,并通过kill_something_info , group_send_sig_info , do_send_sig_info发送send_signal ,之后所有内容都如上所述进行。 在这两种情况下,完成信号的所有步骤都可能发生在任何过程上下文中,但是在“过程中醒来”之后的所有内容都发生在该过程的上下文中。
本描述中唯一与Linux相关的部分是内核代码中的函数名称。 任何Unix的实现都将具有内核函数,这些函数可以或多或少地执行Linux的do_exit和schedule操作,并且涉及到_exit ,致命的同步信号和致命的异步信号的操作序列将会被认为是相似的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。