【linux温故】CFS调度
写在前面
网上关于CFS 调度器的文章多如牛毛,没必要自己写。很多文章写的都非常好。
很多文章里,关键的技术点,都是一样的,只是各个文章说法不一样。
掌握了核心的,关键的,其他的,如果工作中需要的,可以详细了解。
这篇文章只是讲解一些 CFS的基础概念。“术” 的内容可以参考其他大佬的文章。
CFS 的基础概念其实就四个:
- 调度类
- 权重
- 虚拟运行时间
- 红黑树
关于红黑树的内容可以参考之前的《【linux温故】红黑树》文章。这里就不说了。
简介
Linux 在 2.6.24 之后,使用了新的调度程序 CFS。CFS即Completely Fair Scheduler,顾名思义,完全公平调度器。
很容易理解。
所有非实时可运行进程都以 虚拟运行时间 为键值用一棵红黑树进行维护,以完成更公平高效地调度所有任务。CFS 弃用 active/expired 数组和动态计算优先级,不再跟踪任务的睡眠时间和区别是否交互任务,而是在调度中采用基于时间计算键值的红黑树来选取下一个任务,根据所有任务占用 CPU 时间的状态来确定调度任务优先级。
关于调度
首先要明白,CFS 调度,只是调度的一种。 CFS 调度针对的只是 普通进程。普通进程也有优先级啊,对,CFS 里面也有 权重(weight),权重越大的,当然得到的CPU 时间更多了,但是,这样不是和你说的 “完全” 公平概念不是不一样了吗?这玩意儿,妙就秒在这里,后面说。
首先,一个重要的基础概念是:“调度类”,这块摘抄一下吧:
也就是说,系统里面有很多调度类,有的调度类是给 实时进程用来做调度的,有的是给 普通进程做调度的。
每个进程在创建的时候,就会给他指定一种调度类,每一种调度类的优先级不一样,高优先级的调度类里面的进程,优先执行。
上面截图中解释了各个调度器。以及 linux 在选择下一个 task 的时候,是如何遍历调度器获取到的。
所以,最重要的一点是,,CFS 只是系统中的一种调度类而已,用来调度 普通进程的。
CFS 权重
这是第二个重点的概念——权重。
这其实也是一个辅助概念,也是为最后 虚拟运行时间(virtual runtime)准备的。
简单说,就是一个进程在创建的时候,会有个 nice 值,表示这个进程的“谦让”程度 (-20 ~ 19),越大,表示越谦让。进程的权重,其实就是以 nice 为下标的数组中的对应项。
虚拟运行时间 (virtual runtime)
最后,这个 虚拟运行时间 才是我们最重要的概念。CFS 就是根据这个来选取下一个 task 的,每次从 红黑树 里面取 virtual runtime 最小的那一个对应的 task。(也就是红黑树的最左边的左节点的元素)。还是看下摘录的内容吧:
这里写的有点绕,其实 虚拟运行时间 的概念,很简单。
CFS 只是尽量保证每个进程的 虚拟运行时间 是相同的。之所以说是 “虚拟” ,是因为这个不是实际的运行时间。举个例子:
比如A进程从创建到目前,一共运行了 3600ms,如果A进程的nice 值是 0, 对应的 weight 就是 1024,那它的虚拟运行时间:3600* 1024/1024 = 3600ms ,就是实际运行的时间。但是如果B进程来了,他的运行时间也是 3600ms, 但是他的nice 值是 -10,weight = 9548,那它的虚拟运行时间是:3600 * 1024 / 9548 = 386ms!
也就是说,从 CFS 调度器看来,B 这个进程目前只运行了 386ms,然后他说,我应该给运行时间少的B多分配些时间运行!A就说了,你放屁,他和我一样运行了 3600ms 呢,你不是说公平吗?为啥偏爱他?CFS 说,你说的 3600ms 是 实际运行时间 我不看这个的,我所谓的公平,是指我保证所有的进程的 虚拟运行时间 是一样的。A:…(一万个草泥马浮现在脑海中)…
A 的nice 值(谦让值)太高导致的,这才是原罪。
从 CFS 的角度看,每个人的时钟速度是不一样的,有个进程的 时钟走的块,有的时钟走的慢。走的块的就是那种低优先级的,走的块的,就是那种高优先级的进程。
CFS,“完全公平”调度,这句话本身就是有歧义的,它实际上,非常不公平。本质上,谁的优先级高,它就还是偏爱谁。
CFS 之所以这么做,其实是有他的考虑的:就是能高优服务于交互式进程。提升用户交互的体验。
这么一想来,CFS 确实挺妙的。
源码分析
这里就不分析了,可以参考下这篇:
https://www.cnblogs.com/TreeDream/p/8085133.html
参考
上面的内容,基本都是参考别人的文章:
http://www.wowotech.net/process_management/447.html
https://zhuanlan.zhihu.com/p/372441187
https://blog.csdn.net/gatieme/article/details/52067748
相关文章:

