Linux进程管理18 - CFS调度器5 - pick_next_task_fair

CFS如何选择最合适的进程

接前文:Linux进程管理6 - 核心调度 - 主调度器schedule

  • 每当进程任务切换的时候,也就是schedule函数执行时,调度器都需要选择下一个将要执行的任务。
  • 在CFS调度器中,是通过pick_next_task_fair函数完成的
    在这里插入图片描述
  • 当需要进程任务切换的时候,pick_next_task_fair函数的传入参数中包含了需要被切换出去的任务,也就是pre_task;
  • 当pre_task不是普通进程时,也就是调度类不是CFS,那么它就不使用sched_entity的调度实体来参与调度,因此会执行simple分支,通过put_pre_task函数来通知系统当前的任务需要被切换,而不是通过put_prev_entity函数来完成;
  • 当pre_task是普通进程时,调用pick_next_entity来选择下一个执行的任务,这个选择过程实际是有两种情况:当调度实体对应task时,do while()遍历一次,当调度实体对应task_group是,则需要遍历任务组来选择下一个执行的任务了。
<think>好的,我需要详细解释Linux内核4.19版本中的fair_sched_class调度类。首先,我得回顾一下进程管理的基础知识,特别是完全公平调度器CFS)的原理,因为fair_sched_class就是CFS的实现。 用户可能想了解CFS如何工作,包括时间片计算、红黑树的使用、调度策略等。我需要确保提到关键概念,比如虚拟运行时间(vruntime)、权重、优先级映射等。同时,要说明fair_sched_class在内核中的角色,比如它如何处理进程调度,如何与其他调度类(如实时调度类)交互。 还要注意内核4.19是否有特别的改进或特性。可能需要查阅相关文档或源码注释,确认是否有变化。例如,CFS的负载均衡机制或者组调度功能是否有更新。 在组织内容时,应该分步骤讲解,先概述调度类的作用,再深入CFS的具体实现,包括数据结构(如sched_entity)、调度队列的管理、vruntime的计算,以及如何选择下一个进程。同时,解释权重如何影响CPU时间的分配,特别是nice值到权重的转换。 需要避免过于技术化的术语,或者至少在使用时给出简单解释,确保内容对不同程度的读者都友好。此外,检查LaTeX格式是否正确,特别是数学公式部分,比如vruntime的计算公式可能需要用$$包围,并且正确使用符号。 可能还需要对比之前的版本,如果有变化的话,指出4.19版本的改进点。例如,调度算法的优化,或者修复的bug。如果找不到具体的变化,就专注于该版本中的通用实现。 最后,确保结构清晰,分点或分节,帮助用户逐步理解。可能的结构是:1. 调度类概述;2. CFS的核心思想;3. fair_sched_class的结构与功能;4. 关键数据结构和算法;5. 与其他调度类的协作;6. 内核4.19中的特定实现细节。 需要验证所有技术细节的准确性,比如函数名、数据结构名称是否与内核代码一致。如果有不确定的地方,可能需要查阅源码或权威资料。例如,sched_class结构体中的enqueue_task、dequeue_task等函数指针的具体作用。 另外,红黑树在CFS中的应用是关键点,要解释为什么选择红黑树,以及如何通过它快速找到最小vruntime的进程。同时,说明调度周期的处理,如何计算时间片,以及抢占机制。 总结时,强调CFS的设计目标,即公平性和高效性,以及fair_sched_class如何实现这些目标。可能还要提到相关的配置选项或参数,比如sched_min_granularity_ns或sched_latency_ns,这些在4.19版本中的默认值或调整方式。 需要确保整个回答流畅,逻辑连贯,没有技术错误,并且符合用户要求的格式,特别是正确使用LaTeX数学表达式,行内公式用$...$,独立公式用$$...$$。例如,vruntime的计算公式可能需要独立展示。</think>Linux内核的进程调度由多个调度类(Scheduler Class)协作完成,`fair_sched_class`是**完全公平调度器CFS)**对应的调度类,专为普通进程设计。以下是对其核心机制的逐步解析: --- ### 1. CFS的设计目标 CFS的核心思想是**按权重分配CPU时间**,确保每个进程获得公平的CPU份额。其关键概念包括: - **虚拟运行时间(vruntime)**:进程实际运行时间经权重调整后的值,公式为: $$ \text{vruntime} = \text{实际运行时间} \times \frac{\text{NICE_0_LOAD}}{\text{进程权重}} $$ 权重由进程的`nice`值决定(范围通常为-20到19),优先级越高的进程权重越大。 --- ### 2. `fair_sched_class`的关键数据结构 #### (a) 调度实体(`sched_entity`) 每个进程或进程组对应一个调度实体,存储调度信息: ```c struct sched_entity { struct load_weight load; // 权重(含NICE值映射) u64 vruntime; // 虚拟运行时间 struct rb_node run_node; // 红黑树节点 // 其他字段(如组调度相关) }; ``` #### (b) 红黑树(`cfs_rq->tasks_timeline`) - **作用**:按`vruntime`排序所有可运行进程,左侧节点`vruntime`最小。 - **选择下一个进程**:直接取最左侧节点(即`vruntime`最小的进程)。 --- ### 3. 调度流程详解 #### (a) 进程入队(`enqueue_task_fair`) 1. 将进程的`sched_entity`插入红黑树。 2. 更新CFS运行队列(`cfs_rq`)的负载统计。 #### (b) 进程出队(`dequeue_task_fair`) 1. 从红黑树中移除`sched_entity`。 2. 更新负载统计,触发负载均衡(若需要)。 #### (c) 选择下一个进程(`pick_next_task_fair`) 1. 从红黑树中选择`vruntime`最小的进程。 2. 检查进程的时间片是否用完,决定是否抢占。 --- ### 4. 时间片与抢占机制 - **时间片计算**:基于`sched_latency_ns`(默认6ms)和进程权重动态分配。 $$ \text{时间片} = \text{sched_latency_ns} \times \frac{\text{进程权重}}{\text{总权重}} $$ - **抢占触发**:当进程的`vruntime`超过红黑树中最左侧进程的`vruntime`超过一定阈值时,触发调度。 --- ### 5. 内核4.19的改进 在4.19版本中,CFS的优化包括: 1. **负载均衡增强**:减少跨NUMA节点的迁移开销。 2. **组调度优化**:更精确控制`cgroup`的CPU配额分配。 3. **调试工具改进**:通过`/proc/sched_debug`更直观查看CFS队列状态。 --- ### 6. 与其他调度类的关系 - **层级结构**:`fair_sched_class`优先级低于实时调度类(`rt_sched_class`),确保实时进程优先执行。 - **协作流程**:调度器按优先级遍历调度类(如`stop_sched_class` → `dl_sched_class` → `rt_sched_class` → `fair_sched_class`),选择第一个可运行的进程。 --- ### 总结 `fair_sched_class`通过红黑树和`vruntime`机制,实现了对普通进程的高效公平调度。内核4.19进一步优化了负载均衡和资源隔离,适用于需要高吞吐量的通用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兔斯基灬木木

感谢各位,总结不易,多多支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值