【操作系统 OS】什么是Linux CFS?完全公平调度器是什么?

news2024/9/9 4:09:13

Linux CSF 简介

Linux 中 CFS 的全称是 Completely Fair Scheduler,完全公平调度器,是 Linux 内核中的一种进程调度算法

CFS 的主要特性:

  • 公平性

    • CFS 的核心理念是通过确保所有进程能够公平地获得 CPU 时间来实现公平调度。使用一个虚拟时钟(Virtual Runtime)来跟踪每个进程使用 CPU 的时间。理论上,所有进程的虚拟时钟应该接近相等。

  • O(log N) 复杂度

    • CFS 通过红黑树(red-black tree)数据结构管理进程,确保调度操作的复杂度为 O(log N),其中 N 是系统中可调度的进程数量。

  • 精确调度

    • CFS 通过使用微观调度周期(调度片)来精细控制每个进程的 CPU 使用时间。每个调度周期内,进程可以运行一小段时间,这段时间称为时间片。

  • 优先级支持

    • CFS 支持传统的静态优先级(nice 值)和实时优先级。静态优先级影响进程的虚拟运行时间,使得具有较高静态优先级的进程相对于低优先级进程获得更多的 CPU 时间。

CFS 的工作原理

  1. 虚拟运行时间(vruntime)

    1. CFS 为每个进程分配一个虚拟运行时间,记录进程使用的 CPU 时间。虚拟运行时间是调度决策的关键指标,具有较少虚拟运行时间的进程将优先获得 CPU 时间。

  2. 红黑树调度

    1. 所有可调度的进程按虚拟运行时间存储在红黑树中,树的根节点是虚拟运行时间最小的进程。当 CFS 需要调度一个新的进程时,它从红黑树的最左节点(虚拟运行时间最小的节点)选择。

  3. 调度决策

    1. CFS 定期检查当前正在运行的进程和红黑树中下一个进程的虚拟运行时间。如果发现红黑树中有虚拟运行时间更少的进程,则进行上下文切换,将 CPU 分配给该进程。

  4. 时间片计算

    1. CFS 动态计算每个进程的时间片,根据系统负载和进程优先级调整。时间片越长,进程能在一次调度中运行的时间越长。

使用和配置

CFS 自动管理大多数调度任务,无需用户干预。但用户可以通过调整一些调度相关的内核参数(如 sched_latency_ns, sched_min_granularity_ns)来影响调度行为。这些参数控制调度周期的长度和最小时间片的大小。

优势和应用场景

  • 多任务处理:CFS 适用于需要公平分配 CPU 资源的多任务环境。

  • 桌面和服务器应用:因其公平性和低复杂度,CFS 在桌面系统和服务器中广泛应用,适合多种工作负载,包括交互式应用和后台服务。

  • 实时应用的支持:虽然 CFS 主要设计用于普通进程调度,它也支持实时调度类(如 SCHED_FIFOSCHED_RR),这些类有更高的优先级,但需要更细粒度的控制。

CFS 中如何使用红黑树?

红黑树存储着系统中所有就绪进程(处于可运行状态但未在运行的进程),按照每个进程的虚拟运行时间(vruntime)排序。vruntime是一个概念上的时间度量,用来衡量进程在系统中运行了多长时间。较小的vruntime意味着进程运行时间较短,需要获得更多的 CPU 时间。

CFS 如何定期检查红黑树

CFS 定期检查红黑树的主要目的是确定是否需要进行上下文切换(即更换运行中的进程)。这种检查过程涉及以下几个关键步骤:

  1. 时钟中断:CFS 的调度决策主要由系统的时钟中断(通常是周期性发生的定时中断)驱动。每当时钟中断发生时,系统会进入调度程序,这个过程被称为“时钟滴答”。

  2. 更新 vruntime:时钟中断发生时,CFS 会更新当前正在运行的进程的vruntime,因为该进程已经使用了一段 CPU 时间。vruntime的增长速度由进程的优先级决定,优先级较高的进程增长速度较慢,优先级较低的增长速度较快。

  3. 检查红黑树:CFS 会检查红黑树的根节点,这个节点是vruntime最小的可运行进程。这是因为在红黑树的性质下,树的根节点始终是最小值(最左边的节点)。

  4. 比较 vruntime:调度器将当前运行进程的vruntime与红黑树根节点(下一个要运行的进程)的vruntime进行比较。如果当前运行的进程的vruntime显著大于红黑树中的最小vruntime,调度器会认为需要进行进程切换,以确保系统中的所有进程都能公平地获得 CPU 资源。

  5. 进行上下文切换:如果需要切换,CFS 会将当前进程移入红黑树,并从红黑树中选择vruntime最小的进程作为下一个运行的进程。

