据我通过阅读一些SO问题和内核文档了解到,在Linux中,允许一个任务(线程,进程,甚至一组任务)在最短的时间内不间断地执行(根据我的笔记本电脑中的3毫秒)到 /proc/sys/kernel/sched_min_capsularity_ns),之后如果负载很高,可以随时停止。如果情况并非如此并且已超出 CPU 时间,则必须停止该任务以允许其他任务继续进行。
但根据我的理解,一旦CPU正在运行一个任务,就没有什么可以阻止它,这自然会产生两个非常相关的问题:
- 如何停止任务?我唯一能想到的是操作系统发送某种简单的CPU中断,或者这里涉及到更复杂的事情?
- 如果CPU是单线程的并且一次只能执行一个任务,那么任务可以被停止吗?因为如果CPU当前正在运行一个任务,Linux怎么可能执行自己的管理例程来检查该任务是否必须停止?
答案1
每当内核获得控制权时就可以进行调度。有两种方法可以实现此目的,即使使用单个 CPU,这两种方法也可能发生:
- 中断,其中硬件事件导致 CPU 切换到相应的中断处理程序(在内核中);
- 系统调用,正在运行的任务调用内核来为其执行一些工作。
在这两种情况下,在内核将控制权返回给用户空间之前,它会确定哪个可运行任务应该获得控制权——这可以是最初被中断的任务,但不一定如此。
即使没有太多硬件活动,计时器中断也可确保内核定期获得控制权。