大家好,欢迎来到IT知识分享网。
为什么要调度?
CPU的核心数量远远少于需要运行的进程数量(比如你的电脑可能只有4-8个CPU核心,但同时运行着上百个进程)。进程调度是操作系统的“大脑”,它负责决定哪个进程在什么时候使用CPU,用多久。
什么时候会触发调度?
调度器主要在以下几种情况下被触发,决定是否要切换进程:
- 主动让出:进程执行完毕、主动休眠(如等待I/O操作完成)、或主动调用 yield()。
- 被迫抢占:进程用完了系统分配给它的时间片。
- 更高优先级:一个更高优先级的进程变为就绪状态(如中断处理完成后)。
- 资源可用:一个进程等待的资源(如I/O、锁)变得可用,从而被唤醒。
核心调度流程
当触发调度后,无论何种方式,最终都会进入 schedule()-> __schedule()函数。这是调度器的核心决策中心:
- 选择下一个进程 (pick_next_task):调度器会按照调度类的优先级顺序(通常是:停机(Stop)、限期(DL)、实时(RT)、公平(CFS)、空闲(Idle))检查每个调度类是否有可运行的进程,并选择vruntime最小的进程作为下一个运行对象,Linux默认的完全公平调度器(CFS) 使用红黑树来组织可运行队列,从而高效地找到vruntime最小的进程。
- 上下文切换 (context_switch):一旦选中新进程,内核便开始执行关键的上下文切换: 切换地址空间 (switch_mm):如果新进程是用户进程,需要切换其内存空间(CR3寄存器)。 切换寄存器状态和内核栈 (switch_to):保存当前进程的所有CPU寄存器状态到其内核栈中,并恢复新进程之前保存的寄存器状态。这是最底层的进程切换操作。
总结进程调度
Linux的进程调度是一个复杂而精妙的系统,其核心可以概括为:
- 两种触发:由时间中断周期性驱动或由进程主动发起。
- 一个核心函数:__schedule()函数是调度决策的中心,负责选择下一个进程并执行切换。
- 多种策略:通过调度类抽象,支持从公平调度到硬实时调度等多种策略,适应不同需求。
- 两级切换:上下文切换包括内存空间切换和硬件寄存器切换。
- 多核扩展:通过负载均衡机制,高效利用多处理器资源。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/189443.html