sched_period

Linux内核调度器的调度频率并非固定,而是由多种因素动态决定的。以下是关键点的详细说明:


1. 触发调度的主要条件

调度并非周期性发生,而是由以下事件触发:

  • 主动让出CPU:进程调用 sleep()、等待I/O或同步操作(如锁)时主动释放CPU。

  • 时间中断(Tick):内核周期性时钟中断(由HZ配置)检查是否需要抢占当前进程。

  • 进程唤醒:高优先级任务从阻塞状态唤醒(如I/O完成)时触发抢占。

  • 显式调度请求:内核代码调用 cond_resched()schedule() 主动触发调度。


2. 时间中断(Tick)的频率

  • HZ 参数:定义每秒的时钟中断次数,常见值为:

    • 100 Hz:每 10ms 一次中断(传统配置,适合低延迟需求)。

    • 250 Hz:每 4ms 一次中断(常见默认值)。

    • 1000 Hz(Tickless):每 1ms 一次中断(高吞吐场景,如实时系统)。

  • 每次中断会调用调度器检查是否需要切换进程,但实际调度次数通常少于中断次数(仅在需要时切换)。


3. CFS(完全公平调度器)的动态时间片

CFS无固定时间片,而是通过以下参数动态分配CPU时间:

  • sched_latency_ns:默认 6ms,表示调度周期内所有就绪任务至少运行一次。

  • min_granularity_ns:默认 0.75ms,单个任务的最小时间片。

  • 动态调整:时间片随就绪任务数量变化。例如:

    • 若有4个任务,每个任务分配 6ms/4 = 1.5ms

    • 若有8个任务,每个分配 max(0.75ms, 6ms/8)=0.75ms


5. 实际调度频率示例

  • 轻负载系统:可能每秒调度数百次(如250 Hz下,实际切换次数低于250次)。

  • 高负载系统:频繁的进程唤醒/阻塞可能导致每秒数千次调度。

  • 实时任务:通过 SCHED_FIFO/SCHED_RR 策略直接抢占,延迟可低至微秒级。


总结

Linux调度器的调度间隔并非固定,而是由 事件驱动(如中断、任务状态变化)和 动态时间片分配 共同决定。时间中断(Tick)提供了基础检查频率(如每1-10ms一次),但实际调度行为更复杂,需结合负载、任务优先级及内核配置综合判断。如需调整调度行为,可修改HZsched_latency_ns等参数,但需谨慎评估对系统性能的影响。

Last updated

Was this helpful?