当前位置: 首页 > 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…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...