目录
什么是进程调度( Process Scheduling)?
为什么需要进程调度?
进程调度在什么时候发生?
什么是调度队列(Scheduling Queues)?
Job Queue:系统中所有进程的集合
Ready Queue:等待使用CPU的进程集合
Ready Queue 和 Job Queue 的关系
当进程进入就绪队列之后,会发生什么?
① 被调度器选中
② 开始执行(Running)
什么是进程调度( Process Scheduling)?
进程调度,顾名思义,就是操作系统选择“哪个进程”来使用CPU执行的过程。
进程调度是操作系统的一个机制,它负责:
从一堆“已经准备好运行”的程序(我们叫它们“进程”)中,
选出一个来使用 CPU
然后在合适的时候,换成另一个进程。
这样不断轮换,用户就感觉所有程序都在同时运行,系统的效率也能更高。操作系统在背后“安排顺序”的这个安排过程,就叫做 进程调度(Process Scheduling)。
🎬 打个比方:电视遥控器只有一个人能用
想象你和几个朋友一起看电视,但电视遥控器只有一只,谁拿着谁就能切台。你们约定每个人轮流用一小段时间,比如30秒。这样每个人虽然都在等待,但由于轮流很快,大家都感觉自己在“参与”。
在计算机中,程序也像这些人,CPU 就像遥控器。程序们都想“拿到遥控器”,也就是获得 CPU 的使用权来继续运行。但同一时间只有一个程序能被执行,所以操作系统就像一个“轮流管理”的裁判,安排谁先谁后。这个安排过程,就是进程调度。
所以说,进程调度就是操作系统决定“哪个程序来用 CPU”的方法。因为 CPU 不能同时运行多个程序,操作系统必须安排进程轮流执行,以便提高效率、响应迅速。
为什么需要进程调度?
1. 最大化 CPU 利用率(Multiprogramming 的目标)
我们希望CPU永远不要闲着。
在早期的计算机里,如果一个程序在“等输入”(比如等你敲键盘),CPU 就在那里发呆,很浪费。
有了“多道程序设计(Multiprogramming)”后,操作系统可以“在一个程序等输入的时候,让另一个程序继续用CPU”,这样就不浪费了!
为了实现这个目标,操作系统必须:
找到一个“准备就绪”的进程,让它来使用CPU —— 这就是进程调度的任务。
2. 让每个用户都觉得电脑在响应他(Time Sharing 的目标)
现代计算机是多人或多任务共享的。例如:
你在打开网页的同时在听音乐;
操作系统需要在你“播放音乐”与“加载网页”之间快速切换;
这样你就觉得“两个事情都在同时进行”。
这叫分时系统(Time Sharing)。它的目标是:
快速在多个进程间切换CPU使用权,让每个进程“看起来像是一直在运行”。
实现这种效果也要靠进程调度:
它必须在不同进程之间切换CPU,不能让某一个进程霸占太久;
这通常还要配合一个叫“时间片”的概念。
详细内容可以参考:操作系统:操作系统结构(Operating System Structure)-CSDN博客
进程调度在什么时候发生?
进程调度并不是随时都发生,而是在某些关键时刻才会触发,比如:
当前进程完成任务,主动释放 CPU;
当前进程被强行中断(比如超过时间片);
有个更高优先级的进程突然出现;
当前进程进入等待状态(比如等硬盘数据);
系统启动时选第一个要运行的进程。
每次发生这些“事件”,操作系统就会开始“挑人干活” —— 这就是调度过程。
现在你已经知道操作系统会在多个等待中的程序之间选择一个来执行(这就是调度),那这些等待的程序到底是放在哪里的?操作系统怎么“知道”谁在等着用 CPU 呢?这就引出了下面的内容:
什么是调度队列(Scheduling Queues)?
在操作系统中,程序在运行过程中并不是一开始就直接被CPU执行,而是会根据它们所处的状态,被放入不同的“队列”中。操作系统正是通过这些队列来管理和调度进程,也就是组织这些程序“什么时候运行”、“是否可以运行”以及“需要等哪些资源”。
这些队列统称为 调度队列(Scheduling Queues)。最核心的几种队列是:
Job Queue
Ready Queue
所以说,调度队列就是操作系统为了“安排程序执行顺序”,用来分类和管理不同状态下程序的“排队列表”。
Job Queue:系统中所有进程的集合
当一个程序被启动(例如你打开一个软件),它会被操作系统转化成一个进程。这个进程最初进入系统时,就会被加入到一个叫做“作业队列(Job Queue)”的结构中。
这是进程最开始进入系统时排的第一队。这个队列的特点是:
它包含了当前操作系统所“知道”的所有进程;
不论进程是否已经加载进内存,是否正在运行,或是在等待某些资源,只要它被创建了,它就会被登记在这里;
Job Queue 更像是一个全局登记表,记录系统中所有活动的进程。
作业队列中的进程不一定马上运行,它们只是“在系统中存在了”。
在系统负载很高的时候,操作系统可能会对Job Queue中的进程进行“高层调度”,决定是否允许它们进入后续的调度阶段(如内存调度、CPU调度等)。这在大型或批处理系统中尤为重要。
Ready Queue:等待使用CPU的进程集合
接下来,某些进程已经获得了它们运行所需要的资源(比如已经被加载进主存RAM),并且没有被阻塞——也就是说,它们已经准备好可以被CPU执行了。
也就是说:
它需要的资源都已准备好(例如已经加载进内存);
它没有在等待其他东西(比如不在等待硬盘或网络);
这类进程就会被放入“就绪队列(Ready Queue)”,是进程进入“真正开始排队用 CPU”的地方。
Ready Queue 是调度队列中非常关键的一部分,因为:
它是调度器挑选“下一个运行的进程”的来源;
所有在 Ready Queue 中的进程都是“就绪状态”;
它们都处于主存中,随时可以被分配CPU资源;
它们不在等待I/O、信号等外部事件,仅仅是在等CPU的空闲;
系统的CPU调度器只从 Ready Queue 中选择进程进行上下文切换。
Ready Queue 的结构通常是一个队列(FIFO)或优先队列,具体结构和调度算法有关。
Ready Queue 和 Job Queue 的关系
你可以理解为:
Job Queue 是“大集合”,包含所有创建出来的进程;
Ready Queue 是“子集合”,只包含那些已经准备好、等待被CPU执行的进程。
当一个进程刚刚被创建,它被放入 Job Queue; 当它准备好运行,它被加载进主存,转移到 Ready Queue; 调度器会从 Ready Queue 中选一个进程执行。
当进程进入就绪队列之后,会发生什么?
当一个程序被创建(比如你打开一个应用),它成为一个进程,进入 Job Queue; 之后,等它准备好运行,就会被调入内存,进入 Ready Queue(就绪队列),等待 CPU 的分配。
现在重点是:当一个进程处于就绪队列时,接下来它会被怎么处理?怎么运行?什么时候暂停?什么时候重新回来?
① 被调度器选中
在 Ready Queue 中,进程只是“等待被执行”。真正让它开始运行的,是调度器(CPU scheduler)。
调度器会定期检查 Ready Queue;
根据调度算法(如先来先服务、时间片轮转等),选中一个进程;
然后把这个进程“从就绪状态切换到运行状态”;
这个过程涉及一次上下文切换(context switch):操作系统保存当前正在运行进程的状态,加载新选中进程的状态。
② 开始执行(Running)
现在,这个进程被分配到了 CPU,它正式运行,状态变为:Running(运行中)
此时它可以执行它的指令,处理数据,计算、判断、调用函数等。
但是,它不一定能“一口气跑完”,因为可能会遇到以下三种情况:
A. 主动完成:进程执行完毕 → Terminated(终止)
进程顺利完成任务,例如程序运行结束、退出;
操作系统会释放它占用的资源,将其从系统中移除;
此时它离开了所有调度队列。
B. 被阻塞:等待I/O、资源或事件 → Waiting(等待)
程序运行到某个点,需要等待用户输入、硬盘数据、网络响应等;
它不能再继续运行,于是进入 Waiting Queue;
直到所等待的事件完成,它才会重新进入 Ready Queue,等待再次调度。
C. 被打断:时间片用完或被抢占 → 回到 Ready Queue
在分时系统中,为了公平,每个进程只能用CPU一小段时间(时间片);
如果一个进程时间片用完还没做完,操作系统就会强制暂停它;
它的状态会从 Running 回到 Ready Queue,等待下一次被选中。
在抢占式调度中,调度器不仅仅依靠时间片来判断是否切换进程,还会在以下情况下“中断当前进程”:
一个优先级更高的进程突然就绪(例如来自I/O中断、系统唤醒);
系统策略判断另一个进程“更紧急”或“更需要运行”。
此时:
当前正在执行的进程会被操作系统强行中断;
它的上下文会被保存;
它的状态会被恢复为就绪状态(Ready);
并重新加入 Ready Queue,等待下次调度。
这个过程叫做 抢占(Preemption) 或 进程被换出(Preempted),是现代多任务系统中非常关键的调度机制,确保系统响应更及时、更公平。
状态转移图
+----------------------+
| New / Created |
+----------+----------+
|
v
+---------+---------+
| Job Queue |
+---------+---------+
|
v
+---------+---------+
| Ready Queue |<------------+
+---------+---------+ |
| |
v |
+-----+-----+ |
| Running | |
+-----+-----+ |
| | | |
+----+ | +----------+ |
| | | |
v v v |
Terminated Waiting Queue Ready Queue (抢占后回来)