当前位置: 首页 > news >正文

O(1)调度算法与CFS

目录

引言

linux内核的O(1)进程调度算法介绍

主要特点

工作原理

优点

缺点

运行队列

活动队列

过期队列

active指针和expired指针

O(1)调度器,两个队列的机制

两个队列的机制如下:

这个算法后期被CFS替代

CFS

工作原理:

主要特点:

优势:

发展:

CFS相对于O(1)调度器有以下几个优点:


引言

在Linux操作系统中,进程调度算法是核心组件之一,它负责决定哪个进程将获得CPU时间以及它们将获得多长时间。历史上,Linux经历了多种调度算法的演变,其中O(1)调度算法和完全公平调度器(Completely Fair Scheduler,简称CFS)是两个重要的里程碑。
O(1)调度算法,顾名思义,其设计目标是在确定的时间内完成进程调度,不依赖于进程数量。这种算法在Linux内核的2.6版本中引入,它通过使用两个数组来分别管理活动进程和过期进程,实现了固定时间的调度复杂度。O(1)调度算法在当时被认为是革命性的,因为它极大地提高了调度器的性能,尤其是在高负载情况下。
随后,Linux内核在2.6.23版本中引入了CFS,这是一种更为先进和公平的调度算法。CFS不再使用固定的时间片,而是基于虚拟运行时间(vruntime)来调度进程,确保所有进程获得公平的CPU时间份额。CFS的核心思想是维护一个红黑树,根据进程的vruntime来平衡进程的调度,从而实现真正的公平性。
接下来,我们将深入探讨O(1)调度算法与CFS的工作原理、它们各自的特点以及它们对Linux系统性能的影响。通过这一分析,我们能够更好地理解Linux调度器的发展历程,以及它是如何不断优化以适应现代计算需求的。
 

linux内核的O(1)进程调度算法介绍

Linux内核中的O(1)调度器是Linux早期版本中的一个进程调度算法,它在Linux 2.6版本内核中首次引入,并在2.6.23版本内核之前一直作为默认的调度器。O(1)调度器的名称来源于其设计目标:在任何给定的系统负载下,调度决策的时间复杂度都是常数时间,即O(1)。

以下是O(1)调度器的主要特点和原理:

主要特点

两个运行队列:

活动队列:包含所有正在运行的进程。

过期队列:包含所有已经耗尽时间片的进程。

时间片轮转:

每个进程在活动队列中都有一个固定的时间片(quantum)来运行。

当进程用完其时间片后,它会被移到过期队列。

固定优先级:

进程根据其nice值被分配到不同的优先级类,每个优先级类有自己的活动队列和过期队列。

动态优先级调整:

调度器会根据进程的行为动态调整其优先级。

工作原理

选择进程:

调度器从最高优先级的非空活动队列中选择下一个要运行的进程。

如果活动队列为空,则交换活动队列和过期队列,使所有进程重新获得时间片。

时间片管理:

每个进程在运行时都会减少其时间片。

时间片耗尽的进程会被移到过期队列。

队列管理:

为了保持O(1)的时间复杂度,活动队列和过期队列都通过数组实现,每个优先级类对应数组中的一个槽位。

负载平衡:

调度器会在必要时在活动队列和过期队列之间进行负载平衡,确保CPU时间在所有进程之间公平分配。

优点

常数时间调度决策:在任何系统负载下,调度决策都非常快。

良好的交互性能:通过动态优先级调整,调度器能够提供较好的交互性能。

缺点

不公平的负载平衡:在多CPU系统中,O(1)调度器可能不会很好地平衡负载,导致某些CPU比其他CPU更忙。

固定时间片:固定时间片可能导致某些进程在没有完成其工作时就被迫让出CPU。

O(1)调度器最终被CFS(Completely Fair Scheduler,完全公平调度器)取代,CFS从Linux 2.6.23版本开始成为默认的调度器。CFS的目标是提供一个更公平的CPU分配策略,它不是基于固定时间片,而是基于虚拟运行时间(vruntime)来调度进程。

对于两个运行队列而言,可以简单的理解为两个开散列哈希,相同PRI的进程在同一个小桶。

