Tre*_*rey 5 x86 interrupt scheduler linux-kernel
我很难理解这一点。
调度程序如何知道某个时间段已经过去了?
调度程序参考系统时钟。
它是否使用某种系统调用或中断来实现这一点?
由于系统时钟经常更新,因此调度程序只需读取其当前值就足够了。调度程序已经处于内核模式,因此没有涉及读取时钟的系统调用接口。
是的,有定时器中断会触发 ISR,这是一个中断服务例程,它读取硬件寄存器并提高系统时钟的当前值。
使用常数 HZ 而不是秒有什么意义?
曾几何时,调用 ISR 的成本很高,并且在每次调用时,它都会执行一定量的簿记操作,例如查找已过期的调度程序量程并触发 TCP RTO 重传计时器。硬件的灵活性有限,只能以固定的时间间隔调用 ISR,例如,如果 HZ 为 100,则每 10 毫秒。较高的 HZ 值使得 ISR 更有可能运行并发现没有什么可做的,自上一次以来没有发生任何事件。运行,在这种情况下,ISR 代表了开销,即从前台用户任务中窃取的周期。较低的 HZ 值会影响调度延迟,导致网络和交互响应时间缓慢。对于实际的硬件系统,HZ 调整权衡往往接近 100 或 1000。报告系统时钟时间的 API 只能以滴答为单位进行报告,其中每个 ISR 调用都会将时钟提前一个滴答。因此调用者需要知道 HZ 的值才能从刻度单位转换为 SI 单位。现代系统在单独调度的 TCP 内核线程上执行网络任务,并且可能支持无滴答内核,该内核丢弃了许多过时的假设。
系统定时器和调度器有什么关系?
当系统定时器触发中断时调度程序运行。抢占式调度程序的本质是它可以暂停“旋转”用户模式代码,例如while (1) {}
,并操纵运行队列,即使在单核系统上也是如此。
此外,调度程序在进程自愿放弃其时间片时运行,例如在发出系统调用或发生页面错误时。