深入理解CPU的调度原理lclc

软件工程师们总习惯把OS(OperatingSystem,操作系统)当成是一个非常值得信赖的管家,我们只管把程序托管到OS上运行,却很少深入了解操作系统的运行原理。确实,OS作为一个通用的软件系统,在大多数的场景下都表现得足够的优秀。但仍会有一些特殊的场景,需要我们对OS进行各项调优,才能让业务系统更高效地完成任务。这就要求我们必须深入了解OS的原理,不仅仅只会使唤这个管家,还能懂得如何让管家做得更好。

OS是一个非常庞大的软件系统,本文主要探索其中的冰山一角:CPU的调度原理。

在探索CPU调度原理之前,我们先了解一下CPU的上下文切换,它是CPU调度的基础。

如今的OS几乎都支持"同时"运行远大于CPU数量的任务,OS会将CPU轮流分配给它们使用。这就要求OS必须知道从哪里加载任务,以及加载后从哪里开始运行,而这些信息都保存在CPU的寄存器中,其中即将执行的下一条指令的地址被保存在程序计数器(PC)这一特殊寄存器上。我们将寄存器的这些信息称为CPU的上下文,也叫硬件上下文。

OS在切换运行任务时,将上一任务的上下文保存下来,并将即将运行的任务的上下文加载到CPU寄存器上的这一动作,被称为CPU上下文切换。

CPU上下文属于进程上下文的一部分,我们常说的进程上下文由如下两部分组成:

这涉及到两个问题:(1)上一任务的CPU上下文如何保存下来?(2)什么时候执行上下文切换?

问题1:上一任务的CPU上下文如何保存下来?

CPU上下文会被保存在进程的内核空间(kernelspace)上。OS在给每个进程分配虚拟内存空间时,会分配一个内核空间,这部分内存只能由内核代码访问。OS在切换CPU上下文前,会先将当前CPU的通用寄存器、PC等进程现场信息保存在进程的内核空间上,待下次切换时,再取出重新装载到CPU上,以恢复任务的运行。

问题2:什么时候执行上下文切换?

OS要想进行任务上下文切换,必须占用CPU来执行切换逻辑。然而,用户程序运行的过程中,CPU已经被用户程序所占用,也即OS在此刻并未处于运行状态,自然也无法执行上下文切换。针对该问题,有两种解决策略,协作式策略与抢占式策略。

协作式策略依赖用户程序主动让出CPU,比如执行系统调用(SystemCall)或者出现除零等异常。但该策略并不靠谱,如果用户程序没有主动让出CPU,甚至是恶意死循环,那么该程序将会一直占用CPU,唯一的恢复手段就是重启系统了。

抢占式策略则依赖硬件的定时中断机制(TimerInterrupt),OS会在初始化时向硬件注册中断处理回调(InterruptHandler)。当硬件产生中断时,硬件会将CPU的处理权交给来OS,OS就可以在中断回调上实现CPU上下文的切换。

对于一种CPU调度算法的好坏,一般都通过如下两个指标来进行衡量:

OS上的工作负载(也即各类任务运行的状况)总是千变万化的,为了更好的理解各类CPU调度算法原理,我们先对工作负载进行来如下几种假设:

准备工作已经做好,下面我们开始进入CPU调度算法的奇妙世界。

FIFO(FirstInFirstOut,先进先出)调度算法以原理简单,容易实现著称,它先调度首先到达的任务直至结束,然后再调度下一个任务,以此类推。如果有多个任务同时到达,则随机选一个。

在我们假设的工作负载状况下,FIFO效率良好。比如有A、B、C三个任务满足上述所有负载假设,每个任务运行时长为10s,在t=0时刻到达,那么任务调度情况是这样的:

让我们继续打破假设2,A在t=0时刻,B和C则在t=10时刻到达,那么调度情况会变成这样:

为了解决SJF的任务饿死问题,我们需要打破假设3,也即任务在运行过程中是允许被打断的。如果B和C在到达时就立即被调度,问题就解决了。这属于抢占式调度,原理就是CPU上下文切换一节提到的,在中断定时器到达之后,OS完成任务A和B的上下文切换。

