linux-kernel - 什么是内核定时器系统,它与调度程序有什么关系?

标签 linux-kernel x86 scheduler interrupt

我很难理解这一点。

  • 调度器如何知道某个时间段已经过去?
  • 它是否为此使用某种系统调用或中断?
  • 使用常量 HZ 有什么意义?而不是秒?
  • 系统计时器与调度程序有什么关系?
  • 最佳答案

    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/

    相关文章:

    c - 向静态内核模块发送参数的方式

    linux - linux内核中的PTE结构

    assembly - 关于 bsr 和 lzcnt 的困惑

    c# - Action /功能的通用列表

    oracle dbms_scheduler repeat_interval

    linux - 是否有任何 API 用于从 Linux 中的虚拟地址确定物理地址?

    c - 如何在 Linux 内核模块中立即取消工作队列的工作项?

    assembly - x86汇编abs()实现?

    assembly - 计算 DW 数组中等于 1 的元素个数

    java - 用于 mongodb fetch 的可扩展 spring 调度程序