操作系统 | 进程调度机制全解析

CPU的"相亲"现场:谁才能坐上那个唯一的宝座?

嘿,各位朋友们,大家好!今天我们来聊聊那个每天都在疯狂"相亲"的地方------CPU

大家都知道,我们的电脑里跑着成百上千个进程(微信、Chrome、网易云...),但CPU核心就那么几个。这就好比是"一夫多妻"制,哦不,是"千军万马过独木桥"。

那么问题来了:到底谁才有资格坐上CPU这个"宝座"?是谁在背后操纵这一切?

今天,我们就结合这张来自"西安电子科技大学出版社"的经典流程图,带你走进操作系统的"后宫",看看这场进程调度的大戏是怎么演的。


🎭 角色介绍:调度大戏的演员表

在开演之前,我们先认识一下这张图里的几位关键"大咖":

  1. CPU(宝座):全场唯一的C位,所有进程都想上去爽一把。

  2. 就绪进程(求职者):万事俱备,只欠CPU。它们已经加载进内存,随时准备开干。

  3. 进程控制块/PCB(身份证):每个进程的档案袋,里面记录了它的优先级、状态、寄存器数据等。没有这个,操作系统根本不认识你是谁。

  4. 调度程序(调度中心):这是整个流程的大脑,它内部包含了三个得力干将:

    • 排队器:负责把人排好队。

    • 分派器:负责挑人上位。

    • 上下文切换器:负责交接工作。


🎬 第一幕:排队!排队!排队!

场景:排队器 & 就绪队列

当你的程序启动时,它还不能马上运行,得先去排队器 那里报到。排队器是个讲究规矩的保安,它会根据一定的策略(比如优先级高低、先来后到),把你塞进就绪队列里。

  • 排队器的工作:它就像一个整理扑克牌的人,把杂乱的进程按照某种规则(算法)理得整整齐齐。

  • 就绪队列:这就是一个等候室。大家在这里嗑瓜子、聊天(其实是处于就绪状态),眼巴巴地盯着CPU的方向。

💡 划重点:在这里,进程虽然"就绪"了,但还没拿到CPU的使用权,就像你在海底捞拿号排队,菜都点好了,但还得等叫号。


🎬 第二幕:谁去坐那个位置?

场景:分派器

这时候,CPU空闲了(或者上一个进程时间片用完了),分派器闪亮登场。

分派器是调度程序里的"执行者"。它会看一眼就绪队列,根据调度算法(比如"短作业优先"或者"时间片轮转"),一把抓出一个幸运儿:"就你了,出来!"

分派器的主要任务

  • 从队列中移除该进程。

  • 决定把这个进程送到CPU上去。


🎬 第三幕:交接仪式(最累的一步)

场景:上下文切换器

这一步是整张图的核心 ,也是最耗费时间的操作------上下文切换

想象一下,CPU是一个正在写作业的学生。

  • 旧进程(前任):正在做数学题,写到一半被老师叫停了。

  • 新进程(现任):刚被分派器选中,准备做英语题。

上下文切换器就是那个收作业又发作业的课代表:

  1. 保存现场 :它必须把"前任"刚才写到第几行、笔拿在左手还是右手(寄存器状态、程序计数器PC值等)全部记录在进程控制块里。不然下次轮到他时,他就不知道写到哪了。

  2. 恢复现场:把"现任"上次留下的作业本摊开,笔递到他手里,告诉他:"接着上次这里继续写"。

⚠️ 注意:这个过程虽然很快,但也是有开销的!如果切换太频繁,CPU光忙着交接工作了,实际干活的时间就少了,这就是所谓的"上下文切换开销"。


🎬 第四幕:下台与轮回

场景:移出运行进程

进程在CPU上爽完之后,会有几种结局:

  1. 时间片到了 :老老实实下来,回到就绪队列尾部重新排队(图左上角的"移出运行进程" -> "就绪进程")。

  2. 等待IO(比如读硬盘) :主动让出CPU,去阻塞队列睡觉,等硬盘读完了再回来排队。

  3. 任务结束:直接"销户",释放资源。


📌 总结一下:一张图看懂流程

  1. 就绪进程 -> 进入排队器 -> 加入就绪队列

  2. 分派器 -> 从队列挑人 -> 触发上下文切换器

  3. 上下文切换器 -> 保存旧的,加载新的(查PCB ) -> 上CPU运行。

  4. CPU -> 运行结束/时间片到 -> 移出 -> 循环往复。

操作系统的调度机制,本质上就是一场精密的资源分配游戏。 它保证了我们每个人感觉电脑在"同时"运行很多程序,虽然实际上CPU是在疯狂地"左右横跳"。

下次你的电脑卡顿的时候,你可以想象一下:可能是上下文切换器 太忙了,或者就绪队列太长啦!


喜欢这篇硬核科普吗?点个赞再走呗!👍

相关推荐
坤坤藤椒牛肉面8 分钟前
C++学习--类和对象
学习
楼田莉子38 分钟前
C++20新特性:Range库
开发语言·c++·后端·学习·c++20
段一凡-华北理工大学1 小时前
工业领域的Hadoop架构学习~系列文章02:HDFS架构深度剖析
大数据·人工智能·hadoop·学习·架构·高炉炼铁
星恒随风1 小时前
C语言数据结构排序算法详解(上):从插入排序、希尔排序到选择排序、堆排序
c语言·数据结构·笔记·学习·排序算法
魔法阵维护师1 小时前
从零开发游戏需要学习的c#模块,第三十章(掉落物品 —— 血包与能量)
学习·游戏·c#
在学了加油1 小时前
Inception v1学习笔记
笔记·python·学习
是一个Bug2 小时前
LangChain 入门完全指南:核心概念、学习路线与实战 Demo
学习·langchain
晓梦林2 小时前
EVA靶场学习笔记
android·笔记·学习
AI算法沐枫2 小时前
基于YOLO26深度学习的【果园荔枝检测与计数】系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
开发语言·人工智能·python·深度学习·qt·学习·机器学习
OBiO20132 小时前
精准靶向心肌细胞的AAV怎么选择?
学习