不同的PRI在不同的小桶排队。

运行队列

一个CPU拥有一个runqueue,如果有多个CPU就要考虑进程个数的负载均衡问题  。

优先级
普通优先级:100~139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)
实时优先级:0~99(不关心)

活动队列

时间片还没有结束的所有进程都按照优先级放在该队列。
nr_active: 总共有多少个运行状态的进程。
queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级
从该结构中,选择一个最合适的进程,过程是怎么的呢?
1. 从0下表开始遍历queue[140]。
2. 找到第一个非空队列,该队列必定为优先级最高的队列。
3. 拿到选中队列的第一个进程,开始运行,调度完成!
4. 遍历queue[140]时间复杂度是常数!但还是太低效了!
bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个
比特位表示队列是否为空,这样,便可以大大提高查找效率

过期队列

过期队列和活动队列结构一模一样
过期队列上放置的进程,都是时间片耗尽的进程
当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算

active指针和expired指针

active指针永远指向活动队列
expired指针永远指向过期队列
可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。
没关系,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法

O(1)调度器,两个队列的机制

O(1)调度器使用了两个主要的队列机制来管理进程,这两个队列分别是:

运行队列(Run Queue): 运行队列是所有可运行进程的列表。在O(1)调度器中,运行队列被分为140个不同的优先级队列,每个队列对应一个不同的动态优先级。动态优先级是基于进程的行为和特性(如睡眠时间和运行时间)动态调整的。进程根据其优先级被放置到相应的队列中。

时间片:每个队列中的进程会被分配一个时间片,用于在CPU上执行。时间片的大小与优先级相关,优先级越高,时间片通常越小。

轮转调度:O(1)调度器使用轮转调度算法(Round Robin),在每个优先级队列内部,进程按顺序使用CPU,当一个进程用完其时间片后,它会被放回队列的末尾。

过期队列(Expired Queue): 当一个进程用完了它的时间片,它会被移到过期队列。这个队列是为了处理那些已经用完时间片的进程。在O(1)调度器中,过期队列同样按照优先级组织。

两个队列的机制如下:

正常工作流程:

当一个进程变为可运行状态时,它会被放入对应的优先级运行队列。

调度器选择最高优先级队列中的第一个进程进行调度。

当进程的时间片用完时,它会被移到过期队列的相应优先级位置。

调度器会检查过期队列,如果有进程,则可能重新计算其优先级,并将其放回运行队列。

优先级调整:

进程的优先级会根据其行为(如是否是I/O密集型或CPU密集型)动态调整。

调度器会定期进行优先级更新,以确保公平性和响应性。

O(1)调度器的设计目标是为了在多处理器系统和大规模负载下提供高效的调度,但是随着时间的推移,它被其他更先进的调度器(如CFS,Completely Fair Scheduler)所取代,因为CFS提供了更好的性能和更公平的调度策略。CFS不再使用固定的时间片和优先级队列,而是采用红黑树来管理进程,并试图为所有进程提供相等的CPU时间份额。

这个算法后期被CFS替代

O(1)调度器在Linux内核中并不是一直被使用的。虽然它在Linux 2.6系列内核中作为默认调度器引入,并且在一段时间内得到了广泛的使用,但它最终被更先进的调度器所取代。

具体来说,O(1)调度器在Linux 2.6.23内核版本中被完全公平调度器(Completely Fair Scheduler, CFS)所取代。CFS是一个基于红黑树的调度器,它旨在提供一个更加公平和高效的CPU时间分配策略,而不是简单地基于固定时间片。CFS的目标是为所有运行在系统上的进程提供等量的CPU时间,这被称为“完全公平”。

CFS

完全公平调度器(Completely Fair Scheduler, CFS)是Linux内核中的一个调度器,它自Linux 2.6.23版本开始成为默认的CPU调度器。CFS的设计目标是提供一个对所有进程都公平的CPU时间分配策略。以下是CFS的主要特点和介绍:

工作原理:

基于红黑树:CFS使用一种数据结构叫做红黑树来管理可运行的进程。每个进程节点都存储了该进程的虚拟运行时间(vruntime),这是CFS用来决定调度顺序的关键指标。

