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

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.8K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    调度CFS调度

    调度的目的:最大限度的使用CPU时间。 Linux内核中用来安排调度进程执行的模块称为调度(Scheduler),它可以切换进程状态(执行、睡眠、退出等)。...:普通进程的调度策略,使我们task以最低优先级选择CFS调度调度运行 SCHED_DEADLINE:限期进程调度策略,使我们task选择Deadline调度调度运行 注:stop调度和DLE-task...const struct sched_class *sched_class; // 表示该进程所属的调度CFS:完全公平调度。...Linux采用红黑树保存调度实体,按照虚拟时间从小到大存储在红黑树中。 调度通过各个组件模块及一系列数据结构,来排序和管理系统中的进程。...CFS调度就绪队列 CFS顶级调度就绪队列 struct cfs_rq: struct cfs_rq { struct load_weight load;

    1.1K40

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

    文章目录 一、CFS 调度概念 ( 完全公平调度 ) 二、CFS 调度虚拟时钟概念 ( Virtual Runtime ) 三、进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实时优先级...) 四、调度类 ( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) 一、CFS 调度概念 ( 完全公平调度 ) ---- CFS 调度 ( Completely...相同的大小的 CPU 时间片 来运行 ; CFS 调度 没有 时间片概念 , 该调度会 公平地 分配 CPU 的使用时间 ; 举例说明 : 如果有 4 个相同 优先级 的进程运行在 同一个 CPU...上 , 每个进程都会被 公平 分配到 25\% 的运行时间 ; 二、CFS 调度虚拟时钟概念 ( Virtual Runtime ) ---- CFS 调度 中 , 定义了 一种 " 调度模型...-5.6.18\include\linux\sched.h#680 上述可设置的调度类参考 【Linux 内核】调度 ⑦ ( 调度类型 | 停机调度类 stop_sched_class | 限期调度

    2K40

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

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

    3.2K10

    一文搞懂 | Linux内核 CFS 调度

    目前,在Linux内核中支持的调度CFS调度、Realtime调度、Deadline调度和Idle调度 。本篇将简单介绍CFS调度的设计原理。...CFS (完全公平调度)实现的主要思想是维护为任务提供处理时间方面的平衡(公平性),这意味着应给进程分配相当数量的处理。...为了保证公平性,调度每次选取红黑树最左端的进程进行调度CFS的内部原理大致为如图所示: Linux内的所有任务都由称为 task_struct 的任务结构表示,它位于调度的最顶端。该结构(在..../kernel/sched/core.c中)是CFS调度的核心函数,其作用是让调度选择和切换到一个合适的进程运行。 在时钟周期开始时,调度调用__schedule()函数来开始调度的运行。...因此,调度将当前调度实体放回红黑树,并选择红黑树中最左边的调度实体作为next在下一个时钟周期进行调度。 通过以上的结构和调度方式,Linux内核保证了操作系统中进程调度的公平性。

    1.2K20

    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 ;...通过 该 " CFS 调度就绪队列 " cfs_rq , 可以 跟踪 " 就绪队列 " 信息 , 管理 " 就绪状态 " 调度实体 , 维护着一个 按照 虚拟时钟 排序的 " 红黑树 " 数据结构 ;...该 struct cfs_rq 结构体在 Linux 内核源码 的 linux-5.6.18\kernel\sched\sched.h 头文件中定义 ; /* CFS-related fields in...调度就绪队列 " cfs_rq中定义的 struct rb_root_cached tasks_timeline; 字段 , 就是 按照 " 虚拟时钟 " 排序的 " 红黑树 " 数据结构 , tasks_timeline

    87520

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

    函数 描述 进程入队/出队 enqueue_task_fair/dequeue_task_fair 向CFS的就读队列中添加删除进程 选择最优进程(主调度) pick_next_task_fair 主调度会按照如下顺序调度..., 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 一般情况下选择红黑树中的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->...中周期性调度通过调用curr进程所属调度类sched_class的task_tick函数完成周期性调度的工作 而entity_tick中则通过check_preempt_tick函数检查是否需要抢占当前进程...这个是调度最初向进程欠下的债务....关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,

    2.6K31

    调度简介,以及Linux调度策略

    当计算机中有大量进程在运行时,这个调度的性能将会被大大降低。也就是说,O(n)调度没有很好的可拓展性。O(n)调度Linux 2.6之前使用的进程调度。...完全公平调度 从2007年发布的Linux 2.6.23版本起,完全公平调度CFS,Completely Fair Scheduler)取代了O(1)调度。...CFS调度不对进程进行任何形式的估计和猜测。这一点和O(1)区分互动和非互动进程的做法完全不同。 CFS调度增加了一个虚拟运行时(virtual runtime)的概念。...完全公平调度器用一种叫红黑树的数据结构取代了O(1)调度的140个队列。红黑树可以高效地找到虚拟运行最小的进程。 我们先通过例子来看CFS调度。...按照上述的基本设计理念,CFS调度能让所有进程公平地使用CPU。听起来,这让进程的优先级变得毫无意义。CFS调度也考虑到了这一点。CFS调度会根据进程的优先级来计算一个时间片因子。

    2.1K21

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

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

    2.9K31

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

    CFS调度中,将进程优先级这个概念弱化,而是强调进程的权重。一个进程的权重越大,则说明这个进程更需要运行,因此它的虚拟运行时间就越小,这样被调度的机会就越大。...在CFS调度中,将进程优先级这个概念弱化,而是强调进程的权重。一个进程的权重越大,则说明这个进程更需要运行,因此它的虚拟运行时间就越小,这样被调度的机会就越大。...键值通过entity_key计算, 该函数在linux-2.6之中被定义, 但是后来的内核中移除了这个函数, 但是我们今天仍然讲解它, 因为它对我们理解CFS调度和虚拟时钟vruntime有很多帮助,...在CFS调度中,将进程优先级这个概念弱化,而是强调进程的权重。一个进程的权重越大,则说明这个进程更需要运行,因此它的虚拟运行时间就越小,这样被调度的机会就越大。...而,CFS调度中的权重在内核是对用户态进程的优先级nice值, 通过prio_to_weight数组进行nice值和权重的转换而计算出来的 虚拟时钟相关公式 linux内核采用了计算公式: 属性 公式

    3.2K63

    CFS 调度数据结构篇

    本小节我们重点在分析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...在O(n)和O(1)的调度中运行队列都是通过数组链表来管理的,而在CFS调度中抛弃了之前的数据结构,采用了以时间为键值的一棵红黑树。其中的时间键值就是进程的vruntime。

    1.2K10

    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.8K30

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

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

    2.4K20

    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函数完成周期性调度的工作...周期性调度并不显式进行调度, 而是采用了延迟调度的策略, 如果发现需要抢占, 周期性调度就设置进程的重调度标识TIF_NEED_RESCHED, 然后由主调度完成调度工作....sched_class调度类的task_tick函数完成, CFS则对应task_tick_fair函数, 但实际上工作交给entity_tick完成.

    2.1K30

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

    段中存在多个相同的变量,它无法将这些变量统一成一个变量,也就是仅为此变量分配一个空间,而不是多份空间,假定这个变量在头文件没有赋初值,编译就会将之放入BSS段,连接会对BSS段的多个同名变量仅分配一个存储空间...这样就正好产生了10%的差值. 4 进程负荷权重的计算 set_load_weight负责根据非实时进程类型极其静态优先级计算符合权重 而实时进程不需要CFS调度, 因此无需计算其负荷权重值 早期的代码中实时进程也是计算其负荷权重的...内核的调度经过了不同阶段的发展, 但是即使是同一个调度其算法也不是一成不变的, 也在不停的改进和优化 内核版本 实现 地址 2.6.18~2.6.22 实时进程的权重用RTPRIO_TO_LOAD_WEIGHT...这个我们在前面讲Linux进程调度的设计–Linux进程的管理与调度(十七)的时候提到过了在cpu的就绪队列rq和cfs调度的就绪队列cfs_rq中都保存了其load_weight....v=4.6#L490 struct dl_rq中不需要负荷权重 由于负荷权重仅用于调度普通进程(非实时进程), 因此只在cpu的就绪队列队列rq和cfs调度的就绪队列cfs_rq上需要保存其就绪队列的信息

    1.5K10

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

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

    1.9K20

    CFS调度主要代码分析一

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

    2.3K31

    CFS调度主要代码分析二

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

    1.1K10
    领券