Linux 进程调度算法经历了以下几个版本的发展: 基于时间片轮询调度算法。(2.6之前的版本) O(1) 调度算法。(2.6.23之前的版本) 完全公平调度算法。...(2.6.23以及之后的版本) 之前我写过一篇分析 O(1)调度算法 的文章:O(1)调度算法,而这篇主要分析 Linux 现在所使用的 完全公平调度算法。...为了解决上面两个问题,Linux内核的开发者创造了 完全公平调度算法。...完全公平调度的两个对象 Linux 内核为了实现 完全公平调度算法,定义两个对象:cfs_rq (可运行进程队列) 和 sched_entity (调度实体)。...完全公平调度算法实现 有了上面的基础,现在可以开始分析 Linux 内核中怎么实现 完全公平调度算法 了。 我们先来看看怎么更新一个进程的虚拟运行时间。 1.
1.算法介绍 针对没有实时需求的普通进程,Linux内核使用完全公平调度器(Completely Fair Scheduler,CFS)。...为了兼顾进程优先级和公平性,完全公平调度算法引入了虚拟运行时间,如下。...,但是每个进程的虚拟运行时间是相同的,所以完全公平调度算法的公平性体现在每个调度周期中给每个进程分配相同的虚拟运行时间。...(1)调度特性START_DEBIT:新进程的虚拟运行时间的初始值在公平运行队列的最小虚拟运行时间的基础上增加延迟时间,延迟时间是新进程自己的时间片,假装新进程在当前调度周期被调度过一次,因为当前调度周期已经承诺给公平运行队列中的所有进程...当从负载重的处理器迁移进程到负载轻的处理器的时候,迁移过来的进程的虚拟运行时间小很多,导致进程调度器在一段时间内总是选中它,对其他进程不公平。 完全公平调度算法的解决方法如下。
除了上一篇文章提到的MLFQ外,另一种调度名为proportional-share/fair-share,这种调度policy的目标是控制每个进程占用CPU时间的比例。...linux内部则使用CFS作为另一种实现。 How can we design a scheduler to share the CPU in a proportional manner?...调度器将会随机选出一则中奖券,拥有中奖券的进程就被调度。尽管抽取的过程是随机的,但是大数定律表明在长期运行的情况下,被调度概率将会趋近于ticket的比例。...---- The Linux Completely Fair Scheduler (CFS) Linux使用了CFS作为调度算法,为了按比例分配CPU,它使用了基于计数的virtual runtime技巧...当然这会牺牲一定的公平性。
Yarn公平调度配置 问:如何配置Yarn公平调度。 答: 首先在yarn-site.xml中进行全局配置,表示开启公平调度策略。...>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler 开启公平调度策略...yarn.scheduler.fair.allocation.file /opt/app/hadoop-2.7.7/etc/hadoop/fair-scheduler.xml 公平调度策略配置文件目录...false 任务无法提交到现有队列,是否允许新建一个队列 然后再编辑fair-scheduler.xml,对公平调度进行详细配置...-- 任务提交规则,由scheduler调度器决定提交的任务进入指定队列 --> <!
) 六、公平调度类 ( fair_sched_class ) 七、空闲调度类 ( idle_sched_class ) 一、调度器类型 ---- 在 Linux 内核中 , sched_class 调度器...: 公平调度类 ; idle_sched_class : 空闲调度类 ; 上述每种 " 调度类 " 都有自己的 调度策略 ; 调度类 优先级 由高到低排列为 : 停机调度类 > 限期调度类 > 实时调度类...> 公平调度类 > 空闲调度类 二、调度器类型源码定义 ---- 调度器类型 , 定义在 Linux 内核源码 linux-5.6.18\kernel\sched\sched.h 头文件中的 1792...) ---- 实时调度类 ( rt_sched_class ) 为每个 " 调度优先级 " 维护一个 队列 ; 六、公平调度类 ( fair_sched_class ) ---- 公平调度类 ( fair_sched_class...) , 引入 一个 完全公平 的 调度算法 , 根据 " 虚拟运行时间 " 概念 , 调度进程 ; \rm 虚拟运行时间 = \cfrac{实际运行时间 * NICE\_0\_LOAD}{进程权重}
Linux CSF 简介 Linux 中 CFS 的全称是 Completely Fair Scheduler,完全公平调度器,是 Linux 内核中的一种进程调度算法。...CFS 的主要特性: 公平性 CFS 的核心理念是通过确保所有进程能够公平地获得 CPU 时间来实现公平调度。...优势和应用场景 多任务处理:CFS 适用于需要公平分配 CPU 资源的多任务环境。...如果当前运行的进程的vruntime显著大于红黑树中的最小vruntime,调度器会认为需要进行进程切换,以确保系统中的所有进程都能公平地获得 CPU 资源。...vruntime:是调度决策的核心指标,反映进程的 CPU 使用时间。 公平性:通过不断地选择vruntime最小的进程,CFS 尽可能地实现 CPU 时间分配的公平性。
FairScheduler整体结构 1.png 公平调度器的运行流程就是RM去启动FairScheduler,SchedulerDispatcher两个服务,这两个服务各自负责update线程,handle...从管理资源角度来看,树的根节点root队列(FSParentQueue),非根节点(FSParentQueue),叶子节点(FSLeaf),app任务(FSAppAttempt,公平调度器角度的App)...本文描述的是公平调度,公平调度的默认策略FairSharePolicy的规则是single-resource,即只关注内存资源这一项指标。...APP在排队,没有跑起来,如下图所示: lizi.png 公平调度默认策略不关心Core的资源,只关心Memory。...剩余的参数放在第二篇-公平调度之抢占中分析。 官方描述 总结 Steady Fair Share The queue’s steady fair share of resources.
) 四、调度类 ( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) 一、CFS 调度器概念 ( 完全公平调度器 ) ---- CFS 调度器 ( Completely...Fair Scheduler ) 是 " 完全公平调度器 " , " 完全公平调度算法 " 对每个 进程 都是 公平 的 , " 完全公平调度算法 " 是 基于时间片轮询 的 调度算法 , 每个进程 都会获得一段...( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) ---- 在 linux-5.6.18\include\linux\sched.h 头文件中 task_struct...-5.6.18\include\linux\sched.h#680 上述可设置的调度类参考 【Linux 内核】调度器 ⑦ ( 调度器类型 | 停机调度类 stop_sched_class | 限期调度类...dl_sched_class | 实时调度类 | 公平调度类 | 空闲调度类 ) 博客 , 在 Linux 内核中 , sched_class 调度器 分为以下 5 种类型 : stop_sched_class
文章目录 组件模块说明 容量调度器(Capacity Scheduler) 容量调度器特点 公平调度器(Fair Scheduler) 配置容量调度器案例 例子1 例子2 例子3 例子4 配置公平调度器案例...公平调度器(Fair Scheduler) hadoop3默认的容量调度器可以改为公平调度器 同队列所有任务共享资源,在时间尺度上获得公平的资源。...-updatePriority 优先级 例如: yarn application -appID application_1611133087930_0009 -updatePriority 5 配置公平调度器案例...公平调度器的配置涉及到两个文件,一个是yarn-site.xml,另一个是公平调度器队列分配文件fair-scheduler.xml(文件名可自定义)。...org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler 配置使用公平调度器
Linux进程调度 发展历史 Linux从2.5版本开始引入一种名为的调度器,后在2.6版本中将公平的的调度概念引入了调度程序,代替之前的调度器,称为算法(完全公平调度算法)。...为了保证交互式应用和桌面系统的性能,一般Linux更倾向于优先调度I/O消耗型进程。 进程优先级 Linux采用了两种不同的优先级范围。 使用nice值:越大的nice值意味着更低的优先级。...Linux调度算法 调度器类 Linux的调度器是以模块的方式提供的,这样使得不同类型的进程按照自己的需要来选择不同的调度算法。...公平调度(CFS) 出发点:进程调度的效果应该如同系统具备一个理想的多任务处理器——我们可以给任何进程调度无限小的时间周期,所以在任何可测量范围内,可以给n个进程桐乡多的运行时间。...nice值的相对差值决定的,因此我们可以说,CFS至少保证了给每个进程公平的处理器占用比,算是一种近乎完美的多任务调度方式了。
进程调度器的任务就是合理分配CPU时间给运行的进程,创造一种所有进程并行运行的错觉。这就对调度器提出了要求: 1、调度器分配的CPU时间不能太长,否则会导致其他的程序响应延迟,难以保证公平性。...Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程的优先级越小 任何实时进程的优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总的调度结构...一、Fair 调度使用的是 CFS 的调度算法,即完全公平调度器 对于一个普通进程,CFS 调度器调度它执行(SCHED_NORMAL),需要考虑两个方面维度: 1....调度器为了体现绝对的完全公平的调度原则,总是选择 vruntime 最小的进程,让其投入执行。
公平锁和非公平锁 一、如果一个锁是公平的,那么获取的顺序就应该符合请求的绝对顺序,即FIFO。 二、测试结果 非公平性锁可能使线程“饥饿”,为什么它又被设定成默认的实现呢?...再次观察上表的结 果,如果把每次不同线程获取到锁定义为1次切换,公平性锁在测试中进行了10次切换,而非 公平性锁只有5次切换,这说明非公平性锁的开销更小。...三、,公平性锁保证了锁的获取按照FIFO原则,而代价是进行大量的线程切换。非公平性锁虽 然可能造成线程“饥饿”,但极少的线程切换,保证了其更大的吞吐量。
场景一:创建一个"best_effort"队列 描述:在公平调度器中,当一个队列的权重(weight)等于0.0的时候,代表这个队列当集群资源存在空闲的时候他才能运行app,换句话说,所有在priority_jobs...去保证低延迟应用的资源 描述:假如我们需要一个队列去运行低延迟应用,我们假设集群有资源,我们为other_jobs设置maxResources,公平调度器将会为
前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。...2.非实时进程的调度 Linux对普通的进程,根据动态优先级进行调度。而动态优先级是由静态优先级(static_prio)调整而来。Linux下,静态优先级是用户不可见的,隐藏在内核中。...系统调度时,还会考虑其他因素,因而会计算出一个叫进程动态优先级的东西,根据此来实施调度。因为,不仅要考虑静态优先级,也要考虑进程的属性。...Linux2.6 在这方面有了较大的提高。Linux2.6认为,交互式进程可以从平均睡眠时间这样一个measurement进行判断。进程过去的睡眠时间越多,则越有可能属于交互式进程。...则系统调度时,会给该进程更多的奖励(bonus),以便该进程有更多的机会能够执行。奖励(bonus)从0到10不等。
调度策略 进程可以分为实时进程和普通进程,对于这两种不同类型的进程肯定有不同的调度策略,task_struct中的policy就用来表示调度策略。...fair_sched_class:普通进程的调度策略 CFS调度算法 CFS(completed fair Schedule)完全公平调度,适用于普通进程调度。...vruntime = 实际运行时间 * NICE_0_LOAD / 权重 使用调度算法首先得有包含vruntime的调度实体,task_struct中有如下调度实体的成员变量: struct sched_entity...se; //完全调度实体 struct sched_rt_entity rt; // 实时调度实体 struct sched_dl_entity dl; // deadline调度实体 CFS算法中将...当cpu需要一个任务执行时,其会先按照优先级选择不同的调度类,不同的调度类操作不同的队列,例如rt_sched_class先被调用,其会在rt_rq中找下一个任务,只有找不到时才轮到fair_sched_class
在Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元...Linux这样实现的线程的好处的之一是:线程调度直接使用进程调度就可以了,没必要再搞一个进程内的线程调度器。...下面介绍几种常见的调度策略: SCHED_OTHER:该策略是是默认的Linux分时调度(time-sharing scheduling)策略,它是Linux线程默认的调度策略。...放在队列尾保证了所有具有相同优先级的RR任务的调度公平。...那么在Linux中,在什么情况下要执行这个调度程序呢?我们把这种情况叫作调度时机。
公平锁:表示线程获取锁的顺序是按照线程启动顺序来获取的,即先来先得先进先出。 非公平锁:表示获取锁是随机获得的,先启动的也不能保证一定先获得锁。 下面我们用两个例子来演示一下公平锁与非公平锁。...公平锁 ? ? ? ? 我们看输出线程的运行顺序和线程获取锁的顺序是一致的。这就是公平锁的特征,先到先得。下面我们看一下非公平锁。...非公平锁 我们只需要将测试类中的Userinfo对象的参数为true改成false即可。 ? ?...我们看线程获取锁的顺序和线程的执行顺序没有什么规律,这就是非公平锁,不能保证,先执行的线程一定能够先获得到锁。...公平锁与非公平锁的区别: 公平锁的性能要比非公平锁的性能要低 ReentrantLock类默认的构造参数为false也就是默认是非公平锁
当计算机中有大量进程在运行时,这个调度器的性能将会被大大降低。也就是说,O(n)调度器没有很好的可拓展性。O(n)调度器是Linux 2.6之前使用的进程调度器。...完全公平调度器 从2007年发布的Linux 2.6.23版本起,完全公平调度器(CFS,Completely Fair Scheduler)取代了O(1)调度器。...完全公平调度器用一种叫红黑树的数据结构取代了O(1)调度器的140个队列。红黑树可以高效地找到虚拟运行最小的进程。 我们先通过例子来看CFS调度器。...按照上述的基本设计理念,CFS调度器能让所有进程公平地使用CPU。听起来,这让进程的优先级变得毫无意义。CFS调度器也考虑到了这一点。CFS调度器会根据进程的优先级来计算一个时间片因子。...以上就是调度器的基本原理,以及Linux用过的几种调度策略。调度器可以更加合理地把CPU时间分配给进程。现代计算机都是多任务系统,调度器在多任务系统中起着顶梁柱的作用。
考虑到文章篇幅,在这里我只讨论普通进程,其调度算法采用的是CFS(完全公平)调度算法。...至于CFS调度算法的实现后面后专门写一篇文章,这里只要记住调度时选择一个优先级最高的任务执行 一、调度单位简介 1.1 task_struct 结构体简介 对于Linux内核来说,调度的基本单位是任务,...Linux采用的是每个CPU都有自己的运行队列,这样做的好处: (1)每个CPU在自己的运行队列上选择任务降低了竞争 (2)某个任务位于一个CPU的运行队列上,经过多次调度后,内核趋于选择相同的CPU...在这里我只讨论普通任务的调度,因为linux大部分情况下都是在运行普通任务,普通任务选择的调度器是CFS完全调度。 在调度时,调度器去 CFS 运行队列找是否有任务需要运行。...具体请参考:Linux 进程调度通知机制 struct preempt_ops { void (*sched_in)(struct preempt_notifier *notifier, int cpu
Linux是一个支持多任务的操作系统,而多个任务之间的切换是通过 调度器 来完成,调度器 使用不同的调度算法会有不同的效果。...Linux2.4版本使用的调度算法的时间复杂度为O(n),其主要原理是通过轮询所有可运行任务列表,然后挑选一个最合适的任务运行,所以其时间复杂度与可运行任务队列的长度成正比。...而Linux2.6开始替换成名为 O(1)调度算法,顾名思义,其时间复杂度为O(1)。...虽然在后面的版本开始使用 CFS调度算法(完全公平调度算法),但了解 O(1)调度算法 对学习Linux调度器还是有很大帮助的,所以本文主要介绍 O(1)调度算法 的原理与实现。...由于在 Linux 内核中,任务和进程是相同的概念,所以在本文混用了任务和进程这两个名词。
领取专属 10元无门槛券
手把手带您无忧上云