vruntime:虚拟运行时间是CFS用来衡量一个进程应该获得多少CPU时间的一种方式。vruntime越低的进程会获得更多的CPU时间。

时间片:尽管CFS不是基于固定时间片的,但它仍然会根据系统的负载和进程的数量来分配一个大致的时间片。这个时间片是动态调整的。

主要特点:

公平性:CFS试图确保所有可运行进程获得相等的CPU时间份额,这是通过计算每个进程的vruntime并选择vruntime最小的进程来执行的。

多核优化:CFS能够有效地在多核处理器上分配负载,它尝试保持负载均衡,避免在某些核心上堆积太多的工作。

动态优先级调整:CFS会根据进程的行为和系统负载动态调整进程的优先级,这有助于优化系统性能和响应时间。

睡眠公平性:CFS还考虑了进程的睡眠时间,确保那些睡眠时间较长的进程在醒来时能够获得优先的CPU时间。

可扩展性:CFS的设计使其易于扩展和适应不同的工作负载和硬件架构。

优势:

高效的负载均衡:CFS通过其负载均衡算法,确保了在多核系统上CPU时间分配的均衡。

适应性:CFS能够适应各种不同的工作负载,无论是CPU密集型、I/O密集型还是交互式任务。

低延迟:CFS的设计有助于减少调度延迟,提高系统的响应性。

发展:

自CFS被引入以来,它一直是Linux内核中CPU调度的核心部分,并且随着时间的推移,它不断地被社区的开发者们改进和优化,以适应不断变化的硬件和软件需求。

总的来说,CFS是Linux内核中一个非常重要的组件,它通过其独特的调度策略,为Linux系统提供了高效、公平和响应迅速的CPU时间管理。

CFS相对于O(1)调度器有以下几个优点:

更好的多核支持:CFS能够更好地在多核处理器上平衡负载。

动态调整:CFS根据进程的行为动态调整其优先级,而不是依赖于固定的时间片。

公平性:CFS使用虚拟运行时间(vruntime)来确保所有进程公平地分享CPU时间。

可扩展性:CFS的设计更加模块化,易于扩展和维护。

自Linux 2.6.23版本以来,CFS一直是Linux内核的默认调度器,并且随着时间的推移,它不断地被改进和优化。因此,O(1)调度器在Linux内核的发展历程中已经被淘汰,不再是现代Linux系统的标准调度器。

相关文章:

O(1)调度算法与CFS

目录 引言 linux内核的O(1)进程调度算法介绍 主要特点 工作原理 优点 缺点 运行队列 活动队列 过期队列 active指针和expired指针 O(1)调度器,两个队列的机制 两个队列的机制如下: 这个算法后期被CFS替代 CFS 工作原…...

SpringBoot——静态资源访问的四种方式

1.默认的静态资源目录 /static /public /resources /META-INF/resources 动态资源目录:/templates 2.resources静态资源目录图片存放 3. 静态资源访问 3.1.通过路径访问静态资源 http://localhost:8080/a.jpg http://localhost:8080/b.jpg …...

WPF中的Style如何使用

在 WPF 中,Style 是一个非常重要的概念,它用于定义控件的默认外观和行为。以下是如何使用 Style 的一些基本步骤和示例: 1. 定义 Style 资源 通常在 XAML 的资源部分(ResourceDictionary)中定义样式。 2. 指定 Targ…...

数据分析案例-欺诈性电子商务交易数据集可视化分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…...

java互联网医院智能导诊系统源码,Uniapp前端开发框架,支持一次编写,多端运行

智慧导诊系统源码,java源码,大屏机自动导诊,互联网医院智能导诊系统源码 老是全身无力,挂什么科? 经常头痛,挂什么科? 总是失眠,又得挂哪个科? 世界上最遥远的距离再加…...

公交线路查询web管理系统||公交线路查询|基于SprinBoot+vue公交线路查询系统(源码+数据库+文档)

公交线路查询web管理系统 目录 基于SprinBootvue公交线路查询系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&#xf…...

AI对于智能网联汽车发展路径的演化的助力

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

linux java17 - linux环境 centos7卸载java8安装java17

