Linux内核[1],调度子系统总览

Linux内核的调度子系统是负责确定在系统中哪个进程或线程应该被分配处理器时间的组件。它在多个进程和线程之间进行资源分配,以便让系统在最有效率的情况下工作。
Linux内核的调度子系统使用一种称为多级反馈队列调度(Multi-Level Feedback Queue Scheduling)的算法来决定哪个进程或线程应该获得处理器时间。这种算法将所有就绪进程或线程放入一个队列中,然后按照它们的优先级来决定谁应该获得处理器时间。
在Linux内核中,优先级被分为两个级别:静态优先级和动态优先级。静态优先级是一个进程或线程在创建时被赋予的优先级,它不会随着时间的推移而改变。而动态优先级则会随着时间的推移而改变,它反映了一个进程或线程在运行时的表现。

Linux内核的调度子系统在决定哪个进程或线程应该获得处理器时间时,会根据它们的静态优先级和动态优先级来进行排序。如果两个进程或线程的静态优先级相同,则会根据它们的动态优先级来决定哪个应该获得处理器时间。

此外,Linux内核的调度子系统还会根据进程或线程的状态来决定它们是否应该获得处理器时间。例如,如果一个进程或线程处于等待状态(例如,等待输入/输出操作完成),那么它将不会获得处理器时间。

Linux内核的调度子系统会在以下情况下触发调度:

  • 当一个进程或线程完成它的执行时间片时
  • 当一个进程或线程调用了睡眠(sleep)函数时
  • 当一个进程或线程等待某些事件发生时
  • 当一个进程或线程被挂起时

调度子系统会在这些情况下重新排序进程和线程的队列,并决定下一个应该获得处理器时间的进程或线程。

调度和上下文切换是Linux内核的重要组成部分。调度是指调度子系统决定哪个进程或线程应该获得处理器时间,而上下文切换则是指在调度进程或线程时,内核必须保存当前进程或线程的状态,并切换到新的进程或线程。

Linux内核通过设置中断控制器(Interrupt Controller)来实现调度和上下文切换。当一个进程或线程完成它的执行时间片时,中断控制器会产生一个时钟中断,并通知调度子系统。调度子系统会对进程和线程的队列进行排序,并选择下一个应该获得处理器时间的进程或线程。

在进行上下文切换时,Linux内核会使用一个名为“进程控制块”(Process Control Block,PCB)的数据结构来保存当前进程或线程的状态。当调度子系统决定切换到新的进程或线程时,它会加载新进程或线程的PCB,并切换到新的进程或线程。

为了提高调度和上下文切换的效率,Linux内核还使用了一种称为预取的调度算法(Preemptive Scheduling Algorithm)的预取的调度算法是一种优化调度和上下文切换的算法。它通过在某些情况下提前执行调度来提高效率。

例如,当一个进程或线程调用了睡眠(sleep)函数时,它可能会持续很长时间才能被唤醒。如果在这个进程或线程睡眠期间,有另一个进程或线程准备好执行,那么预取的调度算法就会提前执行调度,将处理器时间分配给准备好执行的进程或线程,从而提高效率。

预取的调度算法也会在其他情况下提前执行调度。例如,如果一个进程或线程的优先级发生了变化,或者一个新的进程或线程被添加到就绪队列中,那么预取的调度算法也会提前执行调度。这样做可以保证系统能够有效地利用处理器时间,提高系统的性能。

schedule函数是Linux内核中的一个重要函数,它用于实现调度子系统。

当调度子系统决定执行调度时,它会调用schedule函数来执行实际的调度操作。schedule函数会检查进程和线程的就绪队列,并根据进程和线程的优先级和状态来决定下一个应该获得处理器时间的进程或线程。

schedule函数还会执行上下文切换,即在切换到新的进程或线程之前保存当前进程或线程的状态。它会使用进程控制块(PCB)数据结构来保存当前进程或线程的状态,并加载新进程或线程的PCB,完成上下文切换。

此外,schedule函数还会执行其他一些操作,例如检查是否需要进行调度统计,更新进程和线程的统计信息,等等。

在多核处理器环境下,调度多个处理器上的进程和线程是一个比较复杂的问题。主要难点有以下几点:

  • 如何保证多个处理器的负载平衡,避免某个处理器的负载过重而影响系统的性能;
  • 如何保证多个处理器的调度公平,避免某些进程和线程因为处理器的限制而无法得到充分的资源利用;
  • 如何处理多个处理器之间的同步问题,避免多个处理器之间的竞争导致系统的不稳定。

Linux内核的调度子系统采用了多种机制来应对上述难点。例如,可以通过迁移任务来保证多个处理器的负载平衡;可以通过动态调整进程和线程的优先级来保证多个处理器的调度公平;可以通过灵活的内存分配机制来处理多个处理器之间的同步问题。

CFS调度器(Completely Fair Scheduler)是Linux内核中一种用于实现多级反馈队列调度(Multi-Level Feedback Queue Scheduling)的算法。它是Linux内核默认使用的调度器,可以在多核处理器环境下提供良好的性能。

CFS调度器使用一种称为“运行时间平衡树”(Run-Time Balancing Tree)的数据结构来维护进程和线程的就绪队列。运行时间平衡树是一种二叉查找树,它将进程和线程按照它们的动态优先级进行排序。CFS调度器每次调度时,都会从运行时间平衡树的根节点开始,查找最靠左边的叶子节点,即优先级最高的进程或线程。

CFS调度器还支持一种称为“负载平衡”(Load Balancing)的机制,它可以保证系统中的所有处理器在执行任务时都能够得到公平的分配。例如,如果某个处理器执行的任务较多,那么CFS调度器会将一些任务调度到其他处理器上,以便平衡处理器的负载。这样做可以提高系统的性能,保证多核处理器的有效利用。

此外,CFS调度器还支持实时调度,可以满足实时系统的要求。它会为实时进程和线程分配独立的运行时间平衡树,并为实时进程和线程设定较高的优先级,以便在实时系统中能够提供可靠的响应时间。CFS调度器是一种高效、灵活的调度器,能够满足大多数多核处理器环境下的调度需求。它可以保证系统中的进程和线程能够得到公平的调度,提高系统的性能。

总之,Linux内核的调度子系统提供了丰富的特性,能够有效地应对多核心调度的难点,保证系统的稳定和高性能。




全部评论

相关推荐

05-24 20:52
东南大学 C++
点赞 评论 收藏
分享
咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务