前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CFS Scheduler(CFS调度器)

CFS Scheduler(CFS调度器)

作者头像
DragonKingZhu
发布于 2020-03-24 08:27:13
发布于 2020-03-24 08:27:13
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

前面我们分享了O(n)和O(1)调度器的实现原理,同时也了解了各个调度器的缺陷和面临的问题。总的来说O(1)调度器的出现是为了解决O(n)调度器不能解决的问题,而O(1)调度器在Linux2.4内核的在服务器的变形是可行的,但是Linux2.4以后随着移动设备的逐渐普遍,面临的卡顿问题逐渐明晰,这才导致后来的CFS调度器的出现。

本节我们重点来关注下CFS调度器实现,在学习CFS代码之前,我们先看CFS的实现原理,搞清楚它的来龙去脉,以及为啥CFS调度器需要这样设计,基本就可以掌握CFS调度器了。

CFS引入

完全公平调度器(CFS)最早是在2017年merged进Linux2.6.23版本中的,一直到现在都是系统中默认的调度器。内核文章中的sched-design-CFS.txt文档对CFS调度器有一个简单的介绍。

80% of CFS's design can be summed up in a single sentence: CFS basically models an "ideal, precise multi-tasking CPU" on real hardware.

这句话的意思是CFS的80%的设计总结起来就一句话“在一个真实的硬件上,实现公平,精确的多任务CPU”

"理想的,精确的,多任务CPU"这句话是啥意思呢? 到底怎么理解呢?我们来通过例子做下解释

"Ideal multi-tasking CPU" is a (non-existent :-)) CPU that has 100% physical power and which can run each task at precise equal speed, in parallel, each at 1/nr_running speed. For example: if there are 2 tasks running, then it runs each at 50% physical power --- i.e., actually in parallel.

内核文档是这样说的。"理想的,多任务CPU"是在同一时刻每个任务以1/nr_running_speed来运行,也就是同一时刻每个进程瓜分CPU的时间是相同的。例如如果有两个进程运行的话,每个进程占有50%的CPU时间。

举一个例子:

两个批处理进程,总共只能运行10ms。

实际情况:每个进程运行5ms,占有100%的CPU利用率

理想情况:每个进程运行10ms,占有50%的CPU利用率。

而所谓的理想情况就是CFS提到的"Ideal multi-tasking CPU"

上述的例子在一个单核CPU,只有一个处理核心的CPU上是完全不可能的,因为同一时刻只能运行一个进程,另外一个进程必须等待。而CFS就是为了的达到完全公平调度,它应该怎么做呢?

如何才能实现完全公平调度

在O(n)调度器和O(1)调度器中,我们知道都是通过优先级来分配对应的timeslice,也就是时间片。而这些时间片都是固定的。比如在O(n)调度器中nice0对应的时间片是60ms。而在CFS调度器中,不再有时间片的概念。而是根据当前系统中可运行进程的总数来计算出进程的可运行时间的。

在O(n)调度器和O(1)调度器中,普通进程都是通过nice值来获取对应时间片,nice值越大获取的时间片就越多,运行机会就越多。而在CFS调度器中引入了权重weight的概念,通过nice值转化为对应的权重,优先级越高的进程对应的权重就越大,意味着就可以获得更多的CPU时间。

则进程占用CPU的时间 =

进程的weight / 总的可运行进程weight

CFS是让进程通过运行一段时间来达到公平,进程占用的时间就是进程的weight占总的可运行进程的总权重的比值。

举例:总共10ms的时间,单核cpu

  • 进程的优先级相同:

如果两个进程的优先级相同,则对应的权重相同,则每个进程占用5ms的CPU时间;如果有5个进程,每个进程占用2ms的CPU时间;如果共10个进程,每个进程占用1ms的CPU时间。

  • 进程的优先级不同:

如果两个进程的优先级不同,比如A进程nice是0,B的nice值1,则A进程的优先级就高,weight就越大,对应B的优先级小,weight也小于A。假设A的权重是6,B的权重是4。则A占2/3的CPU时间,B占1/3的CPU时间。