前言 因为springboot3不再支持java8,最近开始转java17,具体要求如下 ‌Spring Boot 3要求使用Java 17或更高版本,不支持Java 8。‌ Spring Boot 3.0 正式版已经发布,并且明确要求最低支持Java 17‌12。 Spring Boot 3.0 正式版发…...

高中数学:立体几何-外接球的外心法

文章目录 一、外心法定义二、习题1、例题一2、例题二3、例题三4、例题四 一、外心法定义 依然以三棱锥为例 即,找到三棱锥的外接球的球心,从而可以确定出外接球的半径R。 而三棱锥有四个顶点,这四个顶点必然都在外接球的球面上。 寻找思路…...

【Python-AI篇】人工智能python基础-计算机组成原理

1. 计算机组成原理 2. python基础(查漏补缺) 2.1 字符串 2.1.1 字符串查找方法 find(): 检测某个字符串是否包含在这个字符串中,在的话返回下标,不在的话返回-1index(): 检测某个字符串是否包含在这个字…...

Java Exercise

3194. 最小元素和最大元素的最小平均值 Solution类 class Solution {public double minimumAverage(int[] nums){int n nums.length / 2;Arrays.sort(nums);int average 0;ArrayList<Double> arrayList new ArrayList<>();int i;int j;for (i 0, j nums.leng…...

滚雪球学Redis[9.1讲]:Redis的常见问题与最佳实践

全文目录&#xff1a; 前言1. Redis的常见问题排查常见错误信息与解决方案性能瓶颈的识别与处理数据一致性问题的排查 2. Redis的最佳实践Redis使用中的通用原则典型业务场景中的最佳实践如何避免Redis中的反模式 小结下期预告 前言 在上一章【第八章&#xff1a;Redis的扩展与…...

python获取当前鼠标位置的RGB值

效果 依赖 pip install Pillow pyautoguisudo apt install gnome-screenshot代码 import pyautogui import timedef get_rgb_at_mouse():try:while True:# 获取当前鼠标的位置x, y pyautogui.position()# 截取当前屏幕图像screenshot pyautogui.screenshot()# 获取鼠标位置…...

Ubuntu20.04运行深蓝运动规划hw_5

前言 环境&#xff1a; ubuntu 20.04 &#xff1b; ROS版本&#xff1a; noetic&#xff1b; 问题 运行 roslaunch waypoint_trajectory_generator test.launch 出现如下错误 Invalid argument "/map" passed to canTransform argument source_frame in tf2 fra…...

删除node_modules文件夹

前言 当安装了较多模块后&#xff0c;node_modules目录下的文件会很多&#xff0c;直接删除整个目录会很慢&#xff0c;下面介绍些快速删除node_modules目录的方法。 方法一&#xff1a;使用rimraf模块的命令 在全局安装rimraf模块&#xff0c;然后通过其命令来快速删除node…...

基于Springboot+Vue的民宿管理系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 在这个…...

[LeetCode] 542. 01矩阵

题目描述&#xff1a; 给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出…...

国产AI模型“Yi-Lightning”逆袭超越GPT-4!

近日&#xff0c;全球千万用户盲测投票产生的AI模型排行榜公布&#xff0c;令人惊喜的是&#xff0c;国产AI模型“Yi-Lightning”成功逆袭&#xff0c;一举超越了此前长期占据榜首的GPT-4。 Ai 智能办公利器 - Ai-321.com 人工智能 - Ai工具集 - 全球热门人工智能软件ai工具集…...

安卓設備上怎麼設置HTTP代理?

HTTP代理是一種仲介伺服器&#xff0c;它在用戶的設備和互聯網之間傳遞請求。通過HTTP代理&#xff0c;請求會先發送到代理伺服器&#xff0c;然後由代理伺服器轉發到目標網站。這樣&#xff0c;目標網站只會看到代理伺服器的IP地址&#xff0c;而不是真實IP地址。這種機制可以…...

学习Redisson实现分布式锁

官网&#xff1a;https://redisson.org/ 官方文档&#xff1a;https://redisson.org/docs/getting-started/ 官方中文文档&#xff1a;https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 1、引入依赖 <!--redisson--> <dependency><groupId>or…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...