linux CFS:完全公平调度器与非定长cpu时间片

dalang · · 96 次点击 · · 开始浏览    
当前 Linux 内核(5.x 及以上版本)默认的进程调度器是 **CFS(Completely Fair Scheduler,完全公平调度器)**,而非传统的 **Round Robin(RR,轮询调度)**。 --- ### **1. CFS:完全公平调度器** #### **(1) 基本设计** - **目标**:通过动态计算进程的**虚拟运行时间(vruntime)**,实现所有任务对 CPU 时间的公平分配。 - **核心机制**: - **红黑树排序**:所有可运行进程按`vruntime`排序,选择`vruntime`最小的进程执行。 - **时间片动态调整**:优先级高的任务实际获得更多 CPU 时间,但通过`vruntime`的权重计算,保证全局公平性。 - **无固定时间片**:与传统 RR 的固定时间片不同,CFS 的时间片长度由进程权重和系统负载动态决定。 #### **(2) 优势** - **公平性**:所有任务(无论优先级)按比例共享 CPU,避免饥饿问题。 - **低延迟**:适合交互式任务(如 GUI 应用),响应时间更短。 - **动态适应**:自动适配多核、多任务场景,优化吞吐量和延迟。 --- ### **2. Round Robin(RR)的角色** #### **(1) RR 的定位** - **实时调度策略**:RR 属于 Linux 的**实时调度策略**之一(`SCHED_RR`),需显式配置,**并非默认调度器**。 - **使用场景**:适用于需要严格时间保障的实时任务(如音视频处理、工业控制)。 - **规则**: - 相同优先级的任务按固定时间片轮转执行。 - 可被更高优先级的实时任务(`SCHED_FIFO`)抢占。 #### **(2) 与 CFS 的区别** | **特性** | CFS(默认) | Round Robin(SCHED_RR) | |----------------|--------------------------------|----------------------------------| | **目标** | 公平性 + 吞吐量 | 实时性 + 确定性 | | **时间片** | 动态调整 | 固定时间片 | | **适用任务** | 普通进程(非实时) | 实时进程(需显式配置) | | **调度策略** | `SCHED_NORMAL`(默认) | `SCHED_RR`(需手动设置) | --- ### **3. 为什么 Linux 选择 CFS 而非 RR?** #### **(1) 历史背景** - **O(1) 调度器**:2003 年前,Linux 使用基于优先级和时间片轮转的 O(1) 调度器,但其公平性和交互性较差。 - **CFS 的引入**:2007 年(内核 2.6.23),CFS 取代 O(1),成为默认调度器,解决了公平性和延迟问题。 #### **(2) 技术原因** - **公平性需求**:服务器和桌面环境需同时处理交互任务和后台任务,RR 的固定时间片无法灵活适配。 - **多核扩展性**:CFS 的红黑树结构和权重机制更适应多核 CPU 的负载均衡。 - **混合负载优化**:CFS 能自动平衡 CPU 密集型(长任务)和 I/O 密集型(短任务)的调度需求。 --- ### **4. 如何查看当前调度策略?** #### **(1) 查看进程调度策略** ```bash chrt -p <PID> ``` - 输出示例: ```plaintext pid 1234 的当前调度策略:SCHED_OTHER(即 CFS) pid 5678 的当前调度策略:SCHED_RR ``` #### **(2) 修改调度策略** - **设置为 RR**(需 root 权限): ```bash chrt -r -p <优先级> <PID> ``` --- ### **5. 总结** - **默认调度器**:Linux 普通进程默认使用 **CFS**,目标是公平性和高吞吐量。 - **Round Robin(RR)**:属于实时调度策略(`SCHED_RR`),需手动配置,适用于实时性要求高的任务。 - **选择依据**: - 普通任务无需干预,CFS 自动优化。 - 实时任务(如嵌入式系统)可配置为 `SCHED_RR` 或 `SCHED_FIFO`。 --- 通过 CFS,Linux 在绝大多数场景下实现了高效、公平的 CPU 资源分配,成为现代操作系统的核心优势之一。
96 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传