【内核调度、负载均衡】【entity_tick】

深入解析Linux进程调度器-CPU负载 CPU负载(cpu load)指的是某个时间点进程对系统产生的压力。来张图来类比下(参考Understanding Linux CPU Load)CPU的运行能力,就如大桥的通行能力,分别有满负荷,非满负荷,超负荷等状态,这几种状态对应不同的cpu load值;单CPU满负荷运行时cpu_load为1,当多个CPU或多核时,相当于大桥有多个车道,满负荷运行时cpu_load值为CPU数或多核数; 阅读详情

在scheduler_tick函数中会调用task_tick函数,具体到fair class,他的入口函数为

task_tick_fair

/*
 * scheduler tick hitting a task of our scheduling class:
 */
 /*  获取到当前进程curr所在的调度实体  */
static void task_tick_fair(struct rq *rq, struct task_struct *curr, int queued)
{
	struct cfs_rq *cfs_rq;
	/*  获取到当前进程curr所在的调度实体  */
	struct sched_entity *se = &curr->se;
	/* for_each_sched_entity
     * 在不支持组调度条件下, 只循环一次
     * 在组调度的条件下, 调度实体存在层次关系,
     * 更新子调度实体的同时必须更新父调度实体  */
	for_each_sched_entity(se) {
		/*  获取当当前运行的进程所在的CFS就绪队列  */
		cfs_rq = cfs_rq_of(se);
		/*  完成周期性调度  */
		entity_tick(cfs_rq, se, queued);
	}

	if (static_branch_unlikely(&sched_numa_balancing))
		task_tick_numa(rq, curr);

	update_misfit_status(curr, rq);

	update_overutilized_status(rq);
}

我们可以看到, CFS周期性调度的功能实际上是委托给entity_tick函数来完成的

entity_tick

static void
entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued)
{
	/*
	 * Update run-time statistics of the 'current'.
	 */
	update_curr(cfs_rq);

	/*
	 * Ensure that runnable average is periodically updated.
	 */
	update_load_avg(curr, UPDATE_TG);
	update_cfs_shares(curr);

	//接下来是hrtimer的更新, 这些由内核通过参数CONFIG_SCHED_HRTICK开启
#ifdef CONFIG_SCHED_HRTICK
	/*
	 * queued ticks are scheduled to match the slice, so don't bother
	 * validating it and just reschedule.
	 */
	if (queued) {
		resched_curr(rq_of(cfs_rq));
		return;
	}
	/*
	 * don't let the period tick interfere with the hrtick preemption
	 */
	if (!sched_feat(DOUBLE_TICK) &&
			hrtimer_active(&rq_of(cfs_rq)->hrtick_timer))
		return;
#endif
	//如果进程的数目不少于两个, 则由check_preempt_tick作出决策
	if (cfs_rq->nr_running > 1)
		check_preempt_tick(cfs_rq, curr);
}

update_curr主要是更新vruntime和min_vruntime

https://blog.youkuaiyun.com/feifei_csdn/article/details/107200966

update_load_avg主要是更新entity和cpu的负载

https://blog.youkuaiyun.com/feifei_csdn/article/details/107381373

check_preempt_tick

/*
 * Preempt the current task with a newly woken task if needed:
 */
static void
check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
{
	unsigned long ideal_runtime, delta_exec;
	struct sched_entity *se;
	s64 delta;
	/*  计算curr的理论上应该运行的时间  */
	ideal_runtime = sched_slice(cfs_rq, curr);
	 /*  计算curr的实际运行时间
     *  sum_exec_runtime: 进程执行的总时间
     *  prev_sum_exec_runtime:进程在切换进CPU时的sum_exec_runtime值  */
	delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
	 /*  如果实际运行时间比理论上应该运行的时间长
     *  说明curr进程已经运行了足够长的时间
     *  应该调度新的进程抢占CPU了  */
	if (delta_exec > ideal_runtime) {
		//resched_curr(rq_of(cfs_rq))设置重调度标识, 从而触发延迟调度
		resched_curr(rq_of(cfs_rq));
		/*
		 * The current task ran long enough, ensure it doesn't get
		 * re-elected due to buddy favours.
		 */
		clear_buddies(cfs_rq, curr);
		return;
	}

	/*
	 * Ensure that a task that missed wakeup preemption by a
	 * narrow margin doesn't have to wait for a full slice.
	 * This also mitigates buddy induced latencies under load.
	 */
	if (delta_exec < sysctl_sched_min_granularity)
		return;

	se = __pick_first_entity(cfs_rq);
	delta = curr->vruntime - se->vruntime;

	if (delta < 0)
		return;
//curr进程与红黑树中最左进程left虚拟运行时间的差值大于curr的期望运行时间ideal_runtime
	if (delta > ideal_runtime)
		resched_curr(rq_of(cfs_rq));
}
// 选择最左边的entity
struct sched_entity *__pick_first_entity(struct cfs_rq *cfs_rq)
{
	struct rb_node *left = rb_first_cached(&cfs_rq->tasks_timeline);

