进程调度与状态转换

调度与概念论述题的固定动作:先把题干抄成一条时刻线,再逐时刻答「谁在运行、进程什么态、CPU 什么态」。

以这一支为主线的综合题有三道:2016#46(动态优先数与饥饿)、2026#45(优先级 + 时间片轮转的时刻线)、2023#46(一次系统调用里的状态与分层)。另外 2025#46 的进程虚拟地址空间、2024#46 的临界区概念、2021#45 的特权指令、2017#452018#45 里的状态变化和切换小问也都落在这一支上。

它是操作系统里唯一不给公式的一支:答案全是时刻、状态名和一句理由,所以口径比计算更值分。

知识框架概要

一、题目未引入挂起态时,采用五状态模型,边是固定的

新建 → 就绪 ⇄ 运行 → 终止
        ↑      ↓
        └── 阻塞

三条边的触发条件写死:运行 → 就绪是被抢占或时间片用完,运行 → 阻塞是自己等资源或等 I/O,阻塞 → 就绪是等的事情发生了。「阻塞 → 运行」和「就绪 → 阻塞」两条边不存在——阻塞的进程醒来只能先回就绪队列。见 进程的状态状态转化

二、调度算法按「比什么、能不能抢」两列记

算法比什么抢占
先来先服务到达时刻先来先服务
短作业优先要求运行时间有抢占式变体最短作业优先
高响应比优先(等待 + 运行) ÷ 运行最高响应比优先
优先级优先级值(题目会交代大小方向)两种都有优先级调度
时间片轮转只按队列排队时间片到就换时间片轮转
多级反馈队列队列层号 + 各层时间片多级反馈队列

指标只有三句:周转时间 = 完成 − 到达带权周转 = 周转 ÷ 运行等待时间 = 周转 − 运行,见 调度指标

三、抢占只发生在几个固定时刻

时钟中断、更高优先级进程进入就绪队列、当前进程阻塞或结束。题目说「仅在时钟中断时抢占」,就要把所有换人动作对齐到中断时刻,见 调度时机调度方式上下文切换

四、进内核只有三条路

系统调用(自愿陷入)、外部中断、内部异常。特权指令(开关中断、置 PSW、直接访问 I/O)用户态一律不能执行,见 CPU 运行模式系统调用异常

五、一次「读键盘」的系统调用是一条固定链

用户进程发起系统调用 → 陷入内核 → 设备未就绪:置阻塞态、插入阻塞队列
→ 切换到其他进程 → 用户敲键 → 键盘中断 → 驱动程序把字符搬进系统缓冲区
→ 唤醒该进程、插入就绪队列 → 被调度后从系统调用返回

哪一步归哪一层,见 中断处理流程I/O 软件层次

解题注意点

前两条只在给了到达时刻和运行时间的调度题上用,后三条按问法挑一条用。

先把题干抄成一条时刻线

不要画甘特图,画一列「时刻 → 发生了什么 → 谁拿到 CPU」。2026#45 的参考答案就是这种写法,八行写完全程:

10  P1、P2 到达,CPU 空闲          → 调度 P2(首次)
20  时钟中断,P4 优先级更高        → 抢占,调度 P4(首次)
70  时钟中断,P4 时间片用完,优先级 −1 → 调度 P2
80  时钟中断,P2 完成              → 调度 P4
90  时钟中断,P4 完成              → 调度 P1(首次)
140 时钟中断,P1 时间片用完,优先级 −1 → 调度 P3(首次)
180 时钟中断,P3 完成              → 调度 P1
225 P1 完成,全部结束

每一行只写三样东西:时刻、事件、换给谁。「时间片用完」和「被抢占」要分开标注——这一年前者优先级减 1,后者不变,标错一行后面全错。

次数分开数,不要一起数

  • 时钟中断次数按间隔从头数到尾:10、20、…、220,共 22 次;
  • CPU 调度次数只数时刻线上「换人」的那几行:7 次;
  • 首次调度时刻回到时刻线上找每个进程第一次被标「首次」的那一行。

三个数各来自时刻线的不同一列,混着数必错。

优先数公式题按「静态 + 惩罚 − 补偿」写

priority = nice + k1 × cpuTime − k2 × waitTime   (k1 > 0, k2 > 0)

写完必须补一句每一项的作用,因为分是按项给的。2016#46 的【评分说明】写明:公式含 nice 给 1 分、用 cpuTime 增大优先数给 1 分、用 waitTime 减小优先数给 1 分;只要三个量都用上,其他合理公式同样给分。

饥饿的理由也是固定一句:静态优先数下,只要就绪队列里总有优先级更高的进程,另一个就一直得不到 CPU。注意先看题目说的是「优先数小者优先」还是「优先级大者优先」,2016#46 是前者。

排序与状态题,一问一句

2023#46 的四问是这类题的完整样本,答法各自固定:

问法固定答法
某操作的前一个 / 后一个是谁套第五条那条链,逐步对号
之后 CPU 一定切换到别的进程「插入阻塞队列」之后
之后调度程序才可能选中它「插入就绪队列」之后
某操作的代码属于哪一层与具体设备寄存器打交道的那一步归设备驱动程序
中断处理程序执行时,进程和 CPU 各是什么态进程阻塞态、CPU内核态,两个态分别回答

问「进程处于什么状态」时答的是发起系统调用的那个进程,不是正在运行的那个;问「CPU 处于什么态」时答的是特权级,两者不要混成一句。

参数变化题只答方向和理由

时间片变大 → 因时间片用完而让出 CPU 的次数减少 → 调度次数减少;时钟中断间隔变小 → 中断与切换更频繁 → 系统开销增大2026#45 第 2 问)。答案只要「方向 + 一句因果」,不需要重新算一遍时刻线。

历年题索引

三道题各是一种问法,下面这张表用来查「这一年的口径」。

真题主线这一年特别问了什么
2016#46动态优先数设计静态优先数为何饥饿;waitTime 起什么作用
2023#46系统调用全过程排序哪一步之后必然切换;哪一步属于键盘驱动程序
2026#45优先级 + 时间片轮转中断与调度各几次;四个进程的首次调度时刻

另有四处小问挂在这一支上:2025#46 问 PCB 在内核区、scanf 时进程处于阻塞态;2017#45scanf 期间的状态变化;2018#45 问进程切换与同进程内线程切换时页目录基址寄存器是否变化;2021#45 问用户程序能否执行开关中断。

易错清单

  • 画出「阻塞 → 运行」的边。醒来的进程只能先回就绪队列,2023#46 第 2 问考的正是这一点。
  • 抢占没有对齐到时钟中断。题目限定只在中断时抢占,就不能在进程到达的那一刻换人(2026#45)。
  • 「时间片用完」与「被抢占」按同一种后果处理。两者对优先级的影响可以不同。
  • 中断次数和调度次数一起数。一次中断不一定引起一次调度。
  • 优先数公式只写式子不写作用。分是按项给的,少一句 waitTime 的说明就少 1 分(2016#46)。
  • 搞错优先数的大小方向。「优先数最小者先运行」和「优先级值最大者先运行」是两套题面。
  • 把驱动程序的活说成中断处理程序或用户程序。读设备寄存器那一步归驱动程序(2023#46)。

上一页:进程同步与信号量;下一页:文件系统与磁盘