最佳答案
How does the scheduler know that a certain period of time has passed?
调度程序查询系统时钟。
Does it use some sort of syscall or interrupt for that?
由于系统时钟经常更新,调度程序只需读取其当前值就足够了。调度程序已经处于内核模式,因此在读取时钟时不涉及系统调用接口(interface)。
是的,有触发 ISR 的定时器中断,这是一个中断服务程序,它读取硬件寄存器并提前系统时钟的当前值。
What's the point of using the constant HZ instead of seconds?
曾几何时,调用 ISR 的成本很高,并且在每次调用时,它都会执行一定数量的簿记,例如查找调度程序量程过期和触发 TCP RTO 重传计时器。硬件的灵 active 有限,只能以固定的时间间隔调用 ISR,例如如果 HZ 为 100,则每 10 毫秒。更高的 HZ 值使 ISR 更有可能运行并发现无事可做,自上次运行以来没有发生任何事件,在这种情况下,ISR 代表开销,从前台用户窃取的周期任务。较低的 HZ 值会影响调度延迟,导致网络和交互响应时间缓慢。对于实际的硬件系统,HZ 调整权衡趋于接近 100 或 1000。报告系统时钟时间的 API 只能以滴答为单位进行,每次 ISR 调用都会将时钟提前一个滴答。因此,调用者需要知道 HZ 的值才能将刻度单位转换为 S.I. 单位。现代系统在单独调度的 TCP 内核线程上执行网络任务,并且可能支持无滴答内核,该内核丢弃了许多这些过时的假设。
What does the system timer have to do with the scheduler?
当系统计时器触发中断时,调度程序运行。
抢先调度程序的本质是它可以暂停“旋转”用户模式代码,例如
while (1) {}
,并操纵运行队列,即使在单核系统上也是如此。此外,调度程序在进程自愿放弃其时间片时运行,例如发出系统调用或发生页面错误时。
关于linux-kernel - 什么是内核定时器系统,它与调度程序有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47294418/