	if (!left)
		return NULL;

	return rb_entry(left, struct sched_entity, run_node);
}

 

CFS及RT调度整体介绍 linux内核调度子系统——CFS调度器/组调度,cfs,组调度,lazy preemption 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第五十一篇 Linux内核函数算法与依赖关系

函数名称算法表达式/方程名称方程表达参数列表软件依赖硬件依赖应用场景时间复杂度空间复杂度​进程调度决策算法P:进程集合t:时间w_i:权重cpu:CPU1. 定时器中断2. 进程状态机3. 负载均衡4. 上下文切换协议1. 时间戳计数器2. 缓存层次3. 中断控制器4. TLB刷新进程调度O(log n)O(k)​进程创建算法clone_flags:克隆标志1. 命名空间时序2. 资源计费3. 信号处理4. 调度器激活。

weixin_49199313的博客 444

linux运行的代码分析,linux调度器源码分析 - 运行(四)

引言之前的文章已经将调度器的数据结构、初始化、加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运行的情况下进行进程调度的。系统定时器因为我们主要讲解的是调度器,而会涉及到一些系统定时器的知识,这里我们简单讲解一下内核中定时器是如何组织,又是如何通过通过定时器实现了调度器的间隔调度。首先我们先看一下内核定时器的框架在内核中,会使用strut clock_event_device结构描述...

weixin_35987371的博客 396

【信息科学与工程学】计算机科学与自动化—第十五篇 云计算 11 算法篇01

编号类型领域问题问题的数学分析(含几何学/拓扑学/代数学/数论/集合论/离散数学/概率论/统计学/其他)及数值分析及算法分析及参数列表及参数数值设计C/C++/rust/python代码软件(含编译器)及硬件资源需求(CPU/GPU/内存【NAND/DRAM/HBM/其他】/HBM、HDD、SSD、RAID卡、其他)关联知识1工作负载调度数据中心最小化总完成时间/成本。

weixin_49199313的博客 220

Linux进程调度(2):CFS调度操作

Linux主要实现了两大类调度算法,CFS(完全公平调度算法)和实时调度算法。宏SCHED_NOMAL和SCHED_BATCH主要用于CFS调度,而SCHED_FIFO和SCHED_RR主要用于实时调度。这几个宏的定义可以在include/linux/sched.h中找到。文件kernel/sched.c包含了内核调度器及相关系统调用的实现。调度的核心函数为sched.c中的schedule(),

Jack Zhou的专栏 6463

USB2.0物理层实战:手把手教你用示波器抓取D+/D-信号(附波形分析)

本文是一份针对硬件工程师的USB2.0物理层信号调试实战指南。文章详细讲解了如何使用示波器捕获和分析D+/D-差分信号,从基础设置、核心信号状态解读,到信号完整性分析与常见问题排查,手把手教你定位USB通信故障。内容涵盖USB2.0协议物理层关键概念,并附有基础解码思路,旨在提升工程师的底层调试能力。

s8t9u0v1w的博客 453

PyTorch实战:5步搞定Res2Net图像分类模型(附完整代码)

本文详细介绍了如何使用PyTorch在5步内构建高性能Res2Net图像分类模型,包括环境配置、核心模块实现、完整网络架构搭建、训练流程优化及模型部署技巧。Res2Net通过多尺度特征融合机制显著提升图像分类性能,附完整代码帮助开发者快速实践。

java5的博客 1024

linux调度器源码分析 - 运行(四)

linux调度器源码分析 - 运行(四) 本文为原创,转载请注明:http://www.cnblogs.com/tolimit/   引言   之前的文章已经将调度器的数据结构、初始化、加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运行的情况下进行进程调度的。   系统定时器   因为我们主要讲解的是调度器,而会涉及到一些系统定时器的知识,这里我们简单讲解

zdy0_2004的专栏 735

FMEA-MSR步骤三:功能分析

目的 FMEA-MSR功能分析的主要目标: ● 功能及各功能之间的关系的可视化 ● 功能树/网络或等效功能矩阵参数图(P图) ● 顾客(外部和内部)功能与相关要求的关联 ● 要求或特性与功能的关联 ● 工程团队(系统、安全和组件)之间的协作 ● 失效分析步骤的基础 (点击链接进入官网领取软件试用) 在监视及系统响应的补充FMEA中,对失效探测和失效响应的监视视为其具有的功能。硬件和软件功能可能包括监视控制状态的功能。 故障/失效的监视和探测功能可能包括超出范围的探测、循环冗余校验、真实性检查和序列计数器检查

