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

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

本文是《Linux内核设计与实现》第四章的阅读笔记,代码则是摘自最新的4.6版本linux源码(github),转载请注明出处。...Linux进程调度 发展历史 Linux从2.5版本开始引入一种名为的调度器,后在2.6版本中将公平的的调度概念引入了调度程序,代替之前的调度器,称为算法(完全公平调度算法)。...Linux调度算法 调度器类 Linux调度器是以模块的方式提供的,这样使得不同类型的进程按照自己的需要来选择不同的调度算法。...简单来说有以下两种情况会发生用户抢占: 从系统调用返回用户空间 从中断处理程序返回用户空间 内核抢占 Linux和其他大部分的Unix变体操作系统不同的是,它支持完整的内核抢占。...在Linux中,只要重新调度是安全的,内核就可以在任何时间抢占正在执行的任务,这个安全是指,只要没有持有锁,就可以进行抢占。

14.9K113

Linux内核】进程调度

Linux 提供了抢占式的多任务模式。在此模式下,由调度程序来决定什么时候停止一个进程的运行以便其他进程能够得到执行机会。这个强制的挂起动作就叫抢占(preemption)。...有效管理时间片能使调度程序从系统全局的角度做出调度决定,这样做还可以避免个别进程独占系统资源。 相反,在非抢占式多任务模式下,除非进程自己主动停止运行,否则它会一直执行。...进程优先级 调度算法中最基本的类就是基于优先级的调度。 这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。...优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。在包括Linux在内的某些系统中,优先级高的进程使用的时间片也较长。...进程抢占 像前面所说的,Linux 系统是抢占式的。当-个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程。

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

    聊聊Linux内核进程调度下篇

    进程优先级 Linux内核中进程优先级一般分为动态优先级和静态优先级,动态优先级是内核根据进程的nice值、IO密集行为或者计算密集行为以及等待时间等因素,设置给普通的进程;静态优先级是用户态应用设置给实时进程...实际调度调度器通用元素 CFS(完全公平)调度Linux内核中所有动态优先级的进程都是有CFS调度器处理,通常Linux内核中大部分都是非实时进程,所以CFS进程调度器也是最繁忙的调度器。...Linux内核中支持实时进程,它们是由实时调度器来进行调度。...rt进程被分配了静态优先级,并且在内核中保持不变。于CFS不同,实时调度器采用了每个优先级1~99的单链表,并非采红黑树作为运行队列。...,在Linux内核的3.14开始引入了,deadline调度器基于全局最早的截止期优先和固定带宽服务器算法,于预先确定其运行时的需求。

    1.2K20

    聊聊Linux内核进程调度上篇

    基本介绍 Linux的进程调度器是内核中最重要的核心组件,它决定了一个进程合适获取CPU的时间以及占用CPU的时间。...Linux进程调度器采用类似于vfs的设计采用简单的两层结构模式,第一层是通用调度器,定义作为进程调度器的入口抽象层;第二层是调度器的具体实现,根据调度策略实现进程的调度的器的具体实现。...sched_class rt_sched_class)、完全公平调度器(struct sched_class fair_sched_class) 内核中运行队列包含了所有的进程,每个CPU都有一个运行队列...内核中进程运行队列是通过struct rq来定义 // 省略大部分字段,着重描述下运行队列中的一些字段 struct rq { // 每个CPU的运行队列的锁 raw_spinlock_t lock...进程调度是调用进程第一层的通用调度器,内核是从__schedule()函数开始,该函数是挑选下一个最佳的可运行的进程任务。

    67220

    Linux 内核调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 )

    文章目录 一、调度器 0、调度器概念 1、调度器目的 2、调度器主要工作 3、调度器位置 4、进程优先级 5、抢占式调度器 二、Linux 内核进程状态 API 简介 三、Linux 进程状态 一、调度器...---- 0、调度器概念 Linux 内核的 " 进程调度 " 是按照 设计好的调度算法 安排的 , 该算法对应的功能模块 称为 " 调度器 " , 英文名称是 Scheduler ; 1、调度器目的..." 进行 进程调度 ; 进程优先级 参考 【Linux 内核】进程管理 - 进程优先级 ② ( prio 调度优先级 | static_prio 静态优先级 | normal_prio 正常优先级 |..." 抢占式调度器 " 概念 : 如果 " 调度器 " 支持 " 就绪状态 " 与 " 运行状态 " 之间可以相互转换 , 则该调度器称为 " 抢占式调度器 " ; 二、Linux 内核进程状态 API...不可中断睡眠状态 __TASK_STOPPED 进程停止状态 EXIT_ZOMBIE 僵尸状态 上面的 5 种状态是 Linux 内核中定义的状态 , 详细细节参考 【Linux 内核】进程管理

    5.6K20

    Linux 内核的 4 大 IO 调度算法

    Linux 内核包含4个IO调度器,分别是 Noop IO scheduler、Anticipatory IO scheduler、Deadline IO scheduler 与 CFQ IO scheduler...anticipatory, 预期的;提早发生的;期待着的 通常磁盘的读写影响是由磁头到柱面移动造成了延迟,解决这种延迟内核主要采用两种策略:缓存和IO调度算法来进行弥补. 本文做一简单介绍....I/O调度程序负责维护这些队列的顺序,以更有效地利用介质.I/O调度程序将无序的I/O操作变为有序的I/O操作. 内核必须首先确定队列中一共有多少个请求,然后才开始进行调度. ?...IO调度器在内核栈中所处位置如下: ? ? 块设备最悲剧的地方就是磁盘转动,这个过程会很耗时间。...从Linux 2.6.18起,CFQ作为默认的IO调度算法。对于通用的服务器来说,CFQ是较好的选择。

    5.2K21

    一文搞懂 | Linux内核 CFS 调度

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

    1.2K20

    Linux内核调度器源码分析 - 初始化

    为了能够理解 Linux 调度器的设计与实现,我们将以 Linux kernel 5.4 版本(TencentOS Server3 默认内核版本)为对象,从调度器子系统的初始化代码开始,分析 Linux...内核调度器的设计与实现。...本(系列)文通过分析 Linux 调度器(主要针对 CFS)的设计与实现,希望能够让读者了解: 调度器的基本概念 调度器的初始化(包括调度域相关的种种) 进程的创建、执行与销毁 进程切换原理与实现 CFS...fair_sched_class: CFS 调度器的优先级要低于上面的三个调度类,它是基于公平调度思想而设计的调度类型,是 Linux 内核的默认调度类。...结语 本文主要介绍了内核调度器的基本概念,并通过分析5.4内核调度器的初始化代码,介绍了调度域、调度组等基本概念的具体落地方式。

    1.8K30

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

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

    3.2K10

    Linux 内核】线程调度示例一 ① ( 获取线程调度策略 | 断言 assert | 代码示例 )

    文章目录 一、获取线程调度策略 二、断言 assert 三、获取线程调度策略 代码示例 一、获取线程调度策略 ---- 获取线程调度策略 核心函数 是 pthread_attr_getschedpolicy...函数 ; 获取线程 " 调度策略 " 函数 : int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy); 获取的调度策略通过...; EFAULTEFAULT : pthread_attr_t *attr 指针无效 ; ENOTSUPENOTSUP : 尝试将调度策略修改为 SCHED_FIFO 或 SCHED_RR 实时调度策略...代码示例 ---- 获取线程调度策略 源码 : /** * @brief 获取线程调度策略 * * @return int */ static int get_thread_policy(...pthread_attr_t *p_attr){ // 用于接收调度策略返回值 int policy; // 获取线程的调度策略, 如 SCHED_FIFO, SCHED_RR

    3.6K30

    linux内核调度算法(2)–CPU时间片如何分配

    内核在微观上,把CPU的运行时间分成许多分,然后安排给各个进程轮流运行,造成宏观上所有的进程仿佛同时在执行。...内核分配时间片是有策略和倾向性的。换句话说,内核是偏心的,它喜欢的是IO消耗型进程,因为这类进程如果不能及时响应,用户就会很不爽,所以它总会下意识的多分配CPU运行时间给这类进程。...虽然内核尽量多的分配时间片给IO消耗型进程,但IO消耗进程常常在睡觉,给它的时间片根本用不掉。很合理吧? 那么内核具体是怎么实现这种偏心呢?...先说内核如何决定时间片的长度。 对每一个进程,有一个整型static_prio表示用户设置的静态优先级,内核里它与nice值是对应的。看看进程描述结构里的static_prio成员。...内核就是这么偏爱交互型进程,从上面的优先级和时间片分配上都能看出来。实际上,内核还有方法对交互型进程搞优待。

    6.9K40

    linux内核调度算法(3)–多核系统的负载均衡

    Linux内核是如何在多核间调度进程的呢?又是内核又是CPU核,两个核有点绕,下面称CPU处理器来代替CPU核。...实际上,如果你没有对你的进程做过特殊处理的话,LINUX内核是有可能把它放到多个CPU处理器上运行的,这是内核的负载均衡。...上文说过,每个处理器上有一个runqueue队列,表示这颗处理器上处于run状态的进程链表,在多处理器的内核中,就会有多个runqueue,而如果他们的大小很不均衡,就会触发内核的load_balance...当然,多核CPU也有许多种,例如INTEL的超线程技术,而LINUX内核对一个INTEL超线程CPU会看成多个不同的CPU处理器。...上面说过,如果你没有对你的进程做过特殊处理的话,LINUX内核是有可能把它放到多个CPU处理器上运行的,但是,有时我们如果希望我们的进程一直运行在某个CPU处理器上,可以做到吗?

    3.9K30

    深入理解Linux内核之主调度器(上)

    1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 本文步进到Linux内核进程管理的核心部分,...打开调度器的黑匣子,来看看Linux内核如何调度进程的。...而何时调用主调度调度进程那是调度时机所关注的问题,而调度时机在之前的内核抢占文章已经做了详细讲解,在此不在赘述,而本文关注的调度时机是真正调用主调度器的时机。...: cond_resched()是为了在不可抢占内核的一些耗时的内核处理路径中增加主动抢占点(抢占计数器是否为0且当前任务被设置了重新调度标志),则调用主调度器进行抢占式调度,所进行低延时处理。...从中断处理器返回到用户空间 可抢占式内核(增加一些抢占点) 重新开启内核抢占 中断返回内核态的时候 3.主调度器调用时机源码窥探 下面给出主要的一些主调度器调用时机源码分析,作为学习参考。

    1.3K20

    深入理解Linux内核之主调度器(下)

    2.虽然做了这样的切换,但是这个时候并不能访问到next的用户地址空间,因为还处在主调度器上下文中,属于内核态,访问的是内核空间。...5.进程再次被调度 当进程重新被调度的时候,从原来的调度现场恢复执行。 5.1 关于lr地址的设置 1)如果切换的next进程是刚fork的进程,它并没有真正的这些调度上下文的存在,那么lr是什么呢?...总结 主调度器可以说Linux内核进程管理中的核心组件,进程管理的其他部分如抢占、唤醒、睡眠等都是围绕它来运作。...在原子上下文不能发生调度,说的就是调用主调度器,但是可以设置抢占标志以至于在最近的抢占点发生调度,如中断中唤醒高优先级进程的场景。...主调度器所做的工作就是让出cpu,内核很多场景可以直接或间接调用它,而大体上可以分为两种情况:即为主动调度和抢占式调度。主调度器做了两件事情:选择下一个进程和进程进程上下文切换。

    1.2K20

    Linux 内核调度器 ⑨ ( Linux 内核调度策略 | SCHED_NORMAL 策略 | SCHED_FIFO 策略 | SCHED_NORMAL 策略 | SCHED_BATCH策略 )

    文章目录 一、Linux 内核调度策略源码 二、SCHED_NORMAL 策略 三、SCHED_FIFO 策略 四、SCHED_NORMAL 策略 五、SCHED_BATCH 策略 六、SCHED_IDLE...策略 七、SCHED_DEADLINE 策略 一、Linux 内核调度策略源码 ---- " Linux 应用进程 " 可以根据 " Linux 内核 " 提供的 " 调度策略 " 选择 " 调度器..." ; Linux 内核 " 调度策略 " 源码在 linux-5.6.18\include\uapi\linux\sched.h 头文件中 , /* * Scheduling policies *...和 限期调度器 只能在内核中使用 , 应用进程无法使用这两个调度器 ; 二、SCHED_NORMAL 策略 ---- SCHED_NORMAL 是 " 普通进程调度策略 " , " 进程 " 选择 "...调度器 进行 进程调度 ;

    1.5K20

    Linux内核线程kernel thread详解--Linux进程的管理与调度(十)

    内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的调度内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的基本单位。 这与用户线程是不一样的。...内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置为NULL;它只在 内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。...和kthread_run, 同时将内核线程的创建操作延后, 交给一个工作队列workqueue, 参见http://lxr.linux.no/linux+v2.6.13/kernel/kthread.c...#L21 Linux中的workqueue机制就是为了简化内核线程的创建。...最重要的就是工作队列允许被重新调度甚至是睡眠。

    7.7K51

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

    91020

    Linux 内核调度器 ② ( sched_class 调度类结构体源码 | 源码路径 linux-5.6.18kernelschedsched.h )

    文章目录 一、调度器 二、sched_class 调度类结构体 一、调度器 ---- 上一篇博客 【Linux 内核调度器 ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级...| 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 ) 介绍了 " 调度器 " 概念 , Linux 内核的 " 进程调度 " 是按照 设计好的调度算法 安排的 , 该算法对应的功能模块...称为 " 调度器 " , 英文名称是 Scheduler ; " 调度器 " 可以 切换 " 进程状态 " , 主要是 " 就绪状态 " 与 " 执行状态 " 这两个状态之间相互切换 ; " 抢占式调度器..." 概念 : 如果 " 调度器 " 支持 " 就绪状态 " 与 " 运行状态 " 之间可以相互转换 , 则该调度器称为 " 抢占式调度器 " ; 二、sched_class 调度类结构体 ---- Linux...内核源码 linux-5.6.18\kernel\sched\sched.h 中 , 定义的 struct sched_class 调度类结构体 , 就是 " 调度器 " 对应的类 ; struct

    63630

    Linux 内核】实时调度类 ① ( 进程分类 | 实时进程、普通进程 | Linux 内核 SCHED_FIFO、SCHED_RR 调度策略 | 实时调度实体 sched_rt_entity )

    文章目录 一、进程分类 ( 实时进程 | 普通进程 ) 二、Linux 内核调度策略 1、SCHED_FIFO 调度策略 2、SCHED_RR 调度策略 三、实时调度实体 sched_rt_entity...内核调度器 ⑧ ( 进程优先级源码 include\linux\sched\prio.h | 进程分类 | 实时进程 | 普通进程 | 进程优先级数值 | 0 ~ 99 实时进程 ) 博客 ; 二、...Linux 内核调度策略 ---- 在 【Linux 内核调度器 ⑨ ( Linux 内核调度策略 | SCHED_NORMAL 策略 | SCHED_FIFO 策略 | SCHED_NORMAL 策略...| SCHED_BATCH策略 ) 博客中 , 介绍了 Linux 内核相关的调度策略 ; 1、SCHED_FIFO 调度策略 SCHED_FIFO 是 " 实时进程调度策略 " , 这是一种 先进先出...sched_rt_entity ---- 实时调度实体 在 Linux 内核源码中通过 sched_rt_entity 结构体 表现 , sched_rt_entity 结构体 , 定义在 Linux

    1.4K20
    领券