CFS 调度器

简介:

首先简单介绍一下基本的设计思路,CFS思路很简单,就是根据各个进程的权重分配运行时间(权重怎么来的后面再说)。进程的运行时间计算公式为:
分配给进程的运行时间 调度周期 进程权重 所有进程权重之和   (公式1)
调度周期很好理解,就是将所有处于TASK_RUNNING态进程都调度一遍的时间,差不多相当于O(1)调度算法中运行队列和过期队列切换一次的时间(我对O(1)调度算法看得不是很熟,如有错误还望各位大虾指出)。举个例子,比如只有两个进程A, B,权重分别为12,调度周期设为30ms,那么分配给ACPU时间为:30ms * (1/(1+2)) = 10ms,BCPU时间为:30ms * (2/(1+2)) = 20ms那么在这30msA将运行10msB将运行20ms
    公平怎么体现呢?它们的运行时间并不一样阿?
    其实公平是体现在另外一个量上面,叫做virtual runtime(vruntime),它记录着进程已经运行的时间,但是并不是直接记录,而是要根据进程的权重将运行时间放大或者缩小一个比例。
我们来看下从实际运行时间到vruntime的换算公式

vruntime = 实际运行时间 * 1024 / 进程权重 。 (公式2)

为了不把大家搞晕,这里我直接写1024,实际上它等于nice0的进程的权重,代码中是NICE_0_LOAD也就是说,所有进程都以nice0的进程的权重1024作为基准,计算自己的vruntime增加速度。还以上面AB两个进程为例,B的权重是A2倍,那么Bvruntime增加速度只有A的一半。现在我们把公式2中的实际运行时间用公式1来替换,可以得到这么一个结果:

vruntime = (调度周期 进程权重 所有进程总权重) * 1024 / 进程权重 调度周期 * 1024 / 所有进程总权重

看出什么眉目没有?没错,虽然进程的权重不同,但是它们 vruntime增长速度应该是一样的 ,与权重无关。(实际运行时间和权重有关,vruntime也和权重有关,抵消)

好,既然所有进程的vruntime增长速度宏观上看应该是同时推进的,那么就可以用这个vruntime来选择运行的进程,谁的vruntime值较小就说明它以前占用cpu的时间较短,受到了不公平对待,因此下一个运行进程就是它。这样既能公平选择进程,又能保证高优先级进程获得较多的运行时间。这就是CFS的主要思想了。

再补充一下权重的来源,权重跟进程nice值之间有一一对应的关系,可以通过全局数组prio_to_weight来转换,nice值越大,权重越低

下面来分析代码。网上已经有很多cfs的文章,因此我打算换一个方式来写,选择几个点来进行情景分析,包括进程创建时,进程被唤醒,主动调度(schedule),时钟中断。

介绍代码之前先介绍一下CFS相关的结构第一个是调度实体sched_entity,它代表一个调度单位,在组调度关闭的时候可以把他等同为进程。每一个task_struct中都有一个sched_entity,进程的vruntime和权重都保存在这个结构中。那么所有的sched_entity怎么组织在一起呢?红黑树。所有的sched_entityvruntimekey(实际上是以vruntime-min_vruntime为单位,难道是防止溢出?反正结果是一样的)插入到红黑树中,同时缓存树的最左侧节点,也就是vruntime最小的节点,这样可以迅速选中vruntime最小的进程。注意只有等待CPU的就绪态进程在这棵树上,睡眠进程和正在运行的进程都不在树上。我从ibm developer works上偷过来一张图来展示一下它们的关系: 


目录
相关文章
|
数据采集 监控 供应链
ERP系统在大型企业中的实施案例研究
ERP系统在大型企业中的实施案例研究
907 0
java发送微信公众号模板消息
java发送微信公众号模板消息
269 0
|
6月前
|
人工智能 JavaScript
生成式人工智能(GAI)认证:2025最值得考的AI证书!
生成式人工智能(GAI)认证由全球教育巨头 Pearson 推出,融合技术原理、实战应用与伦理合规的三维培养框架。该项目与 AI 领域领先企业合作开发,涵盖提示优化、基础提示工程及社会影响等核心内容,助力学习者全面掌握 GAI 技能。中文版认证已落地中国,由达内教育与恒利联创战略合作推广,深度融合本土 AI 平台。作为高含金量的全球认可证书,GAI 认证可提升职业竞争力,满足行业对复合型 AI 人才的需求,为个人和企业开辟数字时代新机遇。
|
6月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
372 1
|
监控 安全 网络安全
|
JSON 前端开发 Java
【Java笔记+踩坑】SpringMVC基础
springmvc简介、入门案例、bean加载控制、PostMan工具的使用、普通和JSON和日期格式请求参数传递、响应JSON或jsp或文本、Rest风格
【Java笔记+踩坑】SpringMVC基础
|
JavaScript
【Vue面试题十九】、Vue常用的修饰符有哪些有什么应用场景?
这篇文章详细介绍了Vue中的修饰符,包括表单修饰符、事件修饰符、鼠标按键修饰符、键值修饰符和`v-bind`修饰符,解释了它们各自的功能和应用场景,并通过代码示例展示了如何在实际开发中使用这些修饰符来简化事件处理和提高代码的可读性及效率。
【Vue面试题十九】、Vue常用的修饰符有哪些有什么应用场景?
|
SQL Go 数据库
如何通过命令行创建数据库?
如何通过命令行创建数据库?
639 14
|
容器 安全 Docker
浅谈容器逃逸
【6月更文挑战第2天】容器逃逸是严重的安全风险,威胁云计算系统的安全。
|
JavaScript vr&ar 数据库
一篇文章讲明白JS获取当前日期
一篇文章讲明白JS获取当前日期
391 0