这样一来就达到了公平性,每个进程在各子拥有的权重比例下,占用不同份额的CPU时间。

再结合生活举一例:

公司发年终奖,一般来说一个部门的总包(CPU时间)是固定的。而为了公平老板不会给每个人发同样的奖金的,这样反而不公平了。而是通过平时在公司的表现,工作的认真态度之类(进程的weight)来衡量,比如张XX很辛苦,经常加班,进程出差,年终奖(进程占用CPU的时间)就多发。刘XX经常迟到,下班就没人了,年终奖(进程占用CPU的时间)少发。这样就显得公平。

CFS调度器是如何选择进程的

CFS的目标是让各个进程在一段时间内实现公平,也就是根据进程的权重来瓜分CPU的时间。权重越大则瓜分的CPU时间就越多,分配的CPU时间多就等同于有更大的机会得到CPU。

CFS调度是通过进程的虚拟时间vruntime来选择要运行的进程。vruntime的计算公式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vruntime = (wall_time * NICE0_TO_weight) / weight

其中,wall_time代表的是进程实际运行的时间,NICE0_TO_Weight代表的是nice值等于0对应的权重,weight就是该进程对应的权重。可以看出vruntime的值其实是实际运行时间乘以nice0对应的weight除以进程的权重。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * Nice levels are multiplicative, with a gentle 10% change for every
 * nice level changed. I.e. when a CPU-bound task goes from nice 0 to
 * nice 1, it will get ~10% less CPU time than another CPU-bound task
 * that remained on nice 0.
 *
 * The "10% effect" is relative and cumulative: from _any_ nice level,
 * if you go up 1 level, it's -10% CPU usage, if you go down 1 level
 * it's +10% CPU usage. (to achieve that we use a multiplier of 1.25.
 * If a task goes up by ~10% and another task goes down by ~10% then
 * the relative distance between them is ~25%.)
 */
const int sched_prio_to_weight[40] = {
 /* -20 */     88761,     71755,     56483,     46273,     36291,
 /* -15 */     29154,     23254,     18705,     14949,     11916,
 /* -10 */      9548,      7620,      6100,      4904,      3906,
 /*  -5 */      3121,      2501,      1991,      1586,      1277,
 /*   0 */      1024,       820,       655,       526,       423,
 /*   5 */       335,       272,       215,       172,       137,
 /*  10 */       110,        87,        70,        56,        45,
 /*  15 */        36,        29,        23,        18,        15,
};

此表就是nice值和weight的转换变,此表已经计算好了,在代码中需要计算vruntime的时候,只需要根据nice值查表即可。

从注释上可以看出,当nice增大一个台阶,将会减少10%的CPU占用时间;当nice值减少一个台阶,将会获得10%的cpu时间。

从上面计算vruntime的公式可以得出,nice等于0的进程的虚拟时间等于物理时间。当一个进程的weight越大,则对应的进程的vruntime就越小;当一个进程的weight越小,则对应的vruntime就越大。

CFS每次调度原则是,总是选择vruntime最小的进程来调度,vruntime最小的进程weight越大,优先级越高,则就需要更高的获取CPU的时间。

举例说明:总共6ms的时间,有3个进程,一个进程A的权重是1024,另外一个进程B的权重是335,进程C的权重是3121

进程A vruntime = (2ms * 1024) / 1024 = 2ms, CPU占用率 = 1024/(1024+335+3121) = 22%

进程B vruntime = (2ms * 1024) / 335 = 6ms,CPU占用率 = 335/ (1024+335+3121) = 7%

进程C vruntime = (2ms * 1024) / 3121 = 0.65ms,CPU占用率 = 3121/ (1024+335+3121) = 70%

可以看出

  1. 各个CPU利用率都是相差50%,因为nice值每增加一个台阶,CPU占用率有10%的差别
  2. 进程的权重越大,分母也就越大,则vruntime则就越小,而在下一次选择进程时则高优先级选择它
  3. nice0=1024权重的进程的虚拟时间和物理时间是一样的
  4. 可以理解权重越大,虚拟时间越小,对应的虚拟时间轴跑的越快
  5. 权重越小,虚拟时间越大,对应的虚拟时间轴跑的越慢