不妨假设A、B、C三个任务都在t=0时刻到达,运行时长都是5s,那么这三个算法的调度情况如下,平均响应时长为5s():

更糟糕的是,随着任务运行时长的增长,平均响应时长也随之增长,这对于交互类任务来说将会是灾难性的,严重影响用户体验。该问题的根源在于,当任务都同时到达且运行时长相同时,最后一个任务必须等待其他任务全部完成之后才开始调度。

CPU上下文切换的消耗,不只是保存和恢复寄存器所带来的消耗。程序在运行过程中,会逐渐在CPU各级缓存、TLB、分支预测器等硬件上建立属于自己的缓存数据。当任务被切换后,就意味着又得重来一遍缓存预热,这会带来巨大的消耗。

到目前为止,我们并未考虑任何的I/O操作。我们知道,当触发I/O操作时,进程并不会占用CPU,而是阻塞等待I/O操作的完成。现在让我们打破假设4,考虑任务A和B都在t=0时刻到达,运行时长都是50ms,但A每隔10ms执行一次阻塞10ms的I/O操作,而B没有I/O。

如果使用STCF进行调度,调度的情况是这样的:

从上图看出,任务A和B的调度总时长达到了140ms,比实际A和B运行时长总和100ms要大。而且A阻塞在I/O操作期间,调度器并没有切换到B,导致了CPU的空转!

接下来,我们将介绍一个能够在所有工作负载假设被打破的情况下依然表现良好,被许多现代操作系统采用的CPU调度算法,MLFQ。

MLFQ(Multi-LevelFeedbackQueue,多级反馈队列)调度算法的目标如下:

那么对MLFQ来说,就需要解决如下两个问题:

MLFQ与前文介绍的几种调度算法最显著的特点就是新增了优先级队列存放不同优先级的任务,并定下了如下两个规则:

规则3主要考虑到让新加入的任务都能得到调度机会,避免出现任务饿死的问题

按照上述规则,当一个long-running任务A到达时,调度情况是这样的:

如果在任务A运行到t=100时,short-time任务B到达,调度情况是这样的:

如果任务A运行到t=100时,交互类任务C到达,那么调度情况是这样的:

考虑如下场景,任务A运行到t=100时,交互类任务C和D同时到达,那么调度情况会是这样的:

由此可见,如果当前系统上存在很多交互类任务时,CPU密集型任务将会存在饿死的可能!

为了解决该问题,可以设立了如下规则:

加上该规则之后,假设设置S为50ms,那么调度情况是这样的,饿死问题得到解决!

为了解决该问题,我们需要将规则4调整为如下规则:

应用新的规则4后,相同的工作负载,调度情况变成了如下所述,不再出现恶意任务E占用大量CPU的问题。

到目前为止,MLFQ的基本原理已经介绍完,最后,我们总结下MLFQ最关键的5项规则:

现在,再回到本节开始时提出的两个问题:

2、MLFQ如何从历史调度中学习,以便未来做出更好的决策?

MLFQ主要根据任务是否有主动让出CPU的行为来判断其是否是交互类任务,如果是,则维持在当前的优先级,保证该任务的调度优先权,提升交互类任务的响应性。

可以给任务分配权重,让权重高的任务更多的CPU!

还是前面的例子,假设A和B都没有I/O操作,更新vruntime计算规则后,调度情况如下,任务B比任务A能够分得更多的CPU了。

CFS每次切换任务时,都会选取vruntime值最小的任务来调度,因此需要它有个数据结构来存储各个任务及其vruntime信息。

为了兼顾查询、插入、删除的效率,CFS使用红黑树来保存任务和vruntime信息,这样,查询、插入、删除操作的复杂度变成了log(N),并不会随着任务数的增多而线性增长,极大提升了效率。

另外,为了提升存储效率,CFS在红黑树中只保存了处于Running状态的任务的信息。

为了解决该问题,CFS规定当任务从休眠或I/O中返回时,该任务的vruntime会被设置为当前红黑树中的最小vruntime值。上述例子,B从休眠中醒来后,会被设置为11,因此也就不会饿死任务A了。

