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一次),但实际调度行为更复杂,需结合负载、任务优先级及内核配置综合判断。如需调整调度行为,可修改HZ
、sched_latency_ns
等参数,但需谨慎评估对系统性能的影响。
Last updated
Was this helpful?