调度周期(sched_period)

之前说过一个进程占用的CPU时间是根据进程的weight和系统中总的可运行进程的权重的比值。

进程占用CPU的时间 =

进程的weight / 总的可运行进程weight

比如两个优先级相同进程,总共10ms的时间,每个进程占用5ms。当系统中可运行的进程数目逐渐增多,则每个进程占用的cpu的时间就会越来越小,趋近于0。这就会导致进程之前频繁的发生上下文切换,CPU的大多数时间是用来处理进程的上下文切换了,导致系统效率下降。

所以对于此问题再CFS中则引入了调度周期,调度周期的计算通过如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * The idea is to set a period in which each task runs once.
 *
 * When there are too many tasks (sched_nr_latency) we have to stretch
 * this period because otherwise the slices get too small.
 *
 * p = (nr <= nl) ? l : l*nr/nl
 */
static u64 __sched_period(unsigned long nr_running)
{
	if (unlikely(nr_running > sched_nr_latency))
		return nr_running * sysctl_sched_min_granularity;
	else
		return sysctl_sched_latency;
}

static unsigned int sched_nr_latency = 8;
unsigned int sysctl_sched_latency			= 6000000ULL;
unsigned int sysctl_sched_min_granularity			= 750000ULL;

从注释上看,这个函数的目的是为了让每个进程都可以运行一次。当系统中的进程数目逐渐增大时,则需要增大调度周期。

当进程的数目小于8时,则调度周期等于调度延迟等于6ms。当系统的进程数目大于8时,则调度器周期等于进程的数目乘以0.75ms。sysctl_sched_min_granularity可以理解为在一个调度周期中一个进程至少保证执行0.75ms。

