2026/5/16 4:21:27
网站建设
项目流程
公司 网站建,温州平阳县营销型网站建设,用wordpress开发网站模板,深圳龙华区教师招聘接前一篇文章#xff1a;Linux CFS#xff08;完全公平调度器#xff09;原理与实现细节全解析#xff08;2#xff09; 二、核心概念与关键抽象
2.3 CFS运行队列#xff08;cfs_rq#xff09;与红黑树
每个CPU都维护一个就绪队列struct rq#xff0c;其中CFS使用自己…接前一篇文章Linux CFS完全公平调度器原理与实现细节全解析2二、核心概念与关键抽象2.3 CFS运行队列cfs_rq与红黑树每个CPU都维护一个就绪队列struct rq其中CFS使用自己的子结构struct cfs_rq管理所有属于CFS调度类的可运行实体。cfs_rq的核心成员之一是一棵按vruntime排序的红黑树所有处于TASK_RUNNING状态的sched_entity都在这棵树上树中最左节点就是vruntime最小的任务即下一个最该运行的任务插入/删除/查找均为 O(log N)在任务数很大时仍然可控。红黑树的存在使得CFS可以用非常简洁的逻辑实现“永远选择vruntime最小的任务运行”典型操作如下enqueue_entity()新任务就绪 / 唤醒 → 插入rb-treedequeue_entity()任务阻塞 / 退出 → 从rb-tree移除pick_next_task_fair()取 rb-tree 最左节点 → 下一个运行任务。同时cfs_rq中还维护一个关键字段min_vruntime当前运行队列中所有实体vruntime的下界近似值主要用于新任务vruntime初始化与全局“时间对齐”。2.4 权重、nice值与调度粒度在Linux中nice值范围为[-20, 19]数值越小优先级越高CFS使用sched_prio_to_weight[]将nice值映射为整数权重weight权重近似呈指数级变化每降低1个nice权重大约乘以1.25。例如示意nice 0 → weight 1024nice -1 → weight ≈ 1277nice 1 → weight ≈ 820。CFS使用如下公式更新vruntime[ \Delta \text{vruntime} \Delta t_\text{exec} \times \frac{\text{NICE_0_LOAD}}{\text{weight}} ]因此权重越大nice越低同样运行1ms其vruntime增加得更少权重越小nice越高vruntime增加得更多在红黑树中更容易被“推到右边”降低调度频率。此外为避免过度频繁的上下文切换CFS引入了几个重要参数sched_min_granularity最小调度粒度默认约 0.75ms单次调度不希望明显短于该值sched_latency目标调度延迟默认约 6ms即当可运行任务数较少时每个任务在一个周期内大致能运行一次当任务数nr_running较多时sched_latency会按nr_running sched_min_granularity动态放大以避免极端高频切换。更多内容请看下回。