Linux进程调度-CFS调度器原理分析及实现,懂了

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

1. 概述
(1) Completely Fair Scheduler,完全公平调度器,用于Linux系统中普通进程的调度。
(2) CFS采用了红黑树算法来管理所有的调度实体 sched_entity,算法效率为O(log(n))。CFS跟踪调度实体sched_entity的虚拟运行时间vruntime,平等对待运行队列中的调度实体sched_entity,将执行时间少的调度实体sched_entity排列到红黑树的左边。
(3) 调度实体sched_entity通过 enqueue_entity()和 dequeue_entity()来进行红黑树的出队入队。

文章推荐视频:

C/C++Linux后台服务器开发高级架构师免费学习链接:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频

进程调度器的实现,完全公平调度器 CFS

Linux内核 进程管理,调度器的5种实现

老规矩,先上张图片来直观了解一下原理:

(1) 每个 sched_latency 周期内,根据各个任务的权重值,可以计算出运行时间 runtime;
(2) 运行时间runtime可以转换成虚拟运行时间vruntime;
(3) 根据虚拟运行时间的大小,插入到CFS红黑树中,虚拟运行时间少的调度实体放置到左边;
(4) 在下一次任务调度的时候,选择虚拟运行时间少的调度实体来运行;


2. 数据结构

2.1 调度类
Linux内核抽象了一个调度类struct sched_class,这是一种典型的面向对象的设计思想,将共性的特征抽象出来封装成类,在实例化各个调度器的时候,可以根据具体的调度算法来实现。这种方式做到了高内聚低耦合,同时又很容易扩展新的调度器。

在调度核心代码kernel/sched/core.c中,使用的方式是task->sched_class->xxx_func, 其中task表示的是描述任务的结构体struct task_struct,在该结构体中包含了任务所使用的调度器,进而能找到对应的函数指针来完成调用执行,有点类似于C++中的多态机制。

2.2 rq/cfs_rq/task_struct/task_group/sched_entity
(1) struct rq:每个CPU都有一个对应的运行队列;
(2) struct cfs_rq:CFS运行队列,该结构中包含了struct rb_root_cached红黑树,用于链接调度实体struct sched_entity。rq运行队列中对应了一个CFS运行队列,此外,在task_group结构中也会为每个CPU再维护一个CFS运行队列;
(3) struct task_struct:任务的描述符,包含了进程的所有信息,该结构中的struct sched_entity,用于参与CFS的调度;
(4) struct task_group:组调度(参考前文),Linux支持将任务分组来对CPU资源进行分配管理,该结构中为系统中的每个CPU都分配了struct sched_entity调度实体和struct cfs_rq运行队列,其中struct sched_entity用于参与CFS的调度;
(5) struct sched_entity:调度实体,这个也是CFS调度管理的对象了;

C/C++Linux后台服务器开发高级架构师学习视频 点击 linux服务器学习资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。免费学习链接:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习

