【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2777252.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-卷积码原理

目录 一、引言 二、卷积编码的发展历史 2.1 卷积码的起源 2.2 主要发展阶段 2.3 重要里程碑 三、卷积编码的基本概念 3.1 基本定义 3.2 编码器框图 3.3 编码多项式 3.4 网格图(Trellis)描述 四、MATLAB示例 一、引言 卷积编码,作为数字通信领域中的一项…

C++,stl,栈stack和队列queue详解

1.栈stack 1.stack基本概念 2.stack常用接口 代码示例&#xff1a; #include<bits/stdc.h> using namespace std;int main() {stack<int> stk;stk.push(7);stk.push(9);stk.push(5);cout << "栈的size为&#xff1a;" << stk.size() <…

机器学习系列——(十九)层次聚类

引言 在机器学习和数据挖掘领域&#xff0c;聚类算法是一种重要的无监督学习方法&#xff0c;它试图将数据集中的样本分组&#xff0c;使得同一组内的样本相似度高&#xff0c;不同组间的样本相似度低。层次聚类&#xff08;Hierarchical Clustering&#xff09;是聚类算法中的…

2.7日学习打卡----初学RabbitMQ(二)

2.7日学习打卡 JMS 由于MQ产品很多&#xff0c;操作方式各有不同&#xff0c;于是JAVA提供了一套规则 ——JMS&#xff0c;用于操作消息中间件。JMS即Java消息服务 &#xff08;JavaMessage Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面 向消息中间件的…

Spring Boot整合MyBatis Plus实现基本CRUD与高级功能

文章目录 1. 引言2. 项目搭建与依赖配置2.1 添加MyBatis Plus依赖2.2 配置数据源与MyBatis Plus 3. 实现基本CRUD功能3.1 创建实体类3.2 创建Mapper接口3.3 实现Service层3.4 控制器实现 4. 高级功能实现4.1 自动填充功能4.2 乐观锁功能4.3 逻辑删除功能 5. 拓展&#xff1a;My…

EasyExcel操作Excel表格

一、EasyExcel介绍 1.1 介绍 EasyExcel 是一个基于 Java 的简单易用的 Excel 文件读写工具&#xff0c;它提供了一种简单而又高效的方式来读取、写入和操作 Excel 文件。EasyExcel 是阿里巴巴开源的项目&#xff0c;它旨在简化开发人员处理 Excel 文件的流程&#xff0c;使得…

【漏洞复现】狮子鱼CMS某SQL注入漏洞01

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

【JavaScript 漫游】【013】Date 对象知识点摘录

文章简介 本文为【JavaScript 漫游】专栏的第 013 篇文章&#xff0c;记录了 JS 语言中 Date 对象的重要知识点。 普通函数的用法构造函数的用法日期的运算静态方法&#xff0c;包括&#xff1a;Date.now()、Date.parse() 和 Date.UTC()实例方法&#xff0c;包括&#xff1a;…

初识文件包含漏洞

目录 什么是文件包含漏洞&#xff1f; 文件包含的环境要求 常见的文件包含函数 PHP伪协议 file://协议 php://协议 php://filter php://input zip://、bzip2://、zlib://协议 zip:// bzip2:// zlib:// data://协议 文件包含漏洞演示 案例1&#xff1a;php://inp…

使用 Elasticsearch 和 OpenAI 构建生成式 AI 应用程序

本笔记本演示了如何&#xff1a; 将 OpenAI Wikipedia 向量数据集索引到 Elasticsearch 中使用 Streamlit 构建一个简单的 Gen AI 应用程序&#xff0c;该应用程序使用 Elasticsearch 检索上下文并使用 OpenAI 制定答案 安装 安装 Elasticsearch 及 Kibana 如果你还没有安装好…

静态时序分析:工艺库的特征化条件和工作条件

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 一个工艺库(technology library) 会指定该库的特征化条件(characterization condition)和工作条件(operating condition)。一般在工艺库的开头会看见以下信息。 …

5.1 灯光色彩与视觉

5.1 灯光色彩与视觉 视觉成像 灯光与物体的反应:吸收,反射和折射 色彩:光照到物体上,物体吸收其他光源色,只反射该颜色光,所以物体 表面呈现该颜色 视觉:该颜色光进入人眼刺激感光细胞,并在视网膜上形成影像. ABSORBTION 一、基础灯光 1.环境光&#xff08;Ambient Light…

电商小程序05用户注册

目录 1 搭建页面2 设置默认跳转总结 我们上一篇拆解了登录功能&#xff0c;如果用户没有账号就需要注册了。本篇我们介绍一下注册功能的实现。 1 搭建页面 打开应用&#xff0c;点击左上角的新建页面 输入页面的名称&#xff0c;用户注册 删掉网格布局&#xff0c;添加表单容…

华为OD机试 - 智能成绩表( Python C C++ JavaGo JS PHP)

题目描述 小明是一名新老师&#xff0c;他需要将学生按考试总分或单科分数进行排名。学生的信息包括姓名、科目和对应的分数。帮助小明完成这个任务吧&#xff01; 输入描述 第一行包含两个整数 n 和 m&#xff0c;分别代表学生人数和科目数量。 0 < n < 1000 < m &…

【Makefile语法 01】程序编译与执行

目录 一、编译原理概述 二、编译过程分析 三、编译动静态库 四、执行过程分析 一、编译原理概述 make&#xff1a; 一个GCC工具程序&#xff0c;它会读 makefile 脚本来确定程序中的哪个部分需要编译和连接&#xff0c;然后发布必要的命令。它读出的脚本&#xff08;叫做 …

Mysql Day03

多表设计 一对多 在多的一方添加外键约束&#xff0c;关联另外一方主键 一对一 任意一方添加外键约束&#xff0c;关联另外一方主键 多对多 建立第三张中间表&#xff0c;中间表至少包含两个外键&#xff0c;分别关联两方主键 idstu_idcourse_id 1 11 2 12313421524 案…

传输频宽是啥?对网速影响有多大?

频宽&#xff0c;即WIFI频道宽度&#xff0c;又称为WIFI信道宽度&#xff0c;是WiFi Channel width的缩写。从科学的定义来说&#xff0c;Wi-Fi频道宽度&#xff0c;是指Wi-Fi无线信号在频谱上所占用的带宽大小。它决定了Wi-Fi网络的数据传输速率和稳定性&#xff0c;一般有20M…

【深度学习】:滴滴出行-交通场景目标检测

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主&#xff0c;接实验技术指导1对1 有任…

医学护理答案怎么查找? #笔记#学习方法#微信

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式&#xff0c;可以快速查找问题解析&#xff0c;加深对题目答案的理解。 1.滴墨书摘 这款软件相当于一个在线“摘抄本”&#xff0c;我们可以利用它来记录一些阅读时遇到的好句子或者是段落&#xff0c;或许下次…

VitePress-12-markdown中使用vue的语法

前言 VitePress 中&#xff0c;markdown文档最终都会转换成为 html文件&#xff0c;我们在访问的时候&#xff0c;也是直接访问的 xxx.html 文件。而且&#xff0c;markdown文档会被作为 [vue单文件] 进行处理&#xff0c;因此&#xff0c;我们我们可以在文档中使用 vue 语法&…