首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux cfs调度

Linux中的CFS(Completely Fair Scheduler,完全公平调度器)是一种内核调度器,旨在实现进程之间的完全公平调度。以下是关于CFS调度器的基础概念、优势、类型、应用场景以及常见问题的详细解答:

CFS调度器的基础概念

  • 定义:CFS通过为每个进程分配一个虚拟运行时间(virtual runtime),确保所有进程都能公平地访问CPU资源。
  • 核心思想:CFS的核心思想是“完全公平”,即所有进程都应该按其“权重”公平地分享CPU时间。
  • 虚拟时间片:CFS使用虚拟时间片来衡量进程对CPU资源的需求,确保每个进程都能在合理的时间内获得执行机会。

CFS调度器的优势

  • 公平性:CFS通过动态调整每个进程的时间片来确保所有进程都能公平地访问CPU资源。
  • 负载均衡:CFS能够适应动态变化的工作负载,保持良好的负载均衡性。
  • 灵活性:CFS支持多种调度策略,如实时调度、批处理调度等,满足不同应用场景的需求。

CFS调度器的类型

  • 普通进程调度:适用于大多数通用用途的系统,确保每个进程都能获得公平的CPU时间。
  • 实时进程调度:如SCHED_FIFO和SCHED_RR,为实时任务提供优先级保障,确保它们能够及时执行。

CFS调度器的应用场景

  • 通用系统:对于需要处理大量并发任务或者对响应时间敏感的应用场景,CFS调度器能够提供公平的调度机制。
  • 服务器和桌面系统:CFS调度器通过引入公平调度的理念和高效的红黑树数据结构,提升了系统调度的效率和用户体验。

CFS调度器常见问题及解决方法

  • 虚拟时间溢出问题:CFS使用红黑树来维护进程队列,但当进程数量非常大时,可能会导致虚拟时间溢出。解决方法是定期重置红黑树的最小虚拟时间,以确保调度过程的连续性。
  • 实时任务调度问题:在某些情况下,实时任务可能无法获得足够的CPU时间。解决方法是调整实时任务的优先级或增加系统的调度周期,以确保实时任务能够及时执行。

通过上述分析,我们可以看到CFS调度器不仅在理论上能够实现完全的公平调度,在实际应用中也展现出了良好的性能和灵活性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux 内核】CFS 调度器 ② ( CFS 调度器 “ 权重 “ 概念 | CFS 调度器调度实例 | 计算进程 “ 实际运行时间 “ )

文章目录 一、CFS 调度器 " 权重 " 概念 二、CFS 调度器调度实例 ( 计算进程 " 实际运行时间 " ) 一、CFS 调度器 " 权重 " 概念 ---- CFS 调度器 ( Completely...Fair Scheduler ) " 完全公平调度器 " , 实际运行过程中 , 会涉及到 具有 不同 " 进程优先级 " 的 进程 之间的调度 , 有些进程 优先级高 , 有些进程 优先级低 ,...为了避免 优先级低 的进程 始终无法得到 CPU 时间 执行 , 向每个进程提供 公平 调度 , CFS 调度器 引入了 " 权重 " 概念 , CFS 使用 " 权重 " 值 , 替代 进程的 优先级..., 不同 " 进程优先级 " 的进程 会按照 权重比例 , 分配 CPU 的执行时间 ; 二、CFS 调度器调度实例 ( 计算进程 " 实际运行时间 " ) ---- 有 2 个进程 A 和 B...大小 , 则 进程 在 CPU 上执行的进程 可获取到的 CPU 时间 计算公式如下 : \rm 进程获取的CPU 时间 = 调度区 \times \cfrac{进程权重}{所有进程的权重之和}

