Debian进程调度算法概览
Debian基于Linux内核,其进程调度采用模块化调度器架构,以CFS(完全公平调度器)作为普通任务的核心,按优先级从高到低依次为:Stop、Deadline、Real-time(FIFO/RR/DL)、CFS(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE)、Idle。普通任务使用CFS,通过vruntime(虚拟运行时间)与权重(由nice映射)实现按权重分配的公平性;实时任务使用SCHED_FIFO/SCHED_RR/SCHED_DEADLINE,具备更高优先级与更强抢占性。自内核演进看,Linux已从早期**O(N)与O(1)**调度器过渡到以CFS为主的设计,兼顾公平、响应与吞吐。
调度策略与优先级
- 实时策略
- SCHED_FIFO:先进先出,相同优先级不抢占,除非主动让出或被更高优先级抢占。
- SCHED_RR:同优先级按时间片轮转,时间片到期即被抢占。
- SCHED_DEADLINE:最早截止期限优先(EDF),按任务的绝对截止时间与运行需求调度。
- 普通策略
- SCHED_NORMAL:默认策略,面向交互与通用计算,由CFS按权重公平分配CPU时间。
- SCHED_BATCH:面向批处理,降低交互性以提升吞吐。
- SCHED_IDLE:仅在系统空闲时运行,优先级最低。
- 优先级与数值范围
- 实时优先级:1–99(数值越大优先级越高,可强抢占普通任务)。
- 普通优先级(nice):-20–19(映射到内核优先级约100–139,数值越小优先级越高)。
- 调度类串联顺序:stop_sched_class → dl_sched_class → rt_sched_class → fair_sched_class → idle_sched_class(高优先级类先被挑选)。
CFS核心机制
- 公平度量:以vruntime记录进程“按权重折算后的运行时间”,权重越高(nice越小),单位真实时间增加的vruntime越小,因而更频繁被选中,长期获得与其权重成比例的CPU份额。
- 运行队列:每CPU维护cfs_rq红黑树,按vruntime排序,调度器总是选择**最左节点(最小vruntime)**运行。
- 抢占与响应:通过时钟tick与wakeup_granularity等阈值实现“适度抢占”,既保障交互式响应,又避免过度切换;CFS不依赖固定时间片,而以sched_latency / sched_min_granularity等参数控制调度窗口与最小运行粒度。
查看与调整调度策略的常用方法
- 查看进程策略与优先级
- 命令:ps -eo pid,comm,ni,pri,rtprio
- 含义:ni(nice)、pri(动态优先级)、rtprio(实时优先级,非实时为-)。
- 调整实时优先级(需root)
- 命令:chrt -f -p 99 (SCHED_FIFO,优先级99)
- 命令:chrt -r -p 50 (SCHED_RR,优先级50)
- 配置CPU亲和性
- 运行时参数(示例)
- 查看/调整:cat /proc/sys/kernel/sched_latency_ns 等
- 用途:调节调度窗口与粒度,影响响应与吞吐(谨慎变更)。