Linux如何实现抢占式调度?

Linux如何实现抢占式调度?

我正在阅读 Linux 文档项目中有关 Linux 进程的内容: https://www.tldp.org/LDP/tlk/kernel/processes.html

进程总是进行系统调用,因此可能经常需要等待。即便如此,如果一个进程在等待之前一直执行,那么它仍然可能会使用不成比例的 CPU 时间,因此 Linux 使用抢占式调度。在这个方案中,每个进程都被允许运行一小段时间,200ms,当这个时间到期时,选择另一个进程运行,并使原来的进程等待一段时间,直到它可以再次运行。这段少量的时间称为时间片。

我的问题是,如何跟踪这个时间?如果当前进程是唯一占用CPU的进程,那么就没有什么实际检查时间是否已过期,对吧?

我知道进程会跳转到系统调用,然后又会跳转回调度程序,因此在这方面如何“交换”进程是有意义的。但是 Linux 如何能够跟踪进程占用 CPU 的时间呢?只能通过硬件定时器来实现吗?

答案1

简短的回答是肯定的。所有实用的抢占方法都会使用某种 CPU 中断来跳回到特权模式,即 Linux 内核调度程序。

如果您查看您的系统,/proc/interrupts您会发现系统中使用的中断,包括计时器。

请注意,Linux 有几种不同类型的调度程序,并且很少使用经典的周期性计时器样式 - 从完全公平调度程序 (CFS) 文档

CFS 使用纳秒粒度计算,不依赖于任何 jiffies 或其他 HZ 细节。因此,CFS 调度程序没有以前调度程序那样的“时间片”概念,也没有任何启发式方法。

此外,当程序发出系统调用(通常通过软件中断 - “陷阱”)时,内核也能够抢占调用程序,这在等待来自其他进程的数据的系统调用时尤其明显。

相关内容