Infomass的博客 2391

linux cfs 参数设置,Linux CFS如何处理周期性调度器、CFS的周期性调度及总结

1. CFS如何处理周期性调度器周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期性调度器通过调用curr进程所属调度器类sched_class的task_tick函数完成周期性调度的工作周期调度的工作形式上sched_class调度器类的task_tick函数完成, CFS则对应t...

weixin_34902464的博客 683

Unity游戏开发客户端面经——设计模式(初级)

Unity游戏开发客户端面经 之 设计模式 篇

Sea3752的博客 9433

基于STM32L4XX、HAL库的AD7124-8BCPZ模数转换器ADC驱动程序设计

/ 公式: Voltage = (adc_value / (2^23 - 1)) * Vref。// 模式控制位[7:5]=000 (连续转换模式)// 3.2 配置通道0,使其使用AIN0(+)和AIN1(-),并关联到配置0和滤波器0。= 0x14) { // AD7124-8的ID是0x14。// 双极性操作,缓冲AINP/AINN。

zhusl6688的博客 377

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

日期 内核版本 架构 作者 GitHub 优快云 2016-07-29 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 CFS负责处理普通非实时进程, 这类进程是我们linux中最普遍的进程1 前景回顾1.1 CFS调度算法CFS调度算法的思想理想状态下每个进程都能获得相同的时间

OSKernelLAB(gatieme) 6653

【2026年华为暑期实习(AI)-4月22日-第三题- 网络异常流量传播链路溯源】(题目+思路+Java&C++&Python解析+在线测试)

本文提出了一种基于空间距离和流量负载的网络异常传播链检测方法。首先通过曼哈顿距离建立基站间的直接关联关系,形成无向图;然后计算各连通块的总负载,筛选出关键节点;最后在关键节点构成的有向无环图(DAG)中寻找用户数最大的传播路径。算法采用DFS/BFS识别连通块,并通过动态规划求解最长路径,时间复杂度为O(N^2)。该方法适用于监控网络中异常流量的定向传播分析,能有效识别高负载区域和最大影响路径。

m0_73659489的博客 187

Linux进程调度与管理:(五)进程的调度之调度节拍

文章介绍:本篇文章围绕调度节拍展开,讲述了时钟中断按频率触发时,会执行时钟中断,并检查是否需要抢占当前进程

abobob的博客 1222

ABAP 7.40 FOR 表达式与 REDUCE 构造运算符深度解析:从语法新特性到真实项目实践

ABAP 7.40引入了FOR和REDUCE表达式语法,使代码更简洁和函数式。FOR支持内表迭代和条件迭代,可配合VALUE构造新内表,替代传统LOOP。REDUCE用于归约运算,将多值折叠为单一结果,如求和、拼接等。这些新特性让ABAP更现代化,与SAP新架构协同更好,提升了开发效率和代码可读性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 320

max96712 GMSL1/2 相机调试记录

在部分相机调试中,使用i2cdetect 无法进行i2c扫描,一旦进行扫描会影响整个I2C总线通信异常,但是其能使用i2ctranfer命令进行读写操作,并不影响相机的开发调试。max96712的流路径分布如下图所示,需要通过对max96712进行相关配置,对GMSL-A/B/C/D进入的数据规划pipe。确认VID_PKL_DET 状态。max96712相关状态确认。MAX97612 状态确认。Linux 状态确认。

navy2015_163的博客 1106

Linux-进程的管理与调度27(基于6.1内核)

Linux-进程的管理与调度27(基于6.1内核)---Linux CFS调度器之周期性调度器

ListQ的博客 970

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux CFS 的 task_tick:时钟 tick 中的任务状态更新与抢占检查

Linux内核CFS调度器task_tick机制分析 摘要:本文深入分析了Linux内核CFS调度器的task_tick机制。CFS作为默认调度器,通过task_tick周期性更新任务虚拟运行时间(vruntime)并触发抢占决策。文章详细解析了task_tick的调用链、核心函数实现及抢占逻辑,包括update_curr记账机制和check_preempt_tick的双条件抢占判断。通过实验展示了不同优先级任务的vruntime差异,并提供了性能优化建议。该机制在云原生调度、实时系统等场景中具有重要作用,

望获实时Linux系统 409

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux CFS调度器实现原理及源码解析

基于Linux 4.18.10Linux CFS调度器,即完全公平调度器(Completely Fair Scheduler),是在2.6.23内核版本中引入的,目前是Linux内核默认的调度器。CFS调度算法的设计理念:在真实的硬件上实现理想的、精准、完全公平的多任务调度。如果CPU分配的时间为T,则n个进程,每个进程拥有CPU的时间片为:TimeSlice = (1/n) * T用什么指标来体现CFS的设计理念 ?CFS通过维护一个虚拟运行时间(vruntime)来体现这种思想。根据以上两个计算公式可推