【linux温故】CFS调度
写在前面 网上关于CFS 调度器的文章多如牛毛,没必要自己写。很多文章写的都非常好。 很多文章里,关键的技术点,都是一样的,只是各个文章说法不一样。 掌握了核心的,关键的,其他的,如果工作中…...

计算机网络之一
目录 1.因特网概述 1.1网络、互连网(互联网)和因特网 1.2.因特网发展的三个阶段 1.3基于ISP的三层架构的因特网 1.4.因特网的组成 2.三种交换方式 2.1电路交换 2.2分组交换 1.因特网概述 1.1网络、互连网(互联网)和因特网…...

从一到无穷大 #23 《流计算系统图解》书评
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言内容总结 引言 春节假期回到家里断然是不会有看纸质书的时间的。造化弄人&#…...

华为问界M9:领跑未来智能交通的自动驾驶黑科技
华为问界M9是一款高端电动汽车,其自动驾驶技术是该车型的重要卖点之一。华为在问界M9上采用了多种传感器和高级算法,实现了在不同场景下的自动驾驶功能,包括自动泊车、自适应巡航、车道保持、自动变道等。 华为问界M9的自动驾驶技术惊艳之处…...

Java图形化界面编程——弹球游戏 笔记
Java也可用于开发一些动画。所谓动画,就是间隔一定的时间(通常小于0 . 1秒 )重新绘制新的图像,两次绘制的图像之间差异较小,肉眼看起来就成了所谓的动画 。 为了实现间隔一定的时间就重新调用组件的 repaint()方法,可以借助于…...

浅谈人工智能之深度学习~
目录 前言:深度学习的进展 一:深度学习的基本原理和算法 二:深度学习的应用实例 三:深度学习的挑战和未来发展方向 四:深度学习与机器学习的关系 五:深度学习与人类的智能交互 悟已往之不谏࿰…...

【复现】大华 DSS SQL 注入漏洞_46
目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 大华DSS是大华的大型监控管理应用平台,支持几乎所有涉及监控等方面的操作,支持多级跨平台联网等操作。 可…...

Python 中的断点类型详解
前言 在 Python 中,断点是一种在代码中设置的标记,用于在程序执行过程中停止或中断程序的执行,以便调试和查看程序的内部状态。断点是调试工具的关键组成部分,能够帮助开发者定位和解决代码中的错误。本文将详细介绍 Python 中的…...

一步步建立一个C#项目(连续读取S7-1200PLC数据)
这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先创建一个窗体应用。 1、窗体应用 2、配置存储位置 3、选择框架 拖拽一个Button,可以选择视图菜单---工具箱 4、工具箱 拖拽Lable控件和TextBook控件 5、拖拽控件 接下来…...
Hive窗口函数详解
一、 窗口函数知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路: LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowing…...

车载电子电器架构 —— 电子电气系统功能开发
车载电子电器架构 —— 电子电气系统功能开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,四海皆…...

LeetCode--代码详解 7.整数反转
7.整数反转 题目 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 …...

《统计学简易速速上手小册》第6章:多变量数据分析(2024 最新版)
文章目录 6.1 主成分分析(PCA)6.1.1 基础知识6.1.2 主要案例:客户细分6.1.3 拓展案例 1:面部识别6.1.4 拓展案例 2:基因数据分析 6.2 聚类分析6.2.1 基础知识6.2.2 主要案例:市场细分6.2.3 拓展案例 1&…...

创新S3存储桶检索:Langchain社区S3加载器搭载OpenAI API
在瞬息万变的数据存储和处理领域,将高效的云存储解决方案与先进的 AI 功能相结合,为处理大量数据提供了一种变革性的方法。本文演示了使用 MinIO、Langchain 和 OpenAI 的 GPT-3.5 模型的实际实现,重点总结了存储在 MinIO 存储桶中的文档。 …...

【Linux技术宝典】Linux入门:揭开Linux的神秘面纱
文章目录 官网Linux 环境的搭建方式一、什么是Linux?二、Linux的起源与发展三、Linux的核心组件四、Linux企业应用现状五、Linux的发行版本六、为什么选择Linux?七、总结 Linux,一个在全球范围内广泛应用的开源操作系统,近年来越来…...

C语言---------对操作符的进一步认识
操作符中有⼀些操作符和⼆进制有关系,我们先学习了⼀下⼆进制的和进制转换的知识。 1.原码、反码和补码。 有符号整数的三种表⽰⽅法均有符号位和数值位两部分, 2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位。 符号…...

