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就要考虑进程个数的负载均衡问题 。
活动队列
过期队列
active指针和expired指针
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学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

java互联网医院智能导诊系统源码,Uniapp前端开发框架,支持一次编写,多端运行
智慧导诊系统源码,java源码,大屏机自动导诊,互联网医院智能导诊系统源码 老是全身无力,挂什么科? 经常头痛,挂什么科? 总是失眠,又得挂哪个科? 世界上最遥远的距离再加…...

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

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

linux java17 - linux环境 centos7卸载java8安装java17
前言 因为springboot3不再支持java8,最近开始转java17,具体要求如下 Spring Boot 3要求使用Java 17或更高版本,不支持Java 8。 Spring Boot 3.0 正式版已经发布,并且明确要求最低支持Java 1712。 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的常见问题与最佳实践
全文目录: 前言1. Redis的常见问题排查常见错误信息与解决方案性能瓶颈的识别与处理数据一致性问题的排查 2. Redis的最佳实践Redis使用中的通用原则典型业务场景中的最佳实践如何避免Redis中的反模式 小结下期预告 前言 在上一章【第八章: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
前言 环境: ubuntu 20.04 ; ROS版本: noetic; 问题 运行 roslaunch waypoint_trajectory_generator test.launch 出现如下错误 Invalid argument "/map" passed to canTransform argument source_frame in tf2 fra…...

删除node_modules文件夹
前言 当安装了较多模块后,node_modules目录下的文件会很多,直接删除整个目录会很慢,下面介绍些快速删除node_modules目录的方法。 方法一:使用rimraf模块的命令 在全局安装rimraf模块,然后通过其命令来快速删除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矩阵
题目描述: 给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1: 输入:mat [[0,0,0],[0,1,0],[0,0,0]] 输出…...

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

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

学习Redisson实现分布式锁
官网:https://redisson.org/ 官方文档:https://redisson.org/docs/getting-started/ 官方中文文档:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 1、引入依赖 <!--redisson--> <dependency><groupId>or…...

2024CSP-J模拟赛9————S12678
一,赛中得分 T1100T2100T350T440总分290 二,赛中概括 T1T2较快过,T3T4骗了90分(意料之中,这么好骗分!!!)。 三,题目解析 涂格子(paint) 问题描述 现在有…...

HarmonyOS中ArkUi框架中常用的装饰器
目录 1.装饰器 1)Component 1--装饰内容 2)Entry 1--装饰内容 2--使用说明 3)Preview 1--装饰内容 2--使用说明 4)CustomDialog 1--装饰内容 2--使用说明 5)Observed 1--装饰内容 2--使用说明 6)ObjectLin…...

服务攻防之Redis数据库安全
最近我将会把一些服务攻防方面的姿势在这里做一个简单总结。欢迎大家留言讨论。 首先我们先对这类安全问题做一个总体的概括! 一、总概 1.服务判断: 端口扫描:利用服务开启后的目标端口开放判断 组合判断:利用搭建常见组合分析可能开放服务…...

随机森林算法的原理与实现
随机森林(Random Forest)是一种集成学习算法,它通过构建多个决策树并结合这些树的结果来进行分类或回归。与单一的决策树相比,随机森林通过集成多个树的结果,能够显著提高预测的准确性和稳定性,减少模型的过…...

模仿百度-基础版
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>百度案例</title><style>*{margin: 0;p…...

c++贴瓷砖
题目描述 有一块大小是 2 * n 的墙面,现在需要用2种规格的瓷砖铺满,瓷砖规格分别是 2 * 1 和 2 * 2,请计算一共有多少种铺设的方法。 输入 输入的第一行包含一个正整数T(T<20),表示一共有T组数据&…...

用 Python 构建高级配对交易策略
作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文阐述通过分析加密货币和传统金融工具之间的相关性和协整性,以及实施 Z-score 方法来生成交易信号,然后介绍如何使用 Python 构建配对交易策…...

Java 引用数据类型详解、字符串的不可变性、如何处理字符串的内存管理、String Pool 及其优化
文章目录 1. 引用数据类型1.1 常见引用数据类型 2. 字符串的不可变性2.1 不可变性的优点2.2 不可变性示例 3. 如何处理字符串的内存管理3.1 String Pool3.2 String 内存优化 4. String Pool 及其优化4.1 String Pool的工作原理4.2 String Pool的优化4.3 使用 intern() 进一步优…...

Babel使用
初始化项目 npm init -y 创建文件 // 转码前 // 定义数据 let input [1, 2, 3] // 将数组的每个元素 1 input input.map(item > item 1) console.log(input)配置.babelrc Babel的配置文件是.babelrc,presets字段设定转码规则,将es2015规则加入…...

自动机器学习(AutoML)
utoML是PAI的提供的自动寻找超参组合的机器学习增强型服务。您在训练模型时,如果超参组合复杂度过高,需大量训练资源和手工调试工作,可以使用AutoML来节省模型调参时间,提升模型调优效率和模型质量。 基础概念 超参数:…...