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

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

1 Linux内核作为一个通用的操作系统(OS),需要兼顾各种各样类型的进程,包括实时进程、交互式进程、批处理进程等。...目前,在Linux内核中支持的调度器有CFS调度器、Realtime调度器、Deadline调度器和Idle调度器 。本篇将简单介绍CFS调度器的设计原理。...CFS的内部原理大致为如图所示: Linux内的所有任务都由称为 task_struct 的任务结构表示,它位于调度的最顶端。该结构(在..../linux/include/linux/sched.h)完整地描述了任务并包括了任务的当前状态、其堆栈、进程标识、优先级(静态和动态)等等。...通过以上的结构和调度方式,Linux内核保证了操作系统中进程调度的公平性。 原文:https://www.cnblogs.com/XiaoliBoy/p/10410686.html

1.1K20

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-5.6.18\include\linux\rbtree.h 路径对应的源码中定义 ; /* * Leftmost-cached rbtrees

84120
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核分析内核编程

、原理及组成框架,主要分析Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux 内核,精通Linux内核编程。...第12章“Linux系统初始化”阐述了在i386机器上的BootLoader和嵌入设备上的Blob,分析Linux系统的启动过程。 第13章“系统调用”分析了系统调用的实现机制。...第19章“Linux内核调试”分析内核调试的方法,控制台驱动程序以及如何将打印信息显示在控制台上,阐述了日志系统是如何工作的,还说明了ptrace调试跟踪的原理。...、原理及组成框架,主要分析Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux 内核,精通Linux内核编程。...第19章“Linux内核调试”分析内核调试的方法,控制台驱动程序以及如何将打印信息显示在控制台上,阐述了日志系统是如何工作的,还说明了ptrace调试跟踪的原理。

11.4K20

Linux 内核架构分析

硬件控制层:该子系统由Linux安装中的所有可能的物理设备组成;例如,CPU,内存硬件,硬盘和网络硬件都是该子系统的成员 2.内核架构 2.1 内核之作用 Linux内核为用户进程提供了虚拟机接口。...进程编程无需知道计算机上安装了什么物理硬件,Linux内核将所有硬件抽象为一致的虚拟接口。...进程间通信(IPC)子系统实现在单个Linux系统上进行进程间通信的多种机制。 从依赖性的角度分析: 进程调度程序子系统使用内存管理器为恢复特定进程的特定进程调整硬件内存映射。...3.各子系统架构分析 3.1 进程调度器架构 进程调度器是Linux内核中最重要的子系统。其目的是控制对计算机CPU的访问。这不仅包括用户进程的访问,还包括其他内核子系统的访问。...3.3.1 模块结构分析 可分为四大模块: 公共驱动抽象模块 由于存在大量不兼容的硬件设备,因此存在大量的设备驱动程序。Linux系统最常见的扩展是添加了新的设备驱动程序。

2.8K30

Linux内核Crash分析

在工作中经常会遇到一些内核crash的情况,本文就是根据内核出现crash后的打印信息,对其进行了分析,使用的内核版本为:Linux2.6.32。...对每一个进程来说,Linux内核都会把两个不同的数据结构紧凑的存放在一个单独为进程分配的存储空间中:一个是内核态的进程堆栈,另一个是紧挨进程描述符的数据结构thread_info,叫线程描述符。...在Linux-2.6.32内核中thread_info.h文件中有对内核堆栈的定义: #define THREAD_SIZE 8192 在Linux内核中使用下面的联合结构体表示一个进程的线程描述符和内核栈...,在内核中文件include/linux/sched.h。...bust_spinlocks(0); do_exit(SIGKILL); } (2) 对于下面的两个信息,在函数show_pte中进行了打印,下面的打印涉及到了页全局目录,页表的知识,暂时先不分析

4.5K20

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

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

1.9K20

Linux 内核入口分析

从启动引导程序 bootloader(uboot)跳转到 Linux 内核后,Linux 内核开始启动,今天我们分析一下 Linux 内核启动入口。...PAGE_OFFSET 是 Linux 内核空间的虚拟起始地址,定义在: linux4.14/arch/arm64/include/asm/memory.h 注意,这里的地址都很重要,很多地方会用到。...TEXT_OFFSET 定义在: linux4.14/arch/arm/Makefile 中: 这个值一般是 0x00008000 ,算出 PAGE_OFFSET 后加上这个值就是 Linux 内核的起始地址...修改这个偏移量就可以使Linux内核拷贝到不同的地址,自己修改注意内存对齐。...367 行跳转到了我们熟悉的 start_kernel,就可以看下面这篇文章: 手把手教你分析 Linux 启动流程 ·················· END ··················

1.9K10

Linux内核源码分析方法

Linux内核源码分析方法 一、内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。...我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知: 1.内核源码的分析并非“高不可攀”。...…… 分析Linux内核代码如果能搜集到这些信息,应该说是非常“幸运”了。...因此,通过对待分析的代码进行信息搜集,然后按照上述的流程分析出代码的原本始末是了解内核本质的有效手段。这种按照具体需要分析内核代码的方式,为快速进入Linux内核的世界提供了可能。...通过这种方式,不断的对内核的其他模块分析,最后综合得到自己对Linux内核的理解,也就达到了我们学习Linux内核的目的。 最后向大家推荐两本学习内核的参考书。

5.3K70

原 《Linux内核分析》小节

直到我看到孟宁老师的《Linux内核分析》这门课时,我想我大概可以在二十年后吹牛了:“当年我大二,读Linux内核源码的时候.....” 只是在学习的过程中,没有找到合适的参考书,导致复习有些困难。...通过一个简单的时间片轮转多道程序内核代码,分析linux操作系统 mykernel是一个基于Linux 3.9.4的内核模拟程序,通过观察软件模拟的操作系统运行过程可以帮助我们理解操作系统的进程工作、调度机制...跟踪分析Linux系统的启动过程 MenuOS是一个基于Linux 3.18.6内核的微型操作系统,本文使用gdb来观察系统的启动过程,至init进程被启动为止。...分析system_call的中断处理过程 本文在原有MenuOS的基础上添加了fork和fork-asm命令,再使用gdb跟踪调试,最后分析Linux系统调用从system_call开始到iret结束之间的整个过程...陈政/arc001    原创作品转载请注明出处  《Linux内核分析》MOOC课程

1.7K60

Linux内核调度分析(进程调度)

本文是《Linux内核设计与实现》第四章的阅读笔记,代码则是摘自最新的4.6版本linux源码(github),转载请注明出处。...Linux调度的实现 下面我们来看看CFS是如何实现的,一般我们把它分为4个主要的部分来分析。...简单来说有以下两种情况会发生用户抢占: 从系统调用返回用户空间 从中断处理程序返回用户空间 内核抢占 Linux和其他大部分的Unix变体操作系统不同的是,它支持完整的内核抢占。...在Linux中,只要重新调度是安全的,内核就可以在任何时间抢占正在执行的任务,这个安全是指,只要没有持有锁,就可以进行抢占。...为了支持内核抢占,Linux做出了如下的变动: 为每个进程的引入了计数器,用于记录持有锁的数量,当它为0的时候就意味着这个进程是可以被抢占的。

14.9K113

CFS调度主要代码分析

在前面学习了CFS调度的原理和主要的数据结构,今天我们就来进入代码分析环节。当然了代码分析只看主要主干不看毛细,同时我们也是根据一个进程是如何被调度的思路来分析一些重要的代码。...在分析代码之前,有一些小函数需要先分析下,俗话说万丈高楼平地起,这些小函数还是很重要的。 calc_delta_fair calc_delta_fair函数是用来计算进程的vruntime的函数。...为了保证除法计算中不涉及浮点运算,linux内核通过先左移32位,然后右移32位来避免浮点运算。修改后的公式为: ? 再经过转化成如下的公式 ?...运行队列中最小的vruntime的值 新进程创建 通过新进程创建流程,来分析CFS调度器是如何设置新创建的进程的。...在fork创建一个新进程的时候我们涉及到sched模块时是一笔带过的,这里重点分析

2.3K31

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

简介 ---- 在之前的博客 【Linux 内核】调度器 ② ( sched_class 调度类结构体源码 | 源码路径 linux-5.6.18\kernel\sched\sched.h ) 【Linux...内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 ) 【Linux 内核】调度器 ④ ( sched_class...调度类结构体分析 | yield_task 函数 | heck_preempt_curr 函数 | task_struct 函数 ) 【Linux 内核】调度器 ⑤ ( put_prev_task、set_next_task...fair_sched_class 是 sched_class 结构体类型的 ; 二、CFS 调度器类源码 ---- CFS 调度器类 fair_sched_class 的 源码 在 Linux 内核源码...内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 ) 整个 Linux 系统中有 多个 " 调度类

1.8K30

CFS调度主要代码分析

在上一篇文章中我们分析CFS的主要代码,设计的内容有: 进程创建时调度器是如何初始化一个进程的 进程是如何添加到CFS运行队列中 当进程添加到CFS运行队列中,是如何选择下一个进程运行的 本节在围绕一个进程的生命周期...,继续分析一个进程是如何被抢占?...Schedule_tick(周期性调度) 周期性调度就是Linux内核会在每一个tick的时候会去更新当前进程的运行时间,已经判断当前进程是否需要被调度出去等。...在之前有分析过,此函数主要是更新当前current进程的执行时间,vruntime以及CFS运行队列的min_vruntime update_load_avg 主要是用来更新调度实体的负载以及CFS运行队列的负载...(se) { cfs_rq = cfs_rq_of(se); dequeue_entity(cfs_rq, se, flags); cfs_rq->h_nr_running

1.1K10

Linux内核源代码分析经验

Linux内核源码是很具吸引力的,特别是当你弄懂了一个分析了好久都没搞懂的问题;或者是被你修改过了的内核,顺利通过编译,一切运行正常的时候。 那种成就感真是油然而生!...而且你还能从对内核源码的分析中,体会到它在解决某个具体细节问题时,方法的巧妙:如后面将分析到了的Linux通过Botoom_half机制来加 快系统对中断的处理。   ...由于本人所进行的分析都是基于2.2.5版本的内核;所以,如果没有特别说明,以下分析都是基于i386单处理器的2.2.5版本的Linux内核。...所有源文件均是相对于目录/usr/src/linux的。   要分析Linux内核源码,首先必须找到各个模块的位置,也即要弄懂源码的文件组织形式。...对Linux内核源码的分析,有几个很好的入口点:一个就是系统的引导和初始化,即从机器加电到系统核心的运行;另外一个就是系统调用,系统调用是用 户程序或操作调用核心所提供的功能的接口。

2.7K20
领券