操作系统那些事儿之CPU和进程调度
一、多级反馈队列调度算法(Multilevel Feedback Queue Scheduling,简称 MLFQ)是一种用于进程调度的算法,主要目的是提高系统效率,合理分配 CPU 时间给不同的进程。
工作原理:
-
多个队列:系统中有多个“就绪队列”,每个队列的优先级不同,队列越高,优先级越高。每个队列可能使用不同的调度策略(比如时间片轮转、先来先服务等)。
-
时间片轮转:进程被分配到不同的队列时,会有一个时间片。如果进程在规定时间内没有完成,它会被移到优先级更低的队列,给其他进程更多机会。
-
动态调整:进程根据其行为动态地在队列之间迁移。例如:
- 如果进程一直使用短时间片(快速运行),它会留在高优先级队列。
- 如果进程运行时间很长,它可能会被移到低优先级队列,这样可以让其他进程更快执行。
简单总结:
多级反馈队列调度算法通过多个优先级队列和动态调整,确保既能快速响应短小的进程,也能合理处理较长的进程。
它的目标是公平地分配 CPU 时间,既避免低优先级进程长时间得不到执行,也避免高优先级进程占用过多时间。
这种调度算法在实际应用中非常常见,尤其是操作系统中。
在设计多级反馈队列调度算法(Multilevel Feedback Queue, MLFQ)时,以下因素都非常关键:
就绪队列的数量(I):不同数量的队列代表不同的优先级等级,是设计的基本参数。
就绪队列的优先级(II):各队列的优先级决定了进程调度的优先顺序。
各就绪队列的调度算法(III):比如高优先级队列使用时间片轮转,低优先级可能使用先来先服务等。
进程在就绪队列间的迁移条件(IV):如进程运行完一个时间片是否下移,是否因响应等待而上升等。
这些都是 MLFQ 调度策略必须要考虑的关键要素
二、分时系统中的时间片轮转调度需要通过以下几个部分来实现:
进程控制块(I):记录每个进程的状态、优先级、CPU 使用时间等信息,是进行调度时必不可少的数据结构。
时钟中断处理程序(II):在时间片到期时,时钟中断会触发,通知操作系统进行进程切换。这是时间片轮转调度中的关键机制。
进程就绪队列(III):用于存储所有准备好接受 CPU 时间的进程,时间片轮转调度在这里进行。调度器会从就绪队列中选择一个进程来运行。
进程阻塞队列(IV):虽然这个队列存储的是当前无法运行的进程(比如等待 I/O 的进程),但在时间片轮转调度中不会直接涉及到。
三、进程调度程序的执行通常由以下事件引起:
中断处理结束(I):当中断处理完成时,操作系统会决定是否进行进程调度,以处理其他中断或切换到其他进程。
进程阻塞(II):进程因等待某些资源(如I/O)而阻塞,操作系统可能会调度另一个进程来使用 CPU。
进程执行结束(III):进程执行完成后,操作系统会执行进程调度,决定是否需要清理资源或切换到其他进程。
进程的时间片用完(IV):在时间片轮转调度中,进程的时间片用完后,操作系统会进行调度,切换到下一个进程。
因此,所有这四个事件都有可能触发进程调度程序的执行
四、在支持分页式存储管理的系统中,进程切换时,操作系统需要进行以下操作:
更新程序计数器的值(I):程序计数器指向进程的下一条指令,进程切换时,需要保存当前程序计数器的值,并在恢复时重新加载。
更新栈基址寄存器的值(II):栈基址寄存器指向进程的栈区域,进程切换时,需要保存当前进程的栈基址,并加载新进程的栈基址。
更新页表基地址寄存器的值(III):在分页系统中,每个进程都有自己的页表,用于虚拟地址到物理地址的映射,进程切换时,需要更新页表基地址寄存器,指向新进程的页表。
因此,进程切换时,操作系统需要执行 I、II 和 III 三项操作
这是一个非常好的问题。我们来用简单直观的方式解释这三个值的作用,它们都是在进程切换时非常关键的系统控制信息。
✅ 1. 程序计数器的值(Program Counter,简称 PC)
- 作用:指向当前正在执行的指令的地址。
- 通俗理解:就像一本书读到哪一页,就在那一页夹上书签。程序计数器就是那个“书签”。
- 为什么要保存/更新:切换到别的进程时,要保存当前进程的“书签”;等它再次运行时,就可以从上次的位置继续执行。
✅ 2. 栈基址寄存器的值(Stack Base Register)
- 作用:指向当前进程的栈的起始位置。
- 通俗理解:每个进程都有自己的“小抽屉”(栈)来临时放东西,比如函数调用参数、局部变量等。栈基址就像写在抽屉上的起始编号。
- 为什么要保存/更新:每个进程的“抽屉”不一样,切换进程时要告诉系统新的抽屉从哪开始。
✅ 3. 页表基地址寄存器的值(Page Table Base Register,简称 PTBR)
- 作用:指向当前进程的页表(页表是虚拟地址到物理地址的映射关系)。
- 通俗理解:就像是每个进程有一张地图,告诉操作系统“我用的地址”实际在“物理内存的哪”。
- 为什么要保存/更新:不同进程的内存映射不同,切换进程时需要切换到该进程自己的那张“地图”。
🔁 总结:
| 寄存器 | 用途 | 举例/比喻 |
|---|---|---|
| 程序计数器(PC) | 记录“执行到哪了” | 类似书签,记住读到哪一页了 |
| 栈基址寄存器 | 指定进程的“临时变量区域” | 每个进程的“抽屉”的起点 |
| 页表基地址寄存器(PTBR) | 管理虚拟地址到物理地址的映射 | 每个进程的“地址转换地图” |
这三项都是进程切换时必须保存/加载的重要信息,缺一不可。

浙公网安备 33010602011771号