O(1)调度算法与CFS

news2024/11/27 11:43:15

目录

引言

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系统的标准调度器。

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

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

相关文章

进阶篇-Redis集群算法详细介绍

目录 一 、集群是什么1.1 主从复制与集群的架构区别 二、Redis集群的作用三、集群算法3.1.分片-槽位slot3.2 分片是什么3.3如何找到找到给定的key值分片3.4分片的优势 四、槽位映射的三中国解决方案4.1 哈希取余分区算法4.2 哈希一致性算法4.2.1 背景以及概念4.2.2 算法的步骤4…

【Python加密与解密】深入了解Python中的数据加密技术!

Python加密与解密:深入了解Python中的数据加密技术 在现代信息时代,数据加密成为保障网络和通信安全的重要手段之一。无论是在保护个人隐私还是在保证企业数据的安全性方面,加密技术都发挥着关键作用。Python 作为一种流行的编程语言&#x…

(10) GTest c++单元测试(mac版)

文章目录 概要安装实现机制-断言(简单、独立的测试)实现机制-测试套件实现机制-Test Fixture和事件 概要 官方文档 https://google.github.io/googletest/ 安装 git clone https://github.com/google/googletestcd googletestmkdir build && c…

鸿蒙开发 四十五 鸿蒙状态管理(嵌套对象界面更新)

当运行时的状态变量变化,UI重新渲染,在ArkUI中称为状态管理机制,前提是变量必须被装饰器修饰。不是状态变量的所有更改都会引起刷新,只有可以被框架观测到的更改才会引起UI刷新。其中boolen、string、number类型,可观察…

PyQt 入门教程(3)基础知识 | 3.2、加载资源文件

文章目录 一、加载资源文件1、PyQt5加载资源文件2、PyQt6加载资源文件 一、加载资源文件 常见的资源文件有图像、图标、样式表,下面分别介绍下加载资源文件的常用方法 1、PyQt5加载资源文件 创建.qrc文件: 可以使用QtCreator或手动创建一个.qrc文件&…

注意LED亚型号区分

一. 前言 最近产品试产遇到一次批量事故:全部绿光LED的光功率不达标。最终定位到的原因就是未注意LED的细分型号,试产采用的批次与研发时的亚型号不一样,光功率范围不一致。在此记录下来,供大家做参考,避免走弯路。 …

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架,JAVA作…

uniapp结合uview-ui创建项目

准备工作: 下载HBuilderX;官网地址:HBuilderX-高效极客技巧 安装node.js;官网地址:Node.js — 在任何地方运行 JavaScript,下载所需版本,安装后配置好环境变量即可 方式一(NPM安装方式): 1、打开开发者…

OpenRTP 乱序排包和差分抖动计算

OpenRTP 开源地址 OpenRTP 开源地址 暂时使用h264 aac 的音频去测试,点开配置去选择 1 音视频同步问题 先要解决一个音视频同步问题,否则包排不排序都不对,这是因为视频时间戳不一定能够对上音频,为什么呢?因为大部…

前端考试总结

1HTML标签 h标题标签 块级标签 独占一行 p段落标签 同上 br换行标签 单标签 img图片标签 内联标签:不独占一行(src图片地址 alt图片的替代文字 title鼠标悬停提示文字) a超链接标签 同上 (href跳转路径 target属性{_blank新窗口打开 _self在当前窗口打开}) 列表标签(ul无…

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望 机器学习与神经网络的崛起 机器学习与神经网络的发展前景 机器学习和神经网络的研究与传统物理学的关系 总结 2024年,诺贝尔物理学奖颁给了机器学习与神经网络,这一具有里程碑…

JAVA就业笔记5——第二阶段(2)

课程须知 A类知识:工作和面试常用,代码必须要手敲,需要掌握。 B类知识:面试会问道,工作不常用,代码不需要手敲,理解能正确表达即可。 C类知识:工作和面试不常用,代码不…

房屋租赁管理系统|基于java和小程序的房屋租赁管理系统小程序设计与实现(源码+数据库+文档)

房屋租赁管理系统小程序 目录 基于java和小程序的房屋租赁管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设…

asp.net core _ViewStart.cshtml 和 _ViewImports.cshtml

_ViewStart.cshtml asp.net mvc 就出现了 》》/Views/ViewStart.cshtml _ViewStart.cshtml 是默认模板,当页面没有指定 Layout 时,会自动调用此默认模板‌,如果要取消 在当页面设定 (如下),则表示 当前页面…

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP+MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密,其他开源可二开 演示源码下载 开…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

包子凑数

类似完全背包求方案数&#xff0c;再加上点数论知识&#xff0c;裴蜀定理。 #include<bits/stdc.h> using namespace std; #define int long long #define endl \n const int N300000; bool f[N]; int a[120]; signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.…

华为ICT大赛2024-2025网络赛道考试分析

华为ICT大赛2024-2025正在报名中&#xff0c;网络赛道的同学如何备考&#xff0c;了解考试内容呢&#xff1f; 一、考试概况 华为ICT大赛分为4个赛段&#xff0c;分别为省赛初赛、省赛复赛、中国总决赛&#xff0c;全球总决赛。其中对应的能力级别分别如下&#xff1a; 省赛…

PHP爬虫API:获取商品详情的新利器

为什么选择PHP爬虫API 灵活的数据处理&#xff1a;PHP强大的数据处理能力&#xff0c;使得从API获取的数据可以被快速地处理和分析。丰富的库支持&#xff1a;PHP拥有如cURL、Guzzle等库&#xff0c;这些库简化了HTTP请求的发送和响应的接收。易于集成&#xff1a;PHP作为服务…

无人机搭载激光雷达在地形测绘中的多元应用

一、高精度地形测量 无人机激光雷达能够发射激光脉冲并接收其回波&#xff0c;通过精确计算激光脉冲的往返时间来确定目标物的距离。这一特性使得无人机激光雷达在地形测绘中能够实现高精度的三维地形测量。通过快速获取大量地形数据&#xff0c;可以生成高精度的数字高程模型…