关键点总结

  • 时钟中断驱动:CFS 的调度检查主要由时钟中断触发,定期执行。

  • 红黑树的角色:红黑树帮助 CFS 快速找到最需要 CPU 时间的进程。

  • vruntime:是调度决策的核心指标,反映进程的 CPU 使用时间。

  • 公平性:通过不断地选择vruntime最小的进程,CFS 尽可能地实现 CPU 时间分配的公平性。

CFS 通过这种机制平衡了系统中所有进程的 CPU 使用,使得所有进程都能按照其优先级和需要公平地获得运行机会。

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

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

相关文章

生活方式酒店升势迅起,喆啡酒店缘何成为投资热点?

伴随国内消费结构转型升级,旅游需求持续增加。文旅部发布的《国内旅游提升计划(2023—2025年)》提出,需丰富优质旅游供给,并进一步提高消费者体验及满意度,这将为酒店行业带来更广阔的客源和更高的质量要求…

SpringBoot上传超大文件导致OOM,完美解决办法

问题描述 上传大文件报错: Caused by: java.lang.OutOfMemoryError at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123) ~[?:1.8.0_381] at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117) ~[?:1.8.0_381] …

探索Axure在数据可视化原型设计中的无限可能

在当今数字化浪潮中,产品设计不仅关乎美观与功能的平衡,更在于如何高效、直观地传达复杂的数据信息。Axure RP,作为原型设计领域的佼佼者,其在数据可视化原型设计中的应用,正逐步揭开产品设计的新篇章。本文将从多个维…

同声翻译怎么做?其实有这几种方法

同声翻译怎么做?同声翻译(Simultaneous Interpretation)是指在说话人讲话的同时,翻译人员即时将内容转换成另一种语言的过程。随着全球化的发展和技术的进步,同声翻译已成为跨文化交流的重要工具。那么,今天…

stl-priority_queue 优先队列

目录 ​编辑优先队列 头文件:#include《queue》;即可 访问:只能访问队首.top() 添加。push(元素),按优先级排列 删除。pop(),删除队首元素(堆顶&#xff…

嵌入式初学-C语言-八

#接嵌入式初学-C语言-七# 分支结构 分支结构&#xff1a;又被称之为选择结构 选择结构的形式 多分支 语法&#xff1a; if(条件1) { 语句1; } else if(条件2) { 语句2; } ... else { 语句n1; }案例&#xff1a; #include <stdio.h> int main() { // 需求&#xff…

采购订单打开单据时表格行设置颜色

文章目录 采购订单打开单据时表格行根据条件显示背景色Python实现插件实现创建项目创建类&#xff0c;实现接口重写方法编译后挂载插件到表单插件启动开发环境进行测试单元格设置背景色行背景色 采购订单打开单据时表格行根据条件显示背景色 Python实现 import clr clr.AddR…

VitualBox虚拟机重启后配置无法保存,已安装软件变为没有安装

VitualBox虚拟机重启后虚拟机还原为上次开机的状态&#xff0c;安装的安装包配置啥的全部丢失。 按网上的配置了半天也没解决。最终用下面讨巧的办法&#xff0c;即不重启虚拟机。 我们不在重启虚拟机&#xff0c;那我们想关闭虚拟机的时候怎么办呢&#xff1f; 1、按下图所…

104 二叉树的最大深度

解题思路&#xff1a; \qquad 最大深度可以想到使用DFS(深度优先)或BFS(广度优先)来解决。 \qquad DFS&#xff1a;一般用 递归 or 迭代栈。递归实现较为简单。 \qquad BFS&#xff1a;一般用 迭代队列。 DFS&#xff1a; \qquad 对于每个节点&#xff0c;将左子树的最大深…

二进制搭建 Kubernetes v1.20(上)