HarmonyOS 鸿蒙 ArkTS ArkUI 页面之间切换转换动画设置
第一步:导入 import promptAction from ohos.promptAction 第二步:在build下方写入 pageTransition(){PageTransitionEnter({ duration: 1200 }).slide(SlideEffect.Right)PageTransitionExit({ delay: 100 }).translate({ x: 100.0, y: 100.0 }).opac…...

《CSS 简易速速上手小册》第8章:CSS 性能优化和可访问性(2024 最新版)
文章目录 8.1 CSS 文件的组织和管理8.1.1 基础知识8.1.2 重点案例:项目样式表结构8.1.3 拓展案例 1:使用BEM命名规范8.1.4 拓展案例 2:利用 Sass 混入创建响应式工具类 8.2 提高网页加载速度的技巧8.2.1 基础知识8.2.2 重点案例:图…...

Peter算法小课堂—背包问题
我们已经学过好久好久的动态规划了,动态规划_Peter Pan was right的博客-CSDN博客 那么,我用一张图片来概括一下背包问题。 大家有可能比较疑惑,优化决策怎么优化呢?答案是,滚动数组,一个神秘而简单的东西…...

网易腾讯面试题精选----50 个 Git 面试问题
介绍 Git 是 DevOps 之旅的起点。所以,我只是概述了 50 个快速问题以及 Git 的答案。这些问题非常快,你可以在 DevOps 面试中问。它适合初学者到中级水平。 面试问答 1.问:什么是Git? 答:Git 是一个分布式版本控制系统,允许多个开发人员在一个项目上进行协作并跟踪源代…...

Android CMakeLists.txt语法详解
一.CMake简介 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MSnmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的…...

Vue3快速上手(二)VSCode官方推荐插件安装及配置
一、VSCode官方插件安装,如下图2款插件 在用vite创建的程序里,提示提安装推荐的插件了,如下图: 二、配置 在设置-扩展里找到Volar插件,将Dot Value勾选上。这样在ref()修改变量时,会自动填充.value,无需…...

等保2、3级所需设备
三级等保要求及所需设备 《等级保护基本要求》所需设备 结构安全(G3) b)应保证网络各个部分的宽带满足业务高峰期需要; g)应按照对业务服务的需要次序来指定宽带分配优先级别,保证在网络发生拥堵的时候优先保护重要主机 负载均衡…...

6 scala-面向对象编程基础
Scala 跟 Java 一样,是一门面向对象编程的语言,有类和对象的概念。 1 类与对象 与 Java 一样,Scala 也是通过关键字 class 来定义类,使用关键字 new 创建对象。 要运行我们编写的代码,同样像 Java 一样,…...

【linux温故】linux调度机制
假如你是设计者,你会设计怎样的调度机制呢? 时间片 最简单的,小学生都能想出来的一种,每个 ready task,按照一个固定的时间片轮流执行。 大家不要抢,挨个儿排队执行。执行完时间片,就排在后面…...

django中如何使用mysql连接池
一:介绍 在Django中使用MySQL时,通常情况下,Django的数据库层会为你管理数据库连接。Django的数据库接口是线程安全的,这意味着它会自动为每个线程创建和管理数据库连接。在大多数情况下,你不需要手动创建线程池来管理…...

3D高斯溅射:面向三维场景的实时渲染技术
1. 前言 高斯溅射技术【1】一经推出,立刻引起学术界和工业界的广泛关注。相比传统的隐式神经散射场渲染技术,高斯溅射依托椭球空间,显性地表示多目图像的三维空间关系,其计算效率和综合性能均有较大的提升,且更容易理…...

【数据结构】13:表达式转换(中缀表达式转成后缀表达式)
思想: 从头到尾依次读取中缀表达式里的每个对象,对不同对象按照不同的情况处理。 如果遇到空格,跳过如果遇到运算数字,直接输出如果遇到左括号,压栈如果遇到右括号,表示括号里的中缀表达式已经扫描完毕&a…...

MySQL进阶查询篇(9)-视图的创建和应用
数据库视图是MySQL中一个非常重要的概念。它是一个虚拟表,由一个查询的结果集组成。数据库视图为用户提供了一种简化数据查询和操作的方式。本文将介绍MySQL数据库视图的创建和应用。 1. 创建数据库视图 要创建MySQL数据库视图,我们使用CREATE VIEW语句…...

Rhino.Inside带材质将Revit模型bake到Rhino
Hello大家好!我是九哥~ 今天来讲一个小技巧,就是我通常采用RIR将Revit的模型的Geometry Bake到Rhino,肯定是没有材质的,那么如果我们需要带材质那要怎么办呢? 对于会的人,其实挺简单的,只需要…...