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