本文中描述的调度算法都是基于单核处理器进行分析的,而多核处理器上的调度算法要比这复杂很多,比如需要考虑处理器之间共享数据同步、缓存亲和性等,但本质原理依然离不开本文所描述的几种基础调度算法。

THE END
1.智能客服的平均首次响应时长是否包含客服未响应的会话?智能客服的平均首次响应时长是否包含客服未响应的会话?有赞帮助中心将为您提供有关微商城、小程序等相关产品的详细解决方案。https://help.youzan.com/displaylist/detail_4_4-1-84942
2.平均响应时间是什么意思店查查平均响应时间计算公式为:响应时间=(队列长度+1)*平均响应时间。 二、淘宝客服首次响应时间是什么? 首次响应时间指的是买家联系客服,客服人员第一次回复买家的平均时间,自动回复内不算,系统自动过滤掉。 首次回复时间要与平均响应时间区分开店,平均响应时间指的是该客服对客户每次回复用时的平均值。 https://www.dianchacha.com/news/info/id/9388
3.mysql数据库平均响应时长计算mob64ca12e3dd9e的技术博客MySQL是一个广泛使用的开源关系型数据库管理系统,被用于许多Web应用程序的后端数据存储和管理。在实际的应用中,我们经常需要对MySQL的性能进行评估和优化,其中一个重要的指标就是平均响应时长。本文将介绍如何计算MySQL数据库的平均响应时长,并给出相应的代码示例。 https://blog.51cto.com/u_16213379/9351246
4.平均响应时间是什么意思,淘宝客服的响应时间怎么算在淘宝交易过程中,客服的响应速度直接关系到买家的购物体验。平均响应时间是一个重要的指标,它反映了客服团队对于买家咨询的反应迅速程度。本文将深入解析平均响应时间的意义以及在淘宝客服中如何计算和提升响应速度。 平均响应时间是什么意思? 平均响应时间是指客服在收到用户咨询或消息后,所用的平均时间来做出回应。这https://www.lbdj.com/zixun/369032975.html
5.京东考核指标中,平均响应时长的定义是()?A.用户发起与客服响应的响应时间差之和/响应次数B.应时间差之和/响应时长https://www.shangxueba.com/ask/109481286.html
6.如何有效分析SIM平均响应时长的数据?腾讯云开发者社区为了避免上述类似情况的发生,我们通过即时管理系统的统计报表,按照任意时间段,去统计各部门的SIM问题的平均响应时长,SIM平均响应时长的数据统计逻辑是一个问题提出后开始计时,直到这个问题的责任人回复这条问题的行动计划后截止计时,再把这个中间间隔以小时为单位统计为该条问题责任人所在部门的平均响应时长数据里。平均https://cloud.tencent.com/developer/news/1000905
7.抖音商家要如何解读客服分析看板数据?抖音的客服分析看板支持商家查看最新客服水平概况,筛选时间段查看近期趋势,具体指标包括:三分钟平均回复率、接起率、平均响应时长、平均等待时长等客服效率指标,用户咨询量、转人工接待量、人工已接待量等客服量指标,客服销售额及满意率等用户指标。商家可实时监控以上关键数据指标判断当前客服水平,及时监控指标变化趋势来https://www.shuaishou.com/school/infos55035.html
8.事件管理流程详解5) 服务台平均回访时长 6) 一线事件解决百分比 7) 二线事件解决百分比 8) 三线事件解决百分比 9) 一线平均响应时长 10) 二线平均响应时长 11) 三线平均响应时长 12) 事件平均处理时长 [@more@] 转载于:http://blog.itpub.net/23630258/viewspace-1032530/ https://blog.csdn.net/congmu6476/article/details/100312372/
9.压力测试分析(转载)平均响应时长:移动互联网时代,你让一个用户打开app等你1s,用户早就跑了,打开app立刻看见内容是最起码的要求,一般好的app接口相应时间都是毫秒级别的,但是不同的场景不同的要求,我的上一家公司要求平均相应时长在20ms以内。可是上上家公司的算法接口,平均相应时长在100ms,不同的服务不同的要求,你需要找到适合你https://www.jianshu.com/p/4ff91770cd98