软件课设(Ⅲ)——padavan-ng编译以及内核模块修改 软件课设Ⅲ路由器老毛子代码记录(涉及一些Linux 阅读详情

相关推荐

Linux 内核源码分析进程调度 -CFS 调度器

CFS(Completely Fair Scheduler)调度器中,任务的权重值由其nice值决定,通过对比不同任务的权重值,CFS会分配合理的CPU时间片给每个任务。这种方式实现了一种类似于多态的效果,即不同的任务可以使用不同的调度算法,而调度器的函数指针则根据具体的调度器类型来指向对应的函数。通过这种方式,Linux 内核可以根据任务的调度器类型来调用相应的调度函数,实现了灵活的调度策略,并且能够方便地扩展和切换不同的调度器。高优先级的任务会获得更多的虚拟运行时间,在排序和选择调度时更容易被选中。

C/C++Linux、音视频、DPDK 1520

Linux进程调度 - CFS调度器 LoyenWang

完全公平调度器,用于Linux系统中普通进程调度CFS采用了红黑树算法来管理所有的调度实体,算法效率为O(log(n))CFS跟踪调度实体的虚拟运行时间vruntime,平等对待运行队列中的调度实体,将执行时间少的调度实体排列到红黑树的左边。调度实体通过和来进行红黑树的出队入队。每个周期内,根据各个任务的权重值,可以计算出运行时间runtime;运行时间runtime可以转换成虚拟运行时间vruntime;

生活需要深度 2165

Linux调度管理(3)-CFS调度器 详解

普通进程:static_prio=prio=normal_prio;实时进程:prio=normal_prio=99-rt_priority;static_prio保持默认值不改变。

z20230508的博客 1536

Linux进程管理之CFS调度器—6

CFS调度器(Completely Fair Scheduler)是所有普通进程所依赖的调度器,其优先级为100-139,常常用于用户程序;此调度器实现了SCHED_NORMAL、SCHED_BATCH 、SCHED_IDLE策略,CFS的全称为完全公平的调度器,其中cpu上的队列通过cfs_rq指向其哈希表,调度实体sched_entity通过红黑树进行组织;

weixin_43708235的博客 669

Linux-scheduler之负载均衡()

linux内核调度器分析

大吉 1432

linux 负载

负载定义 load_avg/util_avg include/linux/sched.h有定义 struct sched_avg { load_avg 包含进程睡眠所花的时间 runnalbe_load_avg只包含任务在rq上面所花费的时间 代码区别查看分析确认: 数据结构 task_struct -> sched_entity -> sched_avg cfs_rq-> sched_entity(curr, last, next)-> -> sched_avg 和cg

techtitan的专栏 399

进程管理(二十二)CFS调度器

进程管理(十八)CFS调度器 CFS内核使用的一种调度器调度类,它主要负责处理三种调度策略:SCHED_NORMAL、SCHED_BATCH和SCHED_IDLE。调度器的核心在挑选下一个运行的进程时有可能会遍历所有的调度类别。实际上系统大多数进程通常都是CFS调度类负责处理的,因此为了优化下一个进程的挑选调度器核心会先判断当前进程是否采用了CFS调度策略,若是,则直接调用CFS代码来挑选下一个进程,若不是或CFS代码未能挑选到一个合适的进程,则会调用各个调度类的挑选函数来寻找一个合适的进程。若CFS

奇小葩 2805

Linux 进程调度器:从 CFS 原理到生产环境调优实战

Linux CFS 调度器通过 vruntime 红黑树实现了公平且高效的进程调度,但其"公平优先"的设计哲学并非所有场景的最优解。生产环境中的调度调优需要根据工作负载特征进行针对性配置:延迟敏感型任务需要增大时间片和绑定核心,吞吐优先型任务需要缩短调度周期,容器化环境需要合理设置 cgroup 权重层级。基线测量:使用perf sched和建立当前系统的调度行为基线,量化上下文切换频率和调度延迟分布。参数调优:根据工作负载类型调整 CFS 参数。Web 服务建议;批处理任务建议默认值或更小的延迟。

jiang_style的博客 5047

Linux CFS调度器简介

Linux CFS调度器简介

小立仔 2141

CFS调度器原理-源码->总结)

Linux 2.6.23开始,Linux引入scheduling class的概念,目的是将调度器模块化。这样提高了扩展性,添加一个新的调度器也变得简单起来。一个系统中还可以共存多个调度器。在Linux中,将调度器公共的部分抽象,使用struct sched_class结构体描述一个具体的调度类。系统核心调度代码会通过struct sched_class结构体的成员调用具体调度类的核心算法。先简单的介绍下struct sched_class部分成员作用。

Android系统优化 4169

Linux 进程的一生(二):从 CFS 到 EEVDF,调度器的演进与原理

回顾了 Linux 进程调度器的演进,从早期的 O(n) 调度算法,到 O(1) 调度器,再到目前主流的 CFS,并分析了 EEVDF 在 CFS 之上的改进。

m0_50499434的博客 1976

Linux内核调度器以及CFS调度器

1.调度:就是按照某种调度算法设计,从进程的就绪队列当中选取进程分配CPU,主要是协调对CPU等等相关资源使用。进程调度的目的:最大限度使用CPU。2.如果调度器支持就绪状态切换到执行态,同时支持执行态切换到就绪态,就成该调度器为抢占式调度器

m0_74186706的博客 1183

Linux---进程调度CFS调度器

Linux调度算法 (1)O(N)调度器 (2)O(1)调度器 (3)CFS调度器 O(N)调度器发布于1992年,从就绪队列中比较所有进程的优先级,然后选择一个最高优先级的进程作为下一个调度进程。 优点:操作简单,便于理解。 缺点:时间消耗太大,在众多可运行进程或者多处理器的环境下都难以胜任 O(1)调度器Linux2.5系列内核开始至Linux2.6.23版本之前,优化了选择下一个进程的事件,为每个CPU维护一组进程优先级队列,每个优先级一个队列,这样在选择下一个进程时,只需要查询优先

qq_31604659的博客 1500

Linux CFS调度器

CFS调度器目标是实现进程完全公平调度。就绪队列维护一颗红黑树,并采用虚拟运行时间来实现时间片的分配。动态计算每个进程的虚拟运行时间,从而实现公平性和高效性。

专注于系统快稳省领域 1640

进程管理(十七)---cfs调度器基本概念

在O(n)和O(1)调度器中,时间片是一个很重要的概念,它决定了一个任务能够运行多长时间而不被抢占。对于内核,时间片的机制是这样的,每当系统时钟中断来临,调度器从当前任务的时间片中减去一个时钟周期,直至时间片耗完,这个时候当前任务返回用户空间会,换成其他任务执行,所以时间片的划分是调度器设计上重要的问题。 为了解决上面问题,以往的调度器把动态优先级和时间片绑定在一起,高优先级的进程获得长的时间片,而低优先级的进程获得短的时间片,调度器优先调度具有时间片长的任务。但是这样分配不合理,时间片长的进程并不一定是当

奇小葩 2639

Linux 内核中的进程调度:从 CFS 到实时调度

Linux 内核中的进程调度是一个核心组件,它负责分配 CPU 时间给不同的进程和线程。进程调度通过调度器类、调度策略、优先级等机制,实现了 CPU 资源的合理分配。工作也要流程化,进程调度就像是系统中的任务管理工具,它确保了 CPU 资源的合理分配和系统的高效运行。在实际应用中,我们需要选择合适的调度策略,合理设置优先级,避免长时间占用 CPU,使用 nice 值,以及监控调度行为,以实现系统的最佳性能和可靠性。

jiang_style的博客 3760

linux调度器(五)——进程管理与CFS

进程调度初始化          由于该过程涉及到进程的管理模块,这个模块的详细过程我们将在以后的机会介绍,所以这里,我们主要扣出与调度相关的内容。进程的创建内核入口为do_fork,首先我们简单的看一下它的主要行为: 图 do_fork与CFS的交互          上图我们只是画了do_fork最普通的fork操作,及正常的启动状态,上面的三个sched_class函数调用就是

阿罗 7208

Linux进程调度CFS

详细介绍了Linux中的进程调度CFS,内容转载链接: https://www.cnblogs.com/LoyenWang/p/12495319.html#top

qq_51148151的博客 1273

Linux CFS调度算法核心解析

回家的路上,聊了下CFS调度器…我昨天不是写了一篇批判性的文章嘛: 【为什么Linux CFS调度器没有带来惊艳的碾压效果】 https://blog.csdn.net/dog250/article/details/95729830 确实如此啊,我又没说错啥。 CFS stands for “Completely Fair Scheduler,” and is the new "desktop"...

TCP/IP 5446
上一篇: Nginx 内存池似懂非懂?一文带你看清高性能服务器内存池
下一篇: 全面了解C++后端开发技能树,C++后端开发面试技术点丨C/C++linux服务器开发丨linux后台开发
Linux服务器开发
博客等级 码龄7年 609粉丝 589原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值