目录 一、操作系统初始化配置 二、升级Liunx内核 三、部署docker引擎 四、部署etcd集群 五、部署Master组件 六、部署Worker Node组件 hostnameip需要部署k8s集群master0120.0.0.100kube-apiserver kube-controller-manager kube-scheduler etcdk8s集群master0220.0.0.1…

小阿轩yx-部署 KVM 虚拟化平台

小阿轩yx-部署 KVM 虚拟化平台 案例前置知识点 KVM 自 Linux 2.6.20 版本之后就直接整合到 Linux 内核依托 CPU 虚拟化指令&#xff08;如Intel-VT、AMD-V&#xff09;实现高性能的虚拟化支持与 Linux 内核高度整合&#xff0c;在性能、安全性、兼容性、稳定性上都有很好的表…

11day-C++list容器使用

这里写目录标题 1. list的介绍及使用1.1 list的介绍1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list的迭代器失效 2. list的模拟实现2.1 list的反向迭代器 1. list的介绍及使用 1.1 list的介绍 list的…

Teamcenter用本地胖客户端启动时,可以看到插件的菜单项,但是用Eclipse启动时看不到

用本地胖客户端启动时&#xff0c;可以看到定制包的插件菜单项&#xff0c;但是用Eclipse启动时&#xff0c;看不到&#xff1f; 原因&#xff1a; 是因为Eclipse启动下&#xff0c;是采用 JAVA1.8 来运行的。但是本机的胖客户端是采用JAVA 11来运行的 解决办法&#xff1a;…

二,SSM 搭建环境:持久化层

二&#xff0c;SSM 搭建环境&#xff1a;持久化层 文章目录 二&#xff0c;SSM 搭建环境&#xff1a;持久化层物理建模&#xff1a;创建对应的 数据库和数据表Mybatis 逆向工程 的配置设置执行逆向生成资源归位(逆行生成的内容&#xff0c;移动到对应模块的包当中去)移动&#…

Hive-内部表和外部表

区别 内部表实例 准备数据 查看数据 删除数据 外部表实例 准备数据 查看数据 删除数据 区别 内部表&#xff1a;管理元数据&#xff08;记录数据的文件和目录的信息&#xff09;和数据。当删除内部表时&#xff0c;会删除数据和表的元数据&#xff0c;所以当多个表关…

Creo protoolkit 二次开发(三) 遍历模型的特征

一、特征概念 Creo是基于特征的参数化建模&#xff0c;在模型树上的每个项目都是特征。 模型主要由各类特征构成。以零件模型为例&#xff0c;其基本特征包括基准特征、拉伸特征、孔特征、倒圆角特征、旋转特征、曲面特征、切口特征、阵列特征和扫描特征等。这些特征的叠加形成…

angular入门基础教程(七)系统路由

路由的实现 当我们系统越来复杂&#xff0c;功能越来越多&#xff0c;路由也就是必须的了。在 ng 中如何实现路由呢&#xff1f; 启用路由 在 app 目录下&#xff0c;新建一个 router 目录&#xff0c;把 app.routers.ts 文件拷贝过来&#xff0c;并修改一下。 import { Ro…

【数据结构】链式二叉树的实现和思路分析及二叉树OJ

【数据结构】链式二叉树的实现和思路分析及二叉树OJ &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】链式二叉树的实现和思路分析及二叉树OJ前言一.链式二叉树的定义及结构二.链式二叉树的遍历2.1前序遍历2.2中…

《LeetCode热题100》---<双指针篇四道②>

本篇博客讲解LeetCode热题100道双指针篇中的 第三道&#xff1a;三数之和&#xff08;中等&#xff09; 第四道&#xff1a;接雨水&#xff08;困难&#xff09; 第三道&#xff1a;三数之和&#xff08;中等&#xff09; 法一&#xff1a;暴力枚举&#xff08;三重循环&#x…

Java学习Day18:基础篇8

多态 基本信息&#xff1a; 应用场景&#xff1a; 可以把子类对象赋值给父类对象&#xff0c;实现多态从而使用同一种方法&#xff1b; 多态中调用成员的特点 1.调用成员变量都看左边 调用成员变量:编译看左边&#xff0c;运行也看左边 编译看左边: javac编译代码的时候&a…