- 博客(201)
- 资源 (34)
- 问答 (1)
- 收藏
- 关注
原创 cfs调度类深入解刨——CAS科普篇
本文介绍了Linux内核中的缓存感知调度(CAS)技术及其架构设计。CAS通过理解硬件缓存拓扑,减少多线程应用中的缓存未命中和颠簸问题,显著提升了高并发任务性能(14%-44%)。传统调度器仅关注CPU负载均衡,而CAS在负载均衡中引入"任务聚合"逻辑,优先将数据共享线程调度在同一缓存域内,同时通过动态负载平衡避免过度迁移。内核为此扩展了task_struct结构,并与mm_cid机制协同工作,实现高效的无锁切换。文章还列出相关结构体(如mm_sched)及系列技术文章的链接。
2026-06-16 17:22:48
337
原创 cfs调度类深入解刨——mm_cid科普篇
Linux内核mm_cid机制解析 核心作用 mm_cid(内存描述符并发ID)是Linux内核5.15引入、6.3完善的关键优化技术,旨在解决高并发进程的调度与内存管理痛点。其核心思想是为每个进程内存空间(mm_struct)维护一套紧凑的并发ID池,替代传统的物理CPU核心ID,显著提升多核系统性能并降低硬件资源消耗。 技术突破 动态ID分配:根据进程实际并发线程数动态分配ID(如1000线程仅需4个ID),突破物理CPU数量限制。 调度深度融合:通过快/慢路径协同机制,实现无锁ID分配与惰性回收,单次
2026-06-16 15:23:37
343
原创 cfs调度类深入解刨——RDT科普篇
本文介绍了Linux内核中Intel RDT(资源导向技术)的实现背景与设计方案。RDT通过硬件级"标签与配额"机制解决多核共享资源的"嘈杂邻居效应",主要包括缓存分配(CAT)、内存带宽分配(MBA)及监测功能(CMT/MBM)。文章详细分析了RDT的CLOSID/RMID硬件标识、资源控制架构、内核配置演进以及用户界面使用方法,展现了软硬件协同实现服务质量隔离的技术原理。
2026-06-15 16:59:18
410
原创 cfs调度类深入解刨——cfs任务状态统计细节篇
本文深入分析了Linux CFS调度器中关于任务阻塞、睡眠的统计机制,重点剖析了三个关键时间戳(block_start、in_iowait、sleep_start)的作用原理和应用场景。block_start记录进程因资源竞争被迫阻塞的起始时间,用于诊断D状态延迟;in_iowait标记I/O等待状态,影响CPU利用率统计和调频策略;sleep_start跟踪进程主动休眠时长。文章通过内核源码解析了这些统计量的生命周期和更新时机,并阐述了它们在性能调优(如schedutil调频器)和系统监控(如PSI机制)
2026-06-15 11:33:44
236
原创 cfs调度类深入解刨——pelt细节篇
文章摘要: 本文深入剖析Linux内核中的PELT(Per-Entity Load Tracking)机制及其相关特性。PELT通过指数加权移动平均(EWMA)算法,以微秒级精度跟踪CPU核心、进程及容器等实体的负载历史,为调度决策(如CFS负载均衡、EAS异构调度)、频率调节(schedutil)及算力分配(Cgroups)提供关键依据。针对PELT的冷启动/退场延迟问题,内核引入补丁如Util Clamp(强制设定利用率边界)和util_est(快速预测唤醒任务负载),优化了瞬态响应能力。文章详细解析了
2026-06-12 11:41:06
531
原创 cfs调度类深入解刨——psi科普篇
本文介绍了Linux内核中的PSI(Pressure Stall Information)机制,它通过量化CPU、内存和I/O资源紧张对任务执行效率的影响,提供比传统指标更精准的系统健康评估。PSI将资源压力分为"some"(部分阻塞)和"full"(完全阻塞)两个维度,分别反映部分或全部任务因资源不足而停滞的情况。其核心价值在于: 直接测量资源不足导致的时间损失,而非简单的利用率 提供纳秒级精度的压力统计,嵌入调度器/内存管理/I/O路径 支持基于事件的实时通知机制,支持主动防御 特别适用于云原生环境,可
2026-06-11 13:54:45
507
原创 cfs调度类深入解刨——HZ科普篇
本文深入分析了Linux内核中时钟HZ相关配置的发展历程和实现机制。首先介绍了HZ参数的基本概念及其对系统调度、时间统计等关键功能的影响,详细对比了不同HZ值的适用场景及性能权衡(100Hz/250Hz/300Hz/1000Hz)。随后阐述了CONFIG_HZ_PERIODIC的工作模式和被淘汰的原因,重点讲解了现代内核采用的动态无滴答技术:CONFIG_NO_HZ_IDLE和CONFIG_NO_HZ_FULL,包括其节能原理、实现机制(单次触发模式)以及在不同CPU状态下的行为差异。文章还讨论了这些技术对
2026-06-10 14:29:49
292
原创 cfs调度类深入解刨——clock科普篇
本文介绍了Linux内核中时钟定时器的原理与实现方式。内核通过硬件时钟源(如TSC、HPET)生成原始时间信号,并将其转化为jiffies(低精度)和ktime_t(高精度)两种时间轴。定时器分为传统低精度定时器(基于时间轮算法)和高精度定时器(基于红黑树),分别处理不同精度的定时任务。同时,文章还详细讲解了sched_clock_data结构体在多核系统中校正时钟漂移、保证时钟单调性的关键作用,以及它与硬件时钟源和全局时间系统的协同机制。
2026-06-08 13:45:22
342
原创 cfs调度类深入解刨——EAS科普篇
#define HAVE_RT_PUSH_IPI int push_cpu; 记录一个CPU,用于在实时任务调度时进行IPI(处理器间中断)推送 struct irq_work rt_push_work; 用于执行RT推送工作的中断工作队列。当某个CPU上的实时任务需要迁移时,会通过这个工作队列发送IPI raw_spinlock_t rto_lock; 保护RT过载状态的自旋锁 #endif struct cpupri cpupri; 用于实时调度器的CPU优先级管理 unsigned long max_
2026-06-05 15:23:18
510
原创 cfs调度类深入解刨——irq科普篇
本文深入解析Linux内核中断处理机制,重点介绍IRQ(中断请求)的工作原理及上下半部分工。硬件中断通过中断控制器(APIC/GIC)向CPU发送信号,触发中断服务程序执行。内核通过两次技术革新优化中断处理:动态时钟(NO_HZ)降低空闲功耗,高精度定时器(HRTIMER)提升响应精度。文章详细分析中断对CFS调度的影响及优化策略,如中断绑核隔离,并阐述上半部(快速硬件响应)和下半部(耗时任务处理)的分工机制。
2026-06-04 16:36:08
453
原创 cfs调度类深入解刨——MMU科普篇
上一篇中讲述了kernel 7.1版本中的调度组的实现原理及历史背景。本篇文章讲述MMU和TLB原理及实际运行情况。
2026-06-03 17:45:04
245
原创 cfs调度类深入解刨——最新内核细节分析6
本文深入解析了Linux内核中CFS调度组的实现原理,包括任务组的基本架构、CFS带宽控制机制以及突发负载处理。文章从历史背景出发,介绍了任务组的引入初衷,并详细剖析了struct task_group的数据结构及其层级关系。重点分析了CFS带宽控制的配额管理、限流机制和突发流量处理(burst特性),同时提供了cgroup v1/v2的实际配置示例。通过内核源码和参数说明,揭示了调度组如何实现CPU资源的公平分配和突发负载应对。
2026-06-03 11:34:28
247
原创 cfs调度类深入解刨——最新内核细节分析5
本文深入解析了NUMA(非一致性内存访问)架构在内核调度中的关键细节。主要内容包括:1)NUMA节点的性能特点,CPU访问本地节点内存快于远端节点;2)NUMA拓扑结构类型(DIRECT、GLUELESS_MESH、BACKPLANE)及其特点;3)NUMA调度均衡机制,包括任务自主驱动的PTE扫描、故障统计和内存迁移策略;4)多线程共享内存空间的协同扫描机制;5)扫描周期的动态调整(1秒到60秒),根据NUMA故障情况优化性能。文章还提供了相关系列文章的链接,帮助读者系统了解CFS调度器的实现细节。
2026-06-02 15:20:15
343
原创 cfs调度类深入解刨——最新内核细节分析4
本文分析了Linux内核7.1版本中的任务调度机制,重点剖析了CFS调度类的任务选取逻辑和核心调度功能。文章首先介绍了基础任务选取函数__pick_next_task的工作流程,包括again、simple和idle三个主要分支:again分支处理常规任务选取过程,simple分支处理简单调度场景,idle分支处理CPU空闲时的任务拉取逻辑。随后详细讲解了调度核心(CONFIG_SCHED_CORE)功能,该功能自5.14版本引入,用于管理超线程环境中的任务调度,通过定义可共享物理核心的任务组来平衡安全与性
2026-06-01 17:53:29
307
原创 cfs调度类深入解刨——最新内核细节分析3
本文分析了Linux内核7.1版本中dl服务器(dl_server)的实现技术和deadline调度类原理。dl服务器是kernel 6.8新增功能,通过创建高优先级的dl调度实体,为低优先级任务保留5%的CPU时间配额(50ms/1000ms),解决了实时任务独占CPU导致系统空闲的问题。deadline调度类采用类似eevdf的简易实现,维护dl_rq红黑树和cpudl结构,通过截止日期排序和过载检测机制确保实时性。文章还提供了系列分析文章的索引,涵盖CFS调度类的核心结构、实现细节等内容。
2026-05-29 18:20:17
579
原创 cfs调度类深入解刨——最新内核细节分析2
本文深入解析Linux内核7.1版本中的"代理调度运行"(SCHED_PROXY_EXEC)机制,该功能通过让锁持有者优先执行来避免优先级反转问题。文章首先阐述了优先级反转的经典场景,介绍了RT-Mutex和PI-Futex的历史解决方案。随后详细分析了代理调度的7步执行逻辑,其核心是确保锁持有者优先执行以释放资源。此外还介绍了配套的"延迟出列"(sched_delayed)功能,该机制通过控制任务出列行为来优化调度效率。本文是CFS调度器系列分析的第四篇,前序文章可通过文末链接查看。
2026-05-28 18:24:10
494
原创 cfs调度类深入解刨——最新内核细节分析1
本文分析了Linux内核7.0及以上版本中CFS调度类的关键改进,重点关注权重溢出和优先级反转问题的优化。文章介绍了热任务判定标准、最小虚拟运行时间(min_vruntime)的调整、新增的受保护截止时间(vprot)机制,以及虚拟运行时间权重总和(sum_w_vruntime)的计算方式。还详细说明了多重抢占唤醒模式(PREEMPT_WAKEUP)的四种类型及其触发条件,以及CFS队列叶子链表节点的作用机制。这些改进旨在解决大规模服务器(如512核)面临的CPU负载不均衡和优先级反转问题。
2026-05-27 18:35:00
455
原创 cfs调度类深入解刨——核心结构细节分析
本文对比分析了CFS基础版本与EEVDF版本在调度策略、任务选取机制和时间补偿方面的核心差异。基础版本通过TIF_NEED_RESCHED标志实现抢占,但虚拟时间更新机制可能导致实时性不足;EEVDF版本引入deadline概念,通过NEXT_BUDDY特性和虚拟时间片补偿机制显著提升实时性。在时间补偿方面,基础版本采用归一化虚拟时间处理新任务,而EEVDF通过虚拟滞后值计算和半时间片初始化补偿优化任务响应。这些改进使EEVDF版本在任务切换效率和实时性方面更具优势,尤其适合需要快速响应的场景。
2026-05-22 16:30:30
482
原创 cfs调度类深入解刨——核心结构的用意
cfs调度类可以说是每个内核工程师必学的子模块,但代码逻辑层级较为丰富,需要一定积累才能看懂部分代码。本片文章以每行逐步分析方式,将cfs调度类包括eevdf逻辑等核心结构为大家一一呈现。cfs调度流程图(文章中讲述eevdf逻辑)
2026-03-19 20:25:02
876
原创 mount:从应用软件到内核函数执行的过程
在linux内核中,不同的文件系统以文件系统类型结构(struct file_system_type)保存在静态指针file_systems(static struct file_system_type *file_systems;),如ext4文件系统,它通过ext4_fs_type结构对象完成内核中的文件系统类型注册。如mount在装载ext4文件系统类型时,基本首先要做的就是分配文件系统上下文,为各种成员赋值,包括文件系统类型结构,之后执行ext4_init_fs_context 初始化上下文函数关联
2023-01-12 23:50:35
2124
原创 grub2: autogen.sh执行过程
GNU GRUB是一个Multiboot引导加载程序。它源自GRUB,GRand Unified Bootloader,最初由Erich Stefan Boleyn设计和实现。简而言之,引导加载程序是计算机启动时运行的第一个软件程序。它负责加载并将控制转移到操作系统内核软件 (如Hurd或Linux)。内核反过来初始化操作系统的其余部分 (例如GNU)。GRUB2取代了以前称为 GRUB 的内容 (即 0.9x 版),保留为GRUB Legacy模块。
2022-12-12 00:42:28
943
3
原创 linux设备模型:pci驱动程序注册过程
MANF_ID 表示厂商ID 是一个数字ID,如0xfead 或 PCI_ANY_ID(表示通用),如果有真实硬件应与硬件ID一致MODEL_CODE 表示厂商设备 是一个数字ID,如0x1234 或 PCI_ANY_ID(表示通用),如上默认情况下,子系统的厂商ID和厂商设备ID不用设置,它们采用PCI_ANY_ID(表示通用),class、class_mask等成员默认也不需要指定,在设备创建后,创建相关对象关联设备节点即可(或创建时指定父级)pci_probe: 驱动探测函数,可在函数内
2022-11-28 01:32:51
2919
原创 linux虚拟化: svm: 初始化及重要函数分析
svm是一种虚拟机环境,可用于AMD64、海光64或Intel EM64T CPU。这种新型的虚拟机技术可以提高性能和节能,但您需要在使用任何使用它的软件之前启用它。“支持向量机模式”是允许AMD处理器使用支持向量机指令集的功能。这对于需要同时兼容Intel、AMD和海光处理器的应用程序很有帮助。svm通过创建kvm,注册svm_init_ops初始操作结构,完成硬件的一系列初始化及包含功能操作结构的访问方式。
2022-11-25 00:20:01
1877
原创 linux虚拟化: kvm: 初始化及创建用户过程
基于内核的虚拟机(KVM)是一种内建于Linux的开源虚拟化技术。具体而言,KVM可帮助您将Linux转变为虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机(VM)。Linux自内核版本号2.6.20起,植入KVM内核源码,因此KVM能享受每一项新的Linux功能、修复和发展,无需进行额外工程。KVM全称为Kernel-based Virtual Machine,基于内核的虚拟机,它主要起到内核层的虚拟资源分配、管理,然后由用户层软件模拟出我们使用的虚拟机客户
2022-11-20 01:19:06
2047
原创 linux设备模型:固件设备及efi固件(平台)设备节点创建过程分析
本篇分析固件系列(以efi为例),固件可以分为(系统)引导阶段(efi stub启动模式)、固件内存映射(物理地址映射到虚拟地址等等)、固件注册到平台设备、平台设备运行等等。固件设备具有更广泛的意义,当然复杂度也更高一些。 固件系列更偏向于开发板,通常由内核模块(服务)与应用程序完成一些硬件级上电/下电及设备形式控制(如更新固件)等等。参考Documentation中一些文章内容
2022-11-17 23:23:05
1724
原创 linux设备模型:设备及设备节点创建过程分析
本篇分析设备的初始化及注册过程,包括设备与驱动绑定,设备与电源管理之间的联系、中断域的储存及物理设备之间的关系等等。这一篇内容较多,结合kobject、kset、class、bus等众多概念,也是从理论阶段转换为实际使用阶段的重要过程。 设备初始化阶段,创建kset容器结构对象devices_kset,用于设备的uevent(用户事件通知)操作。dev_kobj表示设备根对象,在它的基础上扩展(延伸)sysfs_dev_block_kobj("block") 块设备根对象和sysfs_dev_ch
2022-11-13 21:38:01
1430
原创 linux设备模型:devtmpfs虚拟文件系统分析
devtmpfs是一个设备文件系统,它将其所有文件保存在虚拟内存中。devtmpfs中的所有内容都是临时的,因为不会在您的硬盘驱动器上创建任何文件。如果卸载devtmpfs实例,其中存储的所有内容都将丢失。 devtmpfs的根路径在/dev,它通过文件系统上下文创建mount(挂载)对象,使得用户层可以访问。 devtmpfs通过devtmpfsd线程函数,分配新的命名空间代理(nsproxy)对象,并分配、关联多类命名空间,如mnt、uts、ipc、pid、cgroup、n
2022-11-10 01:00:29
4581
1
原创 linux设备模型:bus概念及pci_bus分析
bus(总线)是一种特殊的抽象框架,与class有着本质上的不同,class感觉上只是把一些核心组件聚集在一起,它主要为访问组件提供便利(如提供组件地址),而bus则是实实在在的功能性框架,它即可负责管理、维护驱动与设备之间的关系,也可作为主桥设备与硬件之间的访问通道等等。如pci总线,当pci硬件设备插入卡槽后,首先通过pci_bus_type(pci总线操作结构) 中的 pm(电源操作结构)操作相关函数唤醒设备,然后通过pci_bus_match函数查找硬件设备是否被注册到驱动(通过pc
2022-11-06 14:40:26
2058
原创 linux设备模型:kset及设备驱动抽象类(class)分析
kset属于kobject属于特定子系统的一组特定类型的kobject,与其说是一组特定类型,倒不如说用kset表示一组特定类型的kobject更方便与管理、遍历等操作,实际场景中如果需要以某个根为目标的多组特定类型的kobject,可以编写复合型kset容器,以根kset容器为基础(实际还是根kobject),在它之后继续关联多个不同的kset容器,当然,这也是linux内核中设备驱动的现状。kset容器相对于kobject来说,主要多了kobjs的uevent操作,用于记录
2022-11-05 00:50:36
1400
原创 linux控制组: cpuset解析
cpuset提供了一种机制,用于将一组CPU和内存节点分配给一组任务。在这里,“内存节点”是指包含内存的在线节点。CPU集将任务的CPU和内存放置限制为仅任务当前cpuset中的资源。它们形成虚拟文件系统中可见的嵌套层次结构。这些是管理大型系统上动态作业放置所需的基本钩子,超出了已经存在的钩子。cpuset使用控制组中描述的通用cgroup子系统。任务的请求,使用sched_setaffinity系统调用将CPU包含在CPU
2022-11-03 21:09:52
4946
原创 linux设备模型:sysfs(kobject)解析
sysfs 是一个最初基于 ramfs 且位于内存的文件系统。它提供导出内核数据结构及其属性,以及它们之间的关联到用户空间的方法。任何 kobject 在系统中注册,就会有一个目录在 sysfs 中被创建。这个目录是作为该 kobject 的父对象所在目录的子目录创建的,以准确地传递内核的对象层次到用户空间。sysfs中的顶层目录代表着内核对象层次的共同祖先;例如:某些对象属于某个子系统。 在与其目录关联的 kernfs_node 对象中内部保存一个指向实现目录的
2022-10-30 13:04:25
2257
原创 linux审计子系统:内核层执行原理
linux审计子系统用于记录内核部分子模块及应用层(应用程序)的运行状态,如文件系统、进程、systemd应用的执行进展、遇到的问题等信息。审计子系统通过netlink与auditd应用建立kernel audit直接的通信,并通过auditd把信息写入/var/log/audit/audit.log文件(默认地址,可以设置)。 linux审计子系统内核部分设计相对较为简单,甚至内核文档都没有找到关于它的单独描述(只找到了它的函数定义描述)。
2022-10-27 21:50:20
2690
原创 linux终端设备:pty设备初始化、创建过程
上一篇[](https://lkyof.blog.csdn.net/article/details/127456330?spm=1001.2014.3001.5502)分析了tty子系统、tty设备、console设备的初始化及创建过程。默认情况console终端的启动程序为agetty,它访问的是/dev/console inode,执行的console_fops操作结构中的函数,而由类Xwindow中的终端或远程ssh访问的是/dev/ptmx (pt
2022-10-23 19:38:13
1729
原创 linux终端设备:tty子系统相关的初始化
> linux类系统相较于windos类系统用“魔幻”也不为过,神奇的控制台终端如ctrl+alt+F1至F6、UI桌面打开终端、远程ssh登录等等,在神奇的命令行协助下总能随时随地完成手中的工作。> 当然,这些功能虽不算复杂,但庞大的架构及繁多的代码让人有一种深不测的感觉。经过一段时间对终端相关代码的分析对它们有了初步的了解。它们采用较为一致的思路方式实现,代码难度也不算太高,具备字符驱动相关的知识加上足够的耐心便可以解开这个“庞然大物”。> linux终端子
2022-10-22 21:46:58
2187
原创 分布式块设备复制(DRBD)分析
DRBD由客户端(drbdadm、drbdsetup、drbdmeta)、内核模块(drbd.ko、drbd_transport_tcp.ko)和相关脚本而构成,用以构建高可用性的集群,其实现方式是通过网络来镜像整个设备。DRBD负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中,参考图1。
2022-10-04 22:58:02
1825
原创 proc: 虚拟文件系统初始化
linux内核中经常使用一种虚拟文件系统,它在内核启动后创建,并结合文件操作特性运行在缓存中,也就是说它具有文件操作的功能(函数调用、文件属性变更等),数据不会写入到磁盘,这里简称为proc系统。proc系统初始化并创建/proc/self/fs、/proc/sys等目录,在4.15之前的内核版本,它结合ctl_table结构,完成虚拟读写、文件属性的变更、内核运行时参数修改等操作,而4.15之后的内核版本,ctl_table移除了proc_dir_entry结构,相当于虚拟文件的读写、文件属性的变更等操作
2022-09-25 22:47:15
1131
原创 x86: perf_events内核初始化
Linux性能计数器的使用(perf_events)可能会带来泄露受监控进程访问的敏感数据的巨大风险。在直接使用perf_events系统调用API的情况下,数据泄露都是可能的以及由perf工具用户模式实用程序(perf)生成的数据文件风险取决于perf_events性能监控单元(PMU)的数据的性质和perf收集并公开以进行性能分析。收集的系统和性能数据可分为以下几类尔“架构性能监控”CPUID检测/枚举详细信息struct {} split;};cpu_hw_events CPU硬件事件/**//*
2022-08-20 21:16:29
2188
原创 send_sig: 内核执行流程
当一个信号从内核或另一个进程发送到一个进程时,内核通过调用 send_sig()、send_sig_info()、force_sig() 或 force_sig_info() 函数来传递它。 调用关系如下: send_sig() -> send_sig_info() ... send_signal_locked() ... force_sig() -> force_sig_info() ... send_signal_locked() ......
2022-08-10 21:22:56
2717
原创 bpftrace:简便输出调试信息
bpftrace是一种用于Linux增强型伯克利包过滤器(eBPF)的高级跟踪语言,使用LLVM作为后端将脚本编译为BPF字节码,并利用BCC与Linux BPF系统进行交互,以及现有的Linux跟踪功能:内核动态跟踪(kprobes)、用户级动态跟踪(uprobes)、和跟踪点(tracepoint)。bpftrace语言的灵感来自awkh、C、DTrace和SystemTap等前身跟踪器。上一篇实现了tracepoint定义及函数调用,本篇也以这个示例和官方提供示例为基础讲述。...
2022-08-07 22:37:30
1541
原创 tracepoint: 定义函数及调用示例
放置在代码中的跟踪点(tracepoint)提供了一个挂钩来调用您可以在运行时提供的函数(探针)。 跟踪点可以是“on”(一个探针连接到它)或“off”(没有连接探针)。 当跟踪点“关闭”时,它没有任何效果,除了添加微小的时间损失(检查分支条件)和空间损失(在检测函数的末尾为函数调用添加几个字节并添加数据 结构在一个单独的部分)。 当跟踪点“打开”时,每次执行跟踪点时都会在调用者的执行上下文中调用您提供的函数。 当提供的函数结束执行时,它返回给调用者(从跟踪点站点继续)...
2022-08-07 13:51:13
1511
MFC按USB插口顺序显示所有USB设备(包括安卓)
2018-03-18
DataOperation_20200304.zip
2020-03-04
tensorflow_install.zip
2020-10-06
MFC内部调用matlab函数(32位/64位)
2018-08-18
thinking c++
2017-03-21
linux 汇编完整语法介绍
2017-03-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