CFS总结:

  • 在O(n)和O(1)调度器中都是通过nice值来分配固定的时间片,CFS中没有时间片的概念
  • CFS调度器中通过进程的静态优先级来计算进程的权重,进程的权重就代表了此进程需要获取的CPU的时间比例
  • 通过进程的weight和进程的实际运行时间来计算进程的vruntime虚拟时间。
  • 当进程加入到运行队列,调度器会时刻来更新进程的vruntime,来达到公平
  • 调度器每次调度的时候只选择运行队列中虚拟时间最小的进程,当此进程运行一段时间后,vruntime就会变大
  • 这时候就需要调度时候就需要重新选择新的最小vruntime的进程来执行,上次被调度出去的进程则就需要根据vrumtime的值来选择自己在运行队列的位置
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
全长转录组 | 三代全长转录之circRNA(ONT )-- CIRI-long
目前研究表明,在生物体内,circRNA主要通过其序列特征,发挥miRNA海绵、RNA-binding proteins (RBPs)海绵以及翻译短肽等生物学功能(1-2)。因此,确定其的全长序列,是进行circRNA功能研究的重要基础。由于目前对于circRNA的研究多采用二代测序的方法,而circRNA的内部序列与线性mRNA分子高度相似,单纯通过算法(识别反向剪切位点)很难区分来自环形RNA和线性RNA分子的读段,以及确定全长circRNA内部组成。近期的研究中利用了长读长测序技术,对circRNA的全长重构进行了尝试(3-4)。因此,目前研究方法对于circRNA结构的识别能力主要被二代测序的读长所限制,对于长度较长(>500bp)的circRNA分子,仍然缺少有效的全长重构手段。
三代测序说
2024/04/07
3251
全长转录组 | 三代全长转录之circRNA(ONT )-- CIRI-long
全长转录组 | Iso-Seq 三代测序数据分析流程 (PacBio) (3)-- SQANTI3 v5.2
Functional IsoTranscriptomics (FIT) 是美国弗罗里达大学(University of Florida)Ana Conesa 教授团队(Genomics of Gene Expression Lab, ConesaLab)开发的在转录本isoform水平上进行生物信息学分析的流程,旨在提供一个全长转录组end-to-end的解决方案 (图1)。SQANTI 3 构成了FIT流程的第一个模块,其设计目的是使长读序列定义的转录组的质量控制和过滤成为可能,这些转录本通常含有artifacts和假阳性。因此,对全长转录组进行校正是进行FIT分析的前提,且对产生可靠的、在生物学上合理的结论/假设至关重要。SQANTI 3 是SQANTI 工具(发布)的最新版本,该版本合并 SQANT 1 和 SQANTI 2 中的功能并加入了新的功能 ,更好的对全长转录本进行深度表征 。
三代测序说
2024/01/27
2.4K0
全长转录组 | Iso-Seq 三代测序数据分析流程 (PacBio) (3)-- SQANTI3 v5.2
全长转录组 | 三代全长转录组分析流程(PacBio & ONT )-- Bambu
今天我们继续介绍一款使用三代全长转录本数据进行转录本注释和定量的工具 - Bambu。来自新加坡科技研究局 (A-STAR) 的Jonathan Göke(图1)开发的长度长RNA-seq转录组分析工具Bambu,于2023年6月12日发表在《Nature Methods》杂志上,题目为Context-aware transcript quantification from long-read RNA-seq data with Bambu。该工具基于机器学习来识别和表征新转录本,从而能够对不同物种和样本进行适应性分析。
三代测序说
2024/03/12
1.4K1
全长转录组 | 三代全长转录组分析流程(PacBio & ONT )-- Bambu
全长转录组 | Iso-Seq 三代测序数据分析流程 (PacBio) (2) -- pigeon
Isoseq 数据分析第一部分我们最后使用了isoseq cluster 获得了聚类后高质量的转录本,但是我们仍然不知道这些经过聚类的转录本在基因组的位置以及属于哪些基因?这些转录本是已经注释的还是新的isoform?每个聚类是否能够进一步合并?每个isoform的表达量情况?下面我们通过使用isoseq collapse和 pigeon对转录本(isoforms)进行在参考基因组指导下的进一步合并(collapse),注释,分类和定量。
三代测序说
2024/01/25
2K0
全长转录组 | Iso-Seq 三代测序数据分析流程 (PacBio) (2) -- pigeon
全长转录组 | 三代全长转录组分析流程(PacBio & ONT )-- IsoQuant
今天我们介绍一款使用三代全长转录本数据进行转录本注释和定量的工具 - IsoQuant。2023年1月2日,康奈尔大学医学院Hagen U. Tilgner团队和圣彼得堡国立大学Andrey D. Prjibelski团队合作在Nature Biotechnology(NBT)杂志发表题为 “Accurate isoform discovery with IsoQuant using long reads” 的文章 (图1)。作者开发了 IsoQuant -- 一款使用内含子图(intron graphs)的计算工具,在有参考基因组注释或者无参的情况下能够利用长度长序列准确重构转录本。对于新的转录本发现,IsoQuant 使Oxford Nanopore(ONT)数据在有参或无参模式下的假阳性率分别降低了5倍和2.5倍。IsoQuant 同时也提高了Pacific Biosciences数据的性能。
三代测序说
2024/02/22
1.6K1
全长转录组 | 三代全长转录组分析流程(PacBio & ONT )-- IsoQuant
全长转录组 | Iso-Seq 三代测序数据分析流程 (PacBio) (1)
很多物种的转录本非常多样和复杂,绝大多数真核生物基因不符合“一基因一转录本”的模式,这些基因往往存在多种可变剪切(Alternative splicing,AS)形式。目前,基于第二代测序技术的RNA测序(RNA-seq)技术已被广泛用于各种转录组研究。但其测序的序列读长较短(50-300bp),大多只能覆盖转录本的一小部分,导致难以精确重构同一转录本的同源异构体(isoform),因此使得二代RNA测序对于全长转录本的重构是不准确的,片面的。
三代测序说
2024/01/23
10.4K0
全长转录组  |  Iso-Seq 三代测序数据分析流程 (PacBio)   (1)
三代测序人物系列 | Yi Xing (邢毅)
美国费城儿童医院(Children’s Hospital of Philadelphia ,CHOP)计算与基因组医学中心(Center for Computational and Genomic Medicine)的创始主任,以及生物医学与健康信息学系的执行主任,同时还担任宾夕法尼亚大学(University of Pennsylvania)病理学与实验医学系(Department of Pathology and Laboratory Medicine, Perelman School of Medicine,)的教授。在加入CHOP和宾大之前,邢博士曾是加州大学洛杉矶分校(UCLA)微生物学、免疫学和分子遗传学系的教授。
三代测序说
2025/02/26
950
三代测序人物系列 | Yi Xing (邢毅)
三代测序人物系列 | Angela N. Brooks
Brooks教授来自美国加利福尼亚大学圣克鲁斯分校(University of California,Santa Cruz, UCSC)巴斯金工程学院(Baskin School of Engineering)的生物分子工程系(Biomolecular Engineering),同时也是 UCSC 基因组学研究所 (Genomics Institute) 和 RNA分子生物学中心(Center for Molecular Biology of RNA)中的一员。该实验室致力于开发新的测序分析工具,专注于研究与癌症相关的RNA。
三代测序说
2024/09/04
1751
三代测序人物系列 | Angela N. Brooks
三代测序人物系列 | Jonathan Göke
Jonathan Göke是新加坡基因组研究所(Genome Institute of Singapore ,A-STAR GIS)的课题组负责人,同时也兼任新加坡国立大学(National University of Singapore)统计与数据科学系的副教授。他在德国马普分子遗传学研究所/柏林自由大学(Max Planck Institute for Molecular Genetics/Freie Universität Berlin)获得了计算机科学与数学博士学位。Göke博士曾获得马普学会和德国学术交流中心(Max Planck Society and the German Academic Exchange Service,DAAD)的奖学金,并被选为基因组研究所的fellow(2014-2016年)和A-STAR 的fellow(2024-2027年)。2024年,Göke博士因其“在长读长RNA测序数据分析算法开发方面的开创性工作”而获得了新加坡国家科学院和国家研究基金会颁发的青年科学家奖,开发的算法使得RNA转录和修饰的分析达到了前所未有的分辨率和准确性。他目前的研究工作专注于第三代长读长RNA测序的计算方法的开发。
三代测序说
2025/03/04
870
三代测序人物系列 | Jonathan Göke
全长转录组 | Oxford Nanopore (ONT) 三代全长转录组分析流程 -- 数据质控和预处理
ONT全长转录组测序是指基于牛津纳米孔公司(Oxford Nanopore Technologies,ONT)三代测序平台进行的全长转录组测序。利用三代测序平台长度长 (long-read)的特性,无需对转录本进行片段化,直接获取某一物种mRNA(或者有polyA尾的lncRNA)5'端到3'端的高质量全长转录组序列信息(图1),可准确识别可变剪接、基因融合、基因家族、可选择性多聚腺苷酸化 (alternative polyadenylation, APA)、等位基因特异性表达等转录本结构方面的变异。基于ONT三代测序平台进行全长转录组测序,除了可准确鉴别上述转录本结构变异,由于现阶段测序成本和通量(相对于PacBio平台),还可实现转录本(mRNA或polyA+ lncRNA)表达水平准确定量和差异分析。
三代测序说
2024/02/05
4.4K0
全长转录组 | Oxford Nanopore (ONT) 三代全长转录组分析流程 -- 数据质控和预处理
基于bam文件做可变剪切的软件leafcutter和rMATS的比较
可变剪接(Alternative Splicing,AS)是指从一个mRNA前体中通过不同的剪接方式,对外显子和内含子进行组合,产生不同的mRNA剪接异构体的过程。高等真核生物中的可变剪接极大地拓展了基因功能的多样性,是调节基因表达和产生蛋白质组多样性的重要机制。
生信技能树
2019/11/18
4.7K0
三代测序与单细胞转录组
单细胞转录组测序通常是基于二代测序平台,具有相对较低的成本和高通量的优势。由于二代测序建库过程需要对cDNA进行打断,无法同时获得细胞标签和全长转录组数据,所以对单细胞转录本的变化知之甚少。而三代测序可以获得全长转录组数据,对于挖掘新转录本以及isoform有着重要的意义。
生信交流平台
2022/09/21
1.8K0
三代测序与单细胞转录组
基于Salmon的转录组定量流程
Salmon是不基于比对计数而直接对基因进行定量的工具,适用于转录组、宏基因组等的分析。
生信宝典
2020/12/15
3.6K0
转录组分析 | 使用Stringtie对数据进行下游处理
StringTie 是用于 RNA-seq 的转录本组装和定量软件,StringTie 可以看做是cufflinks软件的升级版本,其功能和Cufflinks是一样的,包括下面两个主要功能:转录本组装和定量;相比Cuffinks, 其运行速度更快。该软件的官网:https://ccb.jhu.edu/software/stringtie/index.shtml。
DoubleHelix
2020/09/23
14.4K2
转录组分析 | 使用Stringtie对数据进行下游处理
转录组分析 | 使用STAR进行比对
前几期,小编已经教大家完成了RNA-seq数据的质控,下面就要正式开始转录组分析啦!
生信小王子
2020/08/10
4.1K0
转录组分析 | 使用STAR进行比对
全长转录组 | ONT Direct RNA测序 (DRS) 技术原理、数据分析和应用
"牛津纳米孔技术公司(Oxford Nanopore Technologies,ONT)开发的第三代测序平台是 目前唯一能够直接对天然RNA链进行测序的技术平台。ONT - Direct RNA Sequecing (DRS,直接RNA测序)技术能够对天然全长RNA链进行测序,同时能够保留并检测RNA碱基的修饰信息,并能够相对准确地估算 poly(A) 尾的长度,从而还原RNA的真实特征。"
三代测序说
2024/08/08
1.8K0
全长转录组 | ONT Direct RNA测序 (DRS) 技术原理、数据分析和应用
转录组分析 | 使用RSEM进行转录本定量
运行STAR后,我们将reads比对到了参考序列上。接下来,我们需要使用RSEM进行转录本定量。
生信小王子
2020/08/10
8.8K0
转录组分析 | 使用RSEM进行转录本定量
转录组分析 | 使用Hisat2进行序列比对
转录组分析 | 使用trim-galore去除低质量的reads和adaptor
DoubleHelix
2020/09/23
27.4K2
转录组分析 | 使用Hisat2进行序列比对
全基因组 - 人类基因组变异分析(PacBio) (5)-- pbsv
染色体结构变异(Structure Variation, SV),指基因组上发生的长度大于50bp的大片段插入(Insertion, INS)、缺失(Deletion, DEL)、倒位(Inversion, INV)、易位(Translocation)、重复(Duplication, DUP)等类型的变异,其中占比最大的就是大片段的插入和缺失(图1)。插入缺失很好理解就是,多了一段或者少了一段DNA序列;重复就是有一段区域的序列重复出现;倒位就是序列翻转了一下,如本来那个位置该是AATTG的,结果变成了GTTAA;易位的话就是序列位置的变化,又进一步分为染色体内易位和染色体间易位。据统计,基因组结构变异可能导致的遗传性疾病已经超过1,000种,对于每个人来讲其基因组都有至少20,000个的结构变异,这些变异带来的影响或许比SNVs或InDels带来的影响更大。
三代测序说
2023/11/22
1.3K0
全基因组 - 人类基因组变异分析(PacBio) (5)-- pbsv
全基因组 - 人类基因组变异分析(PacBio) (3)-- pbmm2
长读段比对算法与一代/二代测序数据的比对算法有很大的不同,因为长读段通常更长、包含更多错误和变异,并且需要更复杂的比对策略。
三代测序说
2023/10/26
1.3K1
全基因组 - 人类基因组变异分析(PacBio) (3)-- pbmm2
推荐阅读
相关推荐
全长转录组 | 三代全长转录之circRNA(ONT )-- CIRI-long
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验