linux如何进程调度
linux如何进程调度详细介绍
在 Linux 中,进程调度由内核调度器负责,其目标是在公平性、响应时间、吞吐量等之间实现平衡。以下是 Linux 进程调度的核心机制和相关知识:
一、调度器分类与演进
- 完全公平调度器(CFS,Completely Fair Scheduler)
- 适用场景:针对普通进程(非实时进程),是 Linux 2.6.23 后引入的主流调度器。
- 核心思想:通过 ** 虚拟运行时间(vruntime)** 保证公平性,每个进程的实际运行时间会被转换为 vruntime,优先级越高的进程,vruntime 增长越慢,从而更频繁地获得 CPU 资源。
- 数据结构:使用红黑树维护可运行进程队列,每次选择 vruntime 最小的进程运行,确保 “最小努力优先”。
- 实时调度器
- 针对实时进程(需严格时间约束),优先级高于普通进程,分为两种策略:
- SCHED_FIFO:先来先服务,进程一旦运行直到主动放弃 CPU 或被更高优先级的实时进程抢占。
- SCHED_RR:时间片轮转,进程运行完时间片后进入队列末尾,同优先级进程公平分配时间。
- 针对实时进程(需严格时间约束),优先级高于普通进程,分为两种策略:
二、进程优先级体系
- 普通进程(分时进程)
- nice 值:范围
-20(最高优先级)到19(最低优先级),默认值为 0。可通过nice(启动时)或renice(运行中)调整。 - 优先级计算:基于 nice 值生成动态优先级,影响 vruntime 的增长速率(优先级越高,时间片越长,vruntime 增长越慢)。
- nice 值:范围
- 实时进程
- 实时优先级:范围
0(最低)到99(最高),数值越高优先级越高,通过系统调用或工具显式设置。 - 实时进程始终优先于普通进程运行,且不会被普通进程抢占。
- 实时优先级:范围
三、调度策略设置
- 命令行工具
- chrt:用于设置进程的调度策略和优先级。bash
chrt pidchrt pid
- nice/renice:调整普通进程的 nice 值:bash
./programpid
- chrt:用于设置进程的调度策略和优先级。bash
- 系统调用
sched_setscheduler():设置进程的调度策略和参数。sched_setparam():修改实时进程的优先级。
四、调度机制与抢占
- 周期性调度
- 内核通过定时器(如
hrtimer)周期性触发调度器,检查是否有更高优先级的进程需要运行。 - 普通进程的时间片随优先级动态调整,优先级越高时间片越长(减少调度开销)。
- 内核通过定时器(如
- 抢占机制
- 主动抢占:进程在系统调用、阻塞或主动放弃 CPU 时触发调度。
- 被动抢占:当高优先级进程进入可运行状态时,低优先级进程会被抢占(需内核支持抢占,通过
CONFIG_PREEMPT_VOLUNTARY或CONFIG_PREEMPT_RT配置)。
五、监控与调试工具
- top/htop:查看进程的 nice 值、实时优先级(RT Pri)和状态。
- ps:显示进程的调度策略(如
ps -eo pid,policy,ni,cmd)。 - schedtool:更细粒度地调整进程的调度参数(如 CPU 亲和力、实时优先级)。
- 内核调试工具:如
ftrace可追踪调度事件,procfs(/proc/<pid>/sched)查看进程的调度统计信息。
六、调度目标与权衡
- 公平性:CFS 通过 vruntime 确保每个进程获得近似公平的 CPU 时间。
- 响应时间:优先调度交互进程(通过优先级调整,如桌面环境的进程通常有更高优先级)。
- 吞吐量:对计算密集型任务,减少调度开销以提升整体效率。
- 实时性:实时调度器保证高优先级任务的确定性执行,避免延迟。
总结
Linux 进程调度通过CFS(普通进程)和实时调度策略(实时进程)实现分层调度,结合优先级和时间片管理,在公平性、响应速度和系统效率之间取得平衡。用户可通过工具或系统调用调整进程的调度参数,以满足不同场景需求(如高性能计算、实时控制、交互式应用)。