singapore_online的博客 1251

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

(五)Linux 调度器 - CFS调度器

Linux的完全公平调度器(CFS)采用红黑树管理调度实体,通过虚拟运行时间(vruntime)实现公平调度。CFS核心数据结构包括调度类sched_class、运行队列rq/cfs_rq和调度实体sched_entity,使用面向对象设计实现调度策略。调度流程包含任务入队/出队、时间片计算和任务选择:通过权重分配运行时间,将vruntime最小的任务优先调度;每个调度tick更新运行时信息并检查抢占;任务切换时通过pick_next_task_fair选择下一个任务。CFS实现了高效的O(log n)调度

LiuYong_01的博客 923

进程管理基础学习笔记 - 4. scheduler_tick

目录1. 前言2. scheduler_tick参考文档 1. 前言 本专题我们开始学习进程管理部分。本文主要参考了《奔跑吧, Linux内核》、ULA、ULK的相关内容。本文只是作为学习笔记以用于构建知识框架,可能存在一些理解不恰当或不到位的地方,后续会随着学习的深入,逐步进行迭代。 本文主要记录system tick中断时进程调度部分的处理流程,注意此函数只是在判断符合条件时设置了TIF_NEED_RESCHED 标志,并没有真正执行进程切换。 kernel版本:5.10 平台:arm64 2. sch

HZero 436

Linux 调度子系统介绍:从 rq、cfs_rq 到调度实体流转

Linux 调度子系统可以从三个层次理解。它们决定不同类型任务之间的优先级关系。rq 是每个 CPU 的调度总队列;cfs_rq 是 fair 调度类的运行队列。红黑树保存等待 CPU 的 runnable entity;curr 保存当前正在 CPU 上运行的 entity;on_rq 表示 entity 仍属于 runnable 体系,但不表示它一定在红黑树中。CPU rq├── dl_rq├── rt_rq├── cfs_rq│ ├── tasks_timeline 红黑树。

lullaby2333的博客 209

Linux进程调度器原理与CFS实现深度解析

进程调度是操作系统核心机制,负责在多任务环境中公平分配CPU资源。Linux内核采用模块化调度设计,包含完全公平调度器(CFS)、实时调度器等五大调度类,通过虚拟运行时间算法实现任务优先级管理。CFS调度器作为默认调度策略,使用红黑树结构维护进程的vruntime值,确保CPU时间公平分配。在嵌入式系统和服务器场景中,合理的调度策略能显著提升系统响应性和吞吐量。通过/proc文件系统和cgroup机制,开发者可以监控调度行为并进行性能调优,例如调整调度粒度或设置CPU带宽限制。实时任务处理和多核负载均衡是L

weixin_34152820的博客 400

【原创】(五)Linux进程调度-CFS调度器

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

sunshineywz的博客 825

【信息科学与工程学】计算机科学与自动化——第一百三十六篇 软件及工具02 Linux 底层内核参数全体系 01

这个参数体系为Linux内核的开发、调优和问题诊断提供了完整的基础。:通过sysctl、procfs等接口可配置。:基于系统特性和硬件条件设置合理默认值。参数默认值应考虑系统配置和硬件能力。需要详细的文档说明每个参数的作用。:多数参数可以在运行时动态调整。分配阶数(2^order页):每个参数都有明确的有效范围。参数访问需要适当的同步机制。SOCK_STREAM等。IPPROTO_TCP等。Guest CPU时间。__GFP_WAIT等。FMODE_READ等。TCP_CLOSE等。AppArmor状态。

weixin_49199313的博客 1046

Linux 进程调度完整篇:从task_struct、fork到CFS/实时类与排障

Linux 进程调度完整篇:从 task_struct、fork 到 CFS/实时类与排障 线上 CPU 打满、延迟抖动、 状态误判、僵尸堆积——根因常落在 **进程模型与调度路径**,而不是「再加几核」。本文把进程创建、状态机、CFS/实时调度类、上下文切换、cgroup 配额与观测命令合成一篇闭环,方便对照源码与 验证。 源码锚点 路径 作用 ------ ------ 、、进程状态宏 、(fork/clone 核心) 、、、唤醒入口 CFS:/、、负载均衡相关 / 实时类 、僵尸与 回收 等 架构侧

qq_35223473的博客 236
上一篇: 【内核调度、负载计算】【calc_global_load_tick】
下一篇: 【负载均衡、负载计算】【propagate_entity_load_avg】
money_yuan
博客等级 码龄10年 104粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值