首页
学习
活动
专区
工具
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.7K30
您找到你想要的搜索结果了吗?
是的
没有找到

调度器及CFS调度

调度调度:就是按照某种调度算法设计,从进程的就绪队列中选择进程分配CPU,主要是协调进程对CPU等相关资源的使用。...调度的目的:最大限度的使用CPU时间。 Linux内核中用来安排调度进程执行的模块称为调度器(Scheduler),它可以切换进程状态(执行、睡眠、退出等)。...公平调度类fair_sched_class: 使用完全公平调度算法。...调度器,仅使用于内核,用户没有办法进行选择 CFS调度器 完全公平调度算法体现在对待每个进程都是公平的,让每个进程都运行一段相同的时间片,这就是基于时间片轮询调度算法。...CFS调度器就绪队列 CFS顶级调度就绪队列 struct cfs_rq: struct cfs_rq { struct load_weight load;

99740

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 路径对应的源码中定义

72320

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.5K31

一文搞懂 | Linux内核 CFS 调度

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

91120

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

文章目录 一、CFS 调度器概念 ( 完全公平调度器 ) 二、CFS 调度器虚拟时钟概念 ( Virtual Runtime ) 三、进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实时优先级...) 四、调度类 ( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) 一、CFS 调度器概念 ( 完全公平调度器 ) ---- CFS 调度器 ( Completely...Fair Scheduler ) 是 " 完全公平调度器 " , " 完全公平调度算法 " 对每个 进程 都是 公平 的 , " 完全公平调度算法 " 是 基于时间片轮询 的 调度算法 , 每个进程 都会获得一段...( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) ---- 在 linux-5.6.18\include\linux\sched.h 头文件中 task_struct...-5.6.18\include\linux\sched.h#680 上述可设置的调度类参考 【Linux 内核】调度器 ⑦ ( 调度器类型 | 停机调度类 stop_sched_class | 限期调度

1.7K40

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

2.8K31

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

1.2 CFS虚拟时钟 完全公平调度算法CFS依赖于虚拟时钟, 用以度量等待进程在完全公平系统中所能得到的CPU时间. 但是数据结构中任何地方都没有找到虚拟时钟....这就是CFS的公平策略. CFS调度算法的思想:理想状态下每个进程都能获得相同的时间片,并且同时运行在CPU上,但实际上一个CPU同一时刻运行的进程只能有一个。...键值通过entity_key计算, 该函数在linux-2.6之中被定义, 但是后来的内核中移除了这个函数, 但是我们今天仍然讲解它, 因为它对我们理解CFS调度器和虚拟时钟vruntime有很多帮助,...NICE_0_LOAD / weight 该公式通过calc_delta_fair函数计算, 在sched_vslice函数中也被用来转换分配到的延迟时间间隔. 6 总结 CFS调度算法的思想 理想状态下每个进程都能获得相同的时间片...而,CFS调度器中的权重在内核是对用户态进程的优先级nice值, 通过prio_to_weight数组进行nice值和权重的转换而计算出来的 虚拟时钟相关公式 linux内核采用了计算公式: 属性 公式

2.9K62

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.1K31

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

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

3.1K10

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.1K10

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技巧

45830

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

但凡懂Linux内核的,都知道Linux内核的CFS进程调度算法,无论是从2.6.23将其初引入时的论文,还是各类源码分析,文章,以及Linux内核专门的图书,都给人这样一种感觉,即 CFS调度器是革命性的...,它将彻底改变进程调度算法。...---- 为什么CFS对别的调度算法没有带来碾压的效果呢? 首先,在真实世界,碾压是不存在的,人与人,事与事既然被放在了同一个重量级梯队比较,其之间的差别没有想象的那么大,根本就不在谁碾压谁。...那么Linux CFS调度器被采用,它的目标是解决什么问题的呢?它肯定是针对O(1)算法的一个问题而被引入并取代O(1),该问题也许并非什么臭名昭著,但是确实是一枚钉子,必须拔除。...---- 回到进程调度的话题,正因为Linux一直在关注调度算法本身以及其实现的代码,才会出现 The Linux Scheduler: a Decade of Wasted Cores ,这篇十分中肯的

2.4K20

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调度器之负荷权重load_weight--Linux进程的管理与调度(二十五)

/include/linux/sched.h?...这样就正好产生了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.4K10

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.1K10

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

2K30

Linux进程调度之 - O(1)调度算法

Linux是一个支持多任务的操作系统,而多个任务之间的切换是通过 调度器 来完成,调度器 使用不同的调度算法会有不同的效果。...Linux2.4版本使用的调度算法的时间复杂度为O(n),其主要原理是通过轮询所有可运行任务列表,然后挑选一个最合适的任务运行,所以其时间复杂度与可运行任务队列的长度成正比。...而Linux2.6开始替换成名为 O(1)调度算法,顾名思义,其时间复杂度为O(1)。...虽然在后面的版本开始使用 CFS调度算法(完全公平调度算法),但了解 O(1)调度算法 对学习Linux调度器还是有很大帮助的,所以本文主要介绍 O(1)调度算法 的原理与实现。...O(1)调度算法原理 prio_array 结构 O(1)调度算法 通过优先级来对任务进行分组,可分为140个优先级(0 ~ 139,数值越小优先级越高),每个优先级的任务由一个队列来维护。

4.6K81

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

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

1.9K20
领券