1.9K30
  • 调度器及CFS调度器

    调度的目的:最大限度的使用CPU时间。 Linux内核中用来安排调度进程执行的模块称为调度器(Scheduler),它可以切换进程状态(执行、睡眠、退出等)。...(MAX_RT_PRIO + NICE_WIDTH) #define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2) 调度策略 Linux内核提供一些调度策略供用户应用程序来选择调度器...CFS定义一种新调度模型,它给cfs_rq(cfs的run queue)中的每一个进程都设置一个虚拟时钟 - virtual runtime(vruntime),如果一个进程得以执行,随着执行时间的不断增长...Linux采用红黑树保存调度实体,按照虚拟时间从小到大存储在红黑树中。 调度器通过各个组件模块及一系列数据结构,来排序和管理系统中的进程。...CFS调度器就绪队列 CFS顶级调度就绪队列 struct cfs_rq: struct cfs_rq { struct load_weight load;

    1.1K40

    【Linux 内核】CFS 调度器 ⑥ ( CFS 调度器就绪队列 cfs_rq | Linux 内核调度实体 sched_entity | “ 红黑树 “ 数据结构 rb_root_cached )

    文章目录 一、CFS 调度器就绪队列 cfs_rq 二、Linux 内核调度实体 sched_entity 三、" 红黑树 " 数据结构 rb_root_cached 一、CFS 调度器就绪队列 cfs_rq...---- 调度器 的 主要职责 就是 对 " 进程 " 进行 " 调度管理 " , 调度时 进程 是放在 " 调度队列 " 中的 , CFS 调度器 的 调度队列 是 struct cfs_rq ;...该 struct cfs_rq 结构体在 Linux 内核源码 的 linux-5.6.18\kernel\sched\sched.h 头文件中定义 ; /* CFS-related fields in...内核调度实体 sched_entity ---- sched_entity 结构体 就是可以 被 Linux 内核 调度 的 实体 ; 可以将该 " 调度实体 " 插入到 红黑树 ( 执行队列 ) 节点..." , 就是 " 虚拟时间 " 最小的调度实体 ; 该 " 红黑树 " 数据结构 如下 : 在 Linux 内核源码 linux-5.6.18\include\linux\rbtree.h 路径对应的源码中定义

    95520

    Linux CFS调度器之唤醒抢占--Linux进程的管理与调度(三十)

    函数 描述 进程入队/出队 enqueue_task_fair/dequeue_task_fair 向CFS的就读队列中添加删除进程 选择最优进程(主调度器) pick_next_task_fair 主调度器会按照如下顺序调度..., 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 一般情况下选择红黑树中的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->...; /* 调整调度实体se的虚拟运行时间 */ place_entity(cfs_rq, se, 1); 我们可以看到, 此时调用place_entity时的initial参数设置为...关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,...,但不能补偿太多.这样由于休眠进程在唤醒时或者新进程创建完成后会获得vruntime的补偿,所以它在醒来和创建后有能力抢占CPU是大概率事件,这也是CFS调度算法的本意,即保证交互式进程的响应速度,因为交互式进程等待用户输入会频繁休眠

    2.6K31

    一文搞懂 | Linux内核 CFS 调度器

    目前,在Linux内核中支持的调度器有CFS调度器、Realtime调度器、Deadline调度器和Idle调度器 。本篇将简单介绍CFS调度器的设计原理。...CFS调度器总是选择虚拟时钟跑得慢的进程来运行,从而让每个调度实体(sche_entity)的虚拟运行时间互相追赶,进而实现进程调度上的平衡。...为了保证公平性,调度器每次选取红黑树最左端的进程进行调度。 CFS的内部原理大致为如图所示: Linux内的所有任务都由称为 task_struct 的任务结构表示,它位于调度的最顶端。该结构(在..../linux/include/linux/sched.h)完整地描述了任务并包括了任务的当前状态、其堆栈、进程标识、优先级(静态和动态)等等。...因此,调度器将当前调度实体放回红黑树,并选择红黑树中最左边的调度实体作为next在下一个时钟周期进行调度。 通过以上的结构和调度方式,Linux内核保证了操作系统中进程调度的公平性。

    1.2K20

    【Linux 内核】CFS 调度器 ① ( CFS 完全公平调度器概念 | CFS 调度器虚拟时钟 Virtual Runtime 概念 | 四种进程优先级 | 五种调度类 )

    文章目录 一、CFS 调度器概念 ( 完全公平调度器 ) 二、CFS 调度器虚拟时钟概念 ( Virtual Runtime ) 三、进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实时优先级...) 四、调度类 ( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) 一、CFS 调度器概念 ( 完全公平调度器 ) ---- CFS 调度器 ( Completely...上 , 每个进程都会被 公平 分配到 25\% 的运行时间 ; 二、CFS 调度器虚拟时钟概念 ( Virtual Runtime ) ---- CFS 调度器 中 , 定义了 一种 " 调度模型...( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) ---- 在 linux-5.6.18\include\linux\sched.h 头文件中 task_struct...-5.6.18\include\linux\sched.h#680 上述可设置的调度类参考 【Linux 内核】调度器 ⑦ ( 调度器类型 | 停机调度类 stop_sched_class | 限期调度类

    2.1K40

    Linux CFS调度器之队列操作--Linux进程的管理与调度(二十七)

    CFS进程入队和出队 完全公平调度器CFS中有两个函数可用来增删队列的成员:enqueue_task_fair和dequeue_task_fair分别用来向CFS就绪队列中添加或者删除进程 2 enqueue_task_fair..., 然后通过for_each_sched_entity循环所有调度实体, // enqueue_task_fair函数 { struct cfs_rq *cfs_rq; struct...sched_entity *se = &p->se; for_each_sched_entity(se) { /* ...... */ } } linux对组调度的支持可以通过...新加进程应该在最近很快被调度,这样减少系统的响应时间,我们已经知道当前进程的vruntime越小,它在红黑树中就会越靠左,就会被很快调度到处理器上执行。...但是,Linux内核需要根据新加入的进程的权重决策一下应该何时调度该进程,而不能任意进程都来抢占当前队列中靠左的进程,因为必须保证就绪队列中的所有进程尽量得到他们应得的时间响应, sched_vslice

    3K31

    Linux CFS调度器之虚拟时钟vruntime与调度延迟--Linux进程的管理与调度(二十六)

    键值通过entity_key计算, 该函数在linux-2.6之中被定义, 但是后来的内核中移除了这个函数, 但是我们今天仍然讲解它, 因为它对我们理解CFS调度器和虚拟时钟vruntime有很多帮助,...我们也会讲到为什么这么有用的一个函数会被移除 我们可以在早期的linux-2.6.30(仅有entity_key函数)和linux-2.6.32(定义了entity_key和entity_befire...(定义在linux-2.6.32的kernel/sched_fair.c, line 309)函数中使用了entity_key函数用来比较两个调度实体的虚拟时钟键值的大小 即相当于如下代码 if (entity_key...而,CFS调度器中的权重在内核是对用户态进程的优先级nice值, 通过prio_to_weight数组进行nice值和权重的转换而计算出来的 虚拟时钟相关公式 linux内核采用了计算公式: 属性 公式...当前进程的权重 cfs.weight 整个cfs_rq的总权重 这里se.weight和cfs.weight根据上面讲解我们可以算出, sum_runtime是怎们计算的呢,linux内核中这是个经验值

    3.4K63

    CFS调度主要代码分析一

    在前面学习了CFS调度的原理和主要的数据结构,今天我们就来进入代码分析环节。当然了代码分析只看主要主干不看毛细,同时我们也是根据一个进程是如何被调度的思路来分析一些重要的代码。...为了保证除法计算中不涉及浮点运算,linux内核通过先左移32位,然后右移32位来避免浮点运算。修改后的公式为: ? 再经过转化成如下的公式 ?...sched_slice 此函数是用来计算一个调度周期内,一个调度实体可以分配多少运行时间 static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity...运行队列中最小的vruntime的值 新进程创建 通过新进程创建流程,来分析下CFS调度器是如何设置新创建的进程的。...idle进程 pick_next_entry会从CFS红黑树最左边节点获取一个调度实体 set_next_entry则设置next调度实体到CFS运行队列的curr指针上 后面再context_switch

    2.4K31

    CFS调度主要代码分析二

    在上一篇文章中我们分析CFS的主要代码,设计的内容有: 进程创建时调度器是如何初始化一个进程的 进程是如何添加到CFS运行队列中 当进程添加到CFS运行队列中,是如何选择下一个进程运行的 本节在围绕一个进程的生命周期...如何被调度出去的? Schedule_tick(周期性调度) 周期性调度就是Linux内核会在每一个tick的时候会去更新当前进程的运行时间,已经判断当前进程是否需要被调度出去等。...cfs_rq->h_nr_running--; } } 获取该进程的调度实体,再获取调度实体属于的CFS运行队列,通过dequeue_entity函数将调度实体从CFS运行队列删除 static...= cfs_rq->curr) __dequeue_entity(cfs_rq, se); se->on_rq = 0; 当一个调度实体产品你个CFS润兴队列移除时,需要做以下事情 更新调度实体和...CFS运行队列的负载 减去调度实体的负载从CFS_rq->runnable_avg中 减去调度实体的权重以及组调度的权重等 调用__dequeue_entity函数将需要移除的调度实体从CFS红黑树移除

    1.2K10

    【Linux 内核】CFS 调度器 ④ ( 调度子系统组件模块 | 主调度器、周期性调度器 | 调度器类 )

    文章目录 一、调度子系统组件模块 二、主调度器、周期性调度器 三、调度器类 一、调度子系统组件模块 ---- 调度器 需要对 被调度的进程 进行 排序 和 调度管理 , 进程管理过程需要 调度器 的 组件模块..., 自动调用 scheduler_tick() 函数 , 完成调度 , 这是根据 进程 运行时间 , 自动触发进程调度 ; 三、调度器类 ---- 主调度器 或 周期性调度器 根据 不同的 " 选择进程..." 选择不同的 调度器类 , 可选的调度类参考 【Linux 内核】调度器 ⑦ ( 调度器类型 | 停机调度类 stop_sched_class | 限期调度类 dl_sched_class | 实时调度类...| 公平调度类 | 空闲调度类 ) 博客 , 在 Linux 内核中 , sched_class 调度器 分为以下 5 种类型 : stop_sched_class : 停机调度类 ; dl_sched_class...: 限期调度类 ; rt_sched_class : 实时调度类 ; fair_sched_class : 公平调度类 ; idle_sched_class : 空闲调度类 ; 每个 调度器类

    3.3K10

    C|进程调度|公平调度Lottery&CFS

    除了上一篇文章提到的MLFQ外,另一种调度名为proportional-share/fair-share,这种调度policy的目标是控制每个进程占用CPU时间的比例。...linux内部则使用CFS作为另一种实现。 How can we design a scheduler to share the CPU in a proportional manner?...调度器将会随机选出一则中奖券,拥有中奖券的进程就被调度。尽管抽取的过程是随机的,但是大数定律表明在长期运行的情况下,被调度概率将会趋近于ticket的比例。...---- The Linux Completely Fair Scheduler (CFS) Linux使用了CFS作为调度算法,为了按比例分配CPU,它使用了基于计数的virtual runtime技巧...*/ 335, 272, 215, 172, 137, /* 10 */ 110, 87, 70, 56, 45, /* 15 */ 36, 29, 23, 18, 15, }; R-B Tree linux

    49230

    为什么Linux CFS调度器没有带来惊艳的碾压效果

    但凡懂Linux内核的,都知道Linux内核的CFS进程调度算法,无论是从2.6.23将其初引入时的论文,还是各类源码分析,文章,以及Linux内核专门的图书,都给人这样一种感觉,即 CFS调度器是革命性的...我承认,2008年前后出现CFS时还没有Android,等到Android出现时,其采用的Linux内核已经默认了CFS调度器,我们看下Android版本,Linux内核版本以及发行时间的关系: ?...Linux内核在2.6.23就采用了CFS调度器。所以一个原因就是没有比较。Android系统上,CFS没有机会和O(1)做比较。...其实,CFS调度器的理念非常古老,就说在业界,CFS的思想早就被应用在了磁盘IO调度,数据包调度等领域,甚至最最古老的SRV3以及4.3BSD UNIX系统的进程调度中早就有了CFS的身影,可以说,Linux...CFS调度思想古已有之。 所以无论从概念还是从效果,Linux CFS调度器均没有带来令人眼前一亮的哇塞效果。但是还缺点什么。嗯,技术上的解释。

    2.5K20

    【Linux 内核】CFS 调度器 ⑤ ( CFS 调度器类 fair_sched_class 源码 | next 赋值 | enqueue_task 赋值 | dequeue_task 赋值 )

    文章目录 一、调度器类 sched_class 简介 二、CFS 调度器类源码 三、next 赋值 四、enqueue_task 赋值 五、dequeue_task 赋值 一、调度器类 sched_class...简介 ---- 在之前的博客 【Linux 内核】调度器 ② ( sched_class 调度类结构体源码 | 源码路径 linux-5.6.18\kernel\sched\sched.h ) 【Linux...dl_sched_class | 实时调度类 | 公平调度类 | 空闲调度类 ) 中 , 介绍了 调度类 sched_class 结构体的源码 , 重要的 字段 以及 函数指针 ; CFS 调度器类...fair_sched_class 是 sched_class 结构体类型的 ; 二、CFS 调度器类源码 ---- CFS 调度器类 fair_sched_class 的 源码 在 Linux 内核源码...: linux-5.6.18\kernel\sched\sched.h#1715 ; 五、dequeue_task 赋值 ---- CFS 调度器类 fair_sched_class 的 dequeue_task

    1.9K30

    Linux CFS调度器之负荷权重load_weight--Linux进程的管理与调度(二十五)

    /include/linux/sched.h?...这样就正好产生了10%的差值. 4 进程负荷权重的计算 set_load_weight负责根据非实时进程类型极其静态优先级计算符合权重 而实时进程不需要CFS调度, 因此无需计算其负荷权重值 早期的代码中实时进程也是计算其负荷权重的...这个我们在前面讲Linux进程调度器的设计–Linux进程的管理与调度(十七)的时候提到过了在cpu的就绪队列rq和cfs调度器的就绪队列cfs_rq中都保存了其load_weight....v=4.6#L361 /* CFS-related fields in a runqueue */ struct cfs_rq { struct load_weight load; unsigned...v=4.6#L490 struct dl_rq中不需要负荷权重 由于负荷权重仅用于调度普通进程(非实时进程), 因此只在cpu的就绪队列队列rq和cfs调度器的就绪队列cfs_rq上需要保存其就绪队列的信息

    1.6K10

    CFS 调度器数据结构篇

    调度类 CFS调度器是在Linux2.6.23引入的,在当时就提出了调度类概念,调度类就是将调度策略模块化,有种面向对象的感觉。...task_tick: 在每个时钟tick的时候会调度各个调度类中的tick函数 Linux内核都提供了那些调度类 extern const struct sched_class stop_sched_class...在之前的O(1)算法中调度的单位都是task_struct,而在Linux2.6.23引入调度模块化后,调度的单位成为调度实体sched_entity load就是此进程的权重 run_node:CFS...CFS维护了一课以时间为排序的红黑树,所有的红黑树节点都是通过进程的se.vruntime来作为key来进行排序。CFS每次调度的时候总是选择这棵红黑树最左边的节点,然后来调度它。...代表的是CFS调度策略对应的运行队列 load: 是这个CFS_rq的权重,包含着CFS就绪队列中的所有进程 nr_running: 代表的是这个CFS运行队列中可运行的进程数 min_vruntime

    1.3K10

    Linux CFS调度器之task_tick_fair处理周期性调度器--Linux进程的管理与调度(二十九)

    CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期性调度器通过调用...curr进程所属调度器类sched_class的task_tick函数完成周期性调度的工作 周期调度的工作形式上sched_class调度器类的task_tick函数完成, CFS则对应task_tick_fair...函数, 但实际上工作交给entity_tick完成. 2 CFS的周期性调度 2.1 task_tick_fair与周期性调度 CFS完全公平调度器类通过task_tick_fair函数完成周期性调度的工作...(se) { /* 获取当当前运行的进程所在的CFS就绪队列 */ cfs_rq = cfs_rq_of(se); /* 完成周期性调度...如果检查需要发生抢占, 则内核通过resched_curr(rq_of(cfs_rq))设置重调度标识, 从而触发延迟调度 2.4 resched_curr设置重调度标识TIF_NEED_RESCHED

    2.1K30

    【Linux 内核】CFS 调度器 ③ ( 计算进程 “ 虚拟运行时间 “ )

    文章目录 一、计算进程 " 虚拟运行时间 " 一、计算进程 " 虚拟运行时间 " ---- 在上一篇博客 【Linux 内核】CFS 调度器 ② ( CFS 调度器 “ 权重 “ 概念 | CFS 调度器调度实例...| 计算进程 “ 实际运行时间 “ ) 中 , 计算了 进程 在 CPU 上的 " 实际运行时间 " , CPU 的总时间是 CPU 的调度区 大小 , 则 进程 在 CPU 上执行的进程 可获取到的...调度区 又称为 " 调度周期 " , 在 【Linux 内核】CFS 调度器 ① ( CFS 完全公平调度器概念 | CFS 调度器虚拟时钟 Virtual Runtime 概念 | 四种进程优先级 |...{1024}{所有进程的权重之和} \ \ \ \ ③ 通过上述公式 , 可以得出 : 在 相同的 调度周期 中 , 所有 运行在该 CPU 上的进程 的 " 虚拟运行时间 " 是相同的 , 在 CFS...调度器 对 进程 进行调度运行时 , 找到 " 虚拟运行时间 " 最小的进程 运行即可 , Linux 内核中 , 进程队列 的数据结构是 " 红黑树 " , 该数据结构 可以最快地找到 " 虚拟运行时间

    2K20
    领券