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

linux 进程调度(下) -- 调度演进

引言 通过此前的两篇文章,我们系统介绍了 linux 操作系统中的调度算法与其演进: linux 操作系统的进程调度(上) -- 进程调度的基本概念 linux 操作系统的进程调度(中) -- 进程调度算法的演进...本文,我们就来介绍 Linux 操作系统实际使用的进程调度以及它们的演进。...O(n) 调度 在早期的 linux 操作系统中,2.4 版本到 2.6 版本之间,linux 采用了实现起来十分简单的 O(n) 调度。...O(1) 调度linux 内核采用 O(n) 调度的 4 年后,Linux2.6.0 采纳了 Rad Hat 公司设计的 O(1) 调度算法,这是一个基于上一篇文章中介绍的多级反馈队列算法的调度实现...CFS 调度 由于 O(1) 调度的上述问题,很快在 Linux 2.6.23 版本,就有一款新的调度 -- CFS 被内核采用,它是由匈牙利程序员 Ingo Molnar 在澳大利亚外科医生 Con

2.2K20

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

文章目录 一、调度 0、调度概念 1、调度目的 2、调度主要工作 3、调度位置 4、进程优先级 5、抢占式调度 二、Linux 内核进程状态 API 简介 三、Linux 进程状态 一、调度...---- 0、调度概念 Linux 内核的 " 进程调度 " 是按照 设计好的调度算法 安排的 , 该算法对应的功能模块 称为 " 调度 " , 英文名称是 Scheduler ; 1、调度目的...进程调度 目的是 最大限度利用 CPU 资源 , 也就是 CPU 时间片 ; 2、调度主要工作 " 调度 " 主要的工作 : ① 就绪 -> 执行 : 选择 " 就绪状态 " 的进程执行 ; (..." 进行 进程调度 ; 进程优先级 参考 【Linux 内核】进程管理 - 进程优先级 ② ( prio 调度优先级 | static_prio 静态优先级 | normal_prio 正常优先级 |..." 抢占式调度 " 概念 : 如果 " 调度 " 支持 " 就绪状态 " 与 " 运行状态 " 之间可以相互转换 , 则该调度称为 " 抢占式调度 " ; 二、Linux 内核进程状态 API

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

    Linux进程调度概述--Linux进程的管理与调度(十五)

    调度本身就会耗费不少时间,所以,从linux2.5开始引入赫赫有名的O(1)调度 然而,linux是集全球很多程序员的聪明才智而发展起来的超级内核,没有最好,只有更好,在O(1)调度风光了没几天就又被另一个更优秀的调度取代了...CFS调度 linux-2.6~至今 4 Linux调度设计 4 Linux调度设计 2个调度 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制...)) 并且每个调度包括两个内容:调度框架(其实质就是两个函数框架)及调度类 6种调度策略 linux内核目前实现了6种调度策略(即调度算法), 用于对不同类型的进程进行调度, 或者支持某些特殊的功能...CFS调度实体 采用CFS算法调度的普通非实时进程调度实体 fair_sched_class 调度类的就绪队列 另外,对于调度框架调度类,它们都有自己管理的运行队列,调度框架只识别rq(其实它也不能算是运行队列...dl_rq 调度整体框架 本质上, 通用调度(核心调度)是一个分配器,与其他两个组件交互.

    3.6K20

    Linux 进程调度之schdule主调度

    至于CFS调度算法的实现后面后专门写一篇文章,这里只要记住调度时选择一个优先级最高的任务执行 一、调度单位简介 1.1 task_struct 结构体简介 对于Linux内核来说,调度的基本单位是任务,...,调度只会选择在该状态下的任务进行调度。...还有一个来源就是0号进程(又叫 idle 进程),每个逻辑处理上都有一个,属于内核态线程,只有在没有其他的任务处于TASK_RUNNING状态时(系统此时处于空闲状态),任务调度才会选择0号进程,然后重复执行...在这里我只讨论普通任务的调度,因为linux大部分情况下都是在运行普通任务,普通任务选择的调度是CFS完全调度。 在调度时,调度去 CFS 运行队列找是否有任务需要运行。...具体请参考:Linux 进程调度通知机制 struct preempt_ops { void (*sched_in)(struct preempt_notifier *notifier, int cpu

    1.8K20

    Linux进程调度的设计--Linux进程的管理与调度(十七)

    , linux总是希望寻找一个最接近于完美的调度策略来公平快速的调度进程. 1.4 linux调度的演变 一开始的调度是复杂度为O(n)的始调度算法(实际上每次会遍历所有任务,所以复杂度为O(n))...:调度框架(其实质就是两个函数框架)及调度类 2.2 6种调度策略 linux内核目前实现了6中调度策略(即调度算法), 用于对不同类型的进程进行调度, 或者支持某些特殊的功能 比如SCHED_NORMAL...另外,对于调度框架调度类,它们都有自己管理的运行队列,调度框架只识别rq(其实它也不能算是运行队列),而对于cfs调度类它的运行队列则是cfs_rq(内部使用红黑树组织调度实体),实时rt的运行队列则为...4 总结 进程调度框架如下图所示 ?...参照 linux调度源码分析 - 概述(一) 通过的调度策略对象–调度linux下每个进程都由自身所属的调度类进行管理, sched_class结构体表示调度类, 调度类提供了通用调度和各个调度之间的关联

    3.6K41

    Linux进程核心调度之主调度schedule--Linux进程的管理与调度(十九)

    调度 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度函数schedule, 从系统调用返回后, 内核也会检查当前进程是否设置了重调度标志TLF_NEDD_RESCHED...__schedule完成了真正的调度工作, 其定义在kernel/sched/core.c, L3103, 如下所示 1.3.1 __schedule函数主框架 static void __sched...函数, 去查找最优的那个进程, 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 其执行流程如下 如果当前cpu上所有的进程都是cfs调度的普通非实时进程..., 也就是说多数情形下, 我们的linux进程全是cfs调度的 而likely这个宏业表明了这点, 这也是gcc内建的一个编译选项, 它其实就是告诉编译表达式很大的情况下为真, 编译可以对此做出优化...内核中的进程被堵塞的时候 2 总结 2.1 schedule调度流程 schedule就是主调度的函数, 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度函数

    3.8K31

    Linux进程调度_linux进程的查看和调度

    进程调度的任务就是合理分配CPU时间给运行的进程,创造一种所有进程并行运行的错觉。这就对调度提出了要求: 1、调度分配的CPU时间不能太长,否则会导致其他的程序响应延迟,难以保证公平性。...Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...,称之为 调度类(scheduler class),它允许不同的可动态添加的调度算法并存,总调度根据调度类的优先顺序,依次去进行调度类的中的进程进行调度,挑选了调度类,再在这个调度内,使用这个调度类的算法...Linux 调度时机 ---- 一、进程切换 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。

    20.7K10

    linux进程调度

    进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级。前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。...总而言之,对于实时进程,高优先级的进程先执行,它执行到没法执行了,才轮到低优先级的进程执行。 2.非实时进程调度 Linux对普通的进程,根据动态优先级进行调度。...Linux下,静态优先级是用户不可见的,隐藏在内核中。...因为,不仅要考虑静态优先级,也要考虑进程的属性。例如如果进程属于交互式进程,那么可以适当的调高它的优先级,使得界面反应地更加迅速,从而使用户得到更好的体验。Linux2.6 在这方面有了较大的提高。...Linux2.6认为,交互式进程可以从平均睡眠时间这样一个measurement进行判断。进程过去的睡眠时间越多,则越有可能属于交互式进程

    3.2K140

    linux进程调度

    调度策略 进程可以分为实时进程和普通进程,对于这两种不同类型的进程肯定有不同的调度策略,task_struct中的policy就用来表示调度策略。...SCHED_RR,时间片轮转调度,也是高优先级可以抢占低优先级,对于同优先级新来的排到队尾,每个进程都执行一个时间片,然后换下一个进程。...普通调度策略有 SCHED_NORMAL, SCHED_BATCH,SCHED_IDLE SCHED_NORMAL:普通的进程 SCHED_BATCH:后台进程 SCHED_IDLE:空闲时运行的进程...stop_sched_class:优先级最高的进程使用该策略,可以打断所有其他进程,并且该进程不会被抢占 rt_sched_class:RR算法或者FIFO算法的调度策略,具体由该进程的task_struct...fair_sched_class:普通进程调度策略 CFS调度算法 CFS(completed fair Schedule)完全公平调度,适用于普通进程调度

    8.1K20

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

    抢占式多任务(Linux) 这种情况下,由调度程序来决定什么时候停止一个进程的运行,这个强制的挂起动作即为**“抢占”**。...Linux进程调度 发展历史 Linux从2.5版本开始引入一种名为的调度,后在2.6版本中将公平的的调度概念引入了调度程序,代替之前的调度,称为算法(完全公平调度算法)。...为了保证交互式应用和桌面系统的性能,一般Linux更倾向于优先调度I/O消耗型进程进程优先级 Linux采用了两种不同的优先级范围。 使用nice值:越大的nice值意味着更低的优先级。...Linux调度算法 调度Linux调度是以模块的方式提供的,这样使得不同类型的进程按照自己的需要来选择不同的调度算法。...上面说讲到的CFS算法就是一个针对普通进程调度类,基础的调度会按照优先级顺序遍历调度类,拥有一个可执行进程的最高优先级的调度类胜出,由它来选择下一个要执行的进程

    14.9K113

    Linux进程调度分析

    进程调度究竟有多重要呢? 首先,我们需要明确一点:进程调度是对TASK_RUNNING状态的进程进行调度(参见《linux进程状态浅析》)。...尽管我们平常接触的很多计算机(如桌面系统、网络服务、等)负载都比较低,但是linux作为一个通用操作系统,不能假设系统负载低,必须为应付高负载下的进程调度做精心的设计。...有兴趣的朋友可以参考下面的链接: 《Linux 调度发展简述》 《鼠眼看Linux调度》 《鼠眼再看Linux调度[1]》 《鼠眼再看Linux调度[2]》 调度程序的效率 “优先级”明确了哪个进程应该被调度执行...2、多处理下的负载均衡 前面我们并没有专门讨论多处理调度程序的影响,其实也没有什么特别的,就是在同一时刻能有多个进程并行地运行而已。那么,为什么会有“多处理负载均衡”这个事情呢?...所以,在linux下,每个CPU都有着对应的可执行队列,而一个可执行状态的进程在同一时刻只能处于一个可执行队列中。 于是,“多处理负载均衡”这个麻烦事情就来了。

    2.4K31

    Linux进程调度(三)

    进程在驱动程序中主动调用 schedule 函数来发生进程切换的这种情况称为主动调度 本文将讨论主动调度,抢占式调度将在下一篇文章中讲解: 二、主动调度的发生的情况: 主动调度一般在应用程序读取某个设备时...函数,这也是进程B在内核态运行时候的 进程B当初也是通过系统调用进入内核的,现在进程B读取到按键数据后,要返回用户空间,此时内核会将进程B的内核栈中 pt_reg 里面所有保存下来的寄存恢复,例如会重新设置栈指针寄存...,指令指针寄存。...,__switch 的返回值其实就是寄存的值,也就是进程C的进程描述符地址 这样子进程就知道自己是从哪一个进程切换过来的,那么为什么进程需要直到它是从哪一个进程切换过来的呢?...四、总结: 进程发生切换总是调用 schedule 函数进行的,进程调度分抢占式调度和主动调度,主动调度表示的是进程主动调用 schedule 函数发生进程切换 schedule 函数主要做了两件事,

    2.5K10

    Linux内核】进程调度

    文章目录 前言 I/O消耗型与处理消耗性 进程优先级 时间片 进程抢占 前言 调度程序没有太复杂的原理。最大限度地利用处理时间的原则是,只要有可以执行的进程,那么就总会有进程正在执行。...Linux 提供了抢占式的多任务模式。在此模式下,由调度程序来决定什么时候停止一个进程的运行以便其他进程能够得到执行机会。这个强制的挂起动作就叫抢占(preemption)。...但是,因为它们不属于I/O驱动类型,所以从系统响应速度考虑,调度不应该经常让它们运行。对于这类处理消耗型的进程调度策略是尽量降低它们的运行频率,而将它们的运行时间拖长一些。...进程优先级 调度算法中最基本的类就是基于优先级的调度。 这是一种根据进程的价值和其对处理时间的需求来对进程分级的想法。...优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。在包括Linux在内的某些系统中,优先级高的进程使用的时间片也较长。

    2.9K20

    Linux进程调度学习!

    进程调度的任务就是合理分配CPU时间给运行的进程,创造一种所有进程并行运行的错觉。这就对调度提出了要求: 调度分配的CPU时间不能太长,否则会导致其他的程序响应延迟,难以保证公平性。...而调度的任务就是: 1、分配时间给进程 2、上下文切换 所以具体而言,调度的任务就明确了:用一句话表述就是在恰当的实际,按照合理的调度算法,选择进程,让进程运行到它应该运行的时间,切换两个进程的上下文...Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...Linux 调度算法: Linux 中有一个总的调度结构,称之为 调度类(scheduler class),它允许不同的可动态添加的调度算法并存,总调度根据调度类的优先顺序,依次去进行调度类的中的进程进行调度...Linux 调度时机: 1、进程切换: 从进程的角度看,CPU是共享资源,由所有的进程按特定的策略轮番使用。

    1.9K30

    Linux CFS调度之唤醒抢占--Linux进程的管理与调度(三十)

    函数 描述 进程入队/出队 enqueue_task_fair/dequeue_task_fair 向CFS的就读队列中添加删除进程 选择最优进程(主调度) pick_next_task_fair 主调度会按照如下顺序调度..., 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 一般情况下选择红黑树中的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->...中周期性调度通过调用curr进程所属调度类sched_class的task_tick函数完成周期性调度的工作 而entity_tick中则通过check_preempt_tick函数检查是否需要抢占当前进程...这个是调度最初向进程欠下的债务....关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,

    2.6K31

    Linux核心调度之周期性调度scheduler_tick--Linux进程的管理与调度(十八)

    我们前面提到linux有两种方法激活调度:核心调度和 周期调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因而内核提供了两个调度调度...调度的一般原理是, 按所需分配的计算能力, 向系统中每个进程提供最大的公正性, 或者从另外一个角度上说, 他试图确保没有进程被亏待. 1.2 进程的分类 linux进程区分为实时进程和非实时进程,...对于普通进程则采用CFS完全公平调度进行调度 1.3 linux调度的演变 table th:nth-of-type(1){ width: 20%; } 字段 版本 O(n)的始调度算法 linux...-0.11~2.4 O(1)调度 linux-2.5 CFS调度 linux-2.6~至今 1.4 Linux调度组成 2个调度 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃...)或核心调度(core scheduler)) 并且每个调度包括两个内容:调度框架(其实质就是两个函数框架)及调度类 6种调度策略 linux内核目前实现了6中调度策略(即调度算法), 用于对不同类型的进程进行调度

    2.7K20

    linux 系统调度(四) -- 利用 chrt 命令查询与修改进程调度

    引言 上一篇文章中,我们介绍了 linux 调度的演进: linux 进程调度(下) -- 调度演进 在上一篇文章中,我们知道,到 Linux 2.6.23 版本后,linux 实际上维护了一组调度来实现不同的调度需要...,它们被分为了四层: DL 调度:采用 sched_deadline 策略; RT 调度:采用 sched_rr 和 sched_fifo 策略; CFS 调度:采用 sched_normal 和...那么,我们怎么才能让我们的进程被不同层的调度调度呢?那就需要使用 linux 提供的十分有用的工具 -- chrt 来实现了,本文我们就来介绍一下这个命令的使用。...2. chrt 命令的介绍 chrt 命令是 linux 提供的一个底层应用指令,它可以在运行时设置进程的某些属性,还可以更改调度策略和调度优先级。...SCHED_FIFO 和 SCHED_RR 两个调度可以让我们去指定,因为 RT 调度是采用传统的 O(1) 调度算法来实现的基于时间片调度的策略的。

    4.7K30

    图解Linux进程调度(二)

    优先级与调度策略: 在内核中,肯定不能对所有的进程一视同仁,有的进程需要优先运行,有的进程需要运行更长的时间 为了更好地实现进程调度,每个进程都有自己的优先级和调度策略 所谓优先级,就是表示这个进程的重要性...想一想,进程调度其实是一个非常复杂的问题,想使用一种算法来实现良好的进程调度是不可能的,Linux内核实现了好几种调度算法。...1 #define SCHED_RR 2 #define SCHED_BATCH 3 #define SCHED_IDLE 5 #define SCHED_DEADLINE 6 Linux...表示普通进程调度策略,内核大多数进程都属于普通进程,普通进程使用完全公平调度算法实现调度 SCHED_BATCH:是用于非交互,CPU使用密集的批处理进程,它和普通进程都是使用完全公平调度算法来实现。...内核中在某时刻可以去唤醒某个进程,如果这个进程调度策略是SCHED_BATCH,那它就不会去抢占当前正在运行的进程 SCHED_IDLE:是用于特别空闲的进程使用的调度策略 讲完调度策略,我们来将优先级

    1.7K10

    图解Linux进程调度(一)

    一、进程调度解决什么问题? 我们在使用电脑的时候,比如打开一个视频剪辑,一个文本编辑,可以认为它们都是一个进程。...本篇文章讲解Linux如何管理进程进程调度是怎么转起来的,为了实现进程调度维护了哪些数据结构,实现了哪些算法 至于一个进程如何实现抢占,进程调度的时机等细节将放到后面的文章讲解 二、进程调度整体框架...: 在设计到内核具体的代码之前,我先来给你讲解一下进程调度的大体框架,让你明白进程调度是怎么转起来的,在你明白每一个部分的含义之后,再深入讲解内核的实现 操作系统管理非常多的进程,这些进程当前可能处于可运行状态或者睡眠状态...很明显,这一部分需要具体的调度算法来实现,Linux调度算法的实现抽象成调度类 在滴答定时的中断处理中,通过调度类去实现相应的计算,然后判断current进程是否需要被抢占,如果需要被抢占,那么就在...current进程设置需要重新调度的标志,如下图所示: 实时上,Linux内核的调度类不仅仅只有一个,因为内核同时实现了多种调度算法,但是我们这里强调总体框架,暂不讨论这里细节问题 到此,进程切换的第一步设置

    1.4K20

    Linux进程及其调度策略

    Linux调度需要负责做两件事:一件事是选择某些就绪的进程来执行;另一件事是打断某些执行中的进程,让它们变回就绪状态。不过,并不是所有的调度都有第二个功能。...O(n)和O(1)调度 下面介绍Linux调度策略。最原始的调度策略是按照优先级排列好进程,等到一个进程运行完了再运行优先级较低的一个,但这种策略完全无法发挥多任务系统的优势。...O(n)调度Linux 2.6之前使用的进程调度。 为了解决O(n)调度的性能问题,O(1)调度被发明了出来,并从Linux 2.6内核开始使用。...完全公平调度 从2007年发布的Linux 2.6.23版本起,完全公平调度(CFS,Completely Fair Scheduler)取代了O(1)调度。...以上就是调度的基本原理,以及Linux用过的几种调度策略。调度可以更加合理地把CPU时间分配给进程。现代计算机都是多任务系统,调度在多任务系统中起着顶梁柱的作用。

    2.5K20
    领券