Skip to content

调度模拟:规则定出次序,次序定出代价(专题总纲)

Intro

这一类题的题面长得很不一样:一边是四个进程的到达时刻和 CPU 运行时间,一边是一串磁道号和转速;一边问「首次调度发生在哪个时刻」,一边问「读完这 4 个扇区共需要多少时间」。

但拿到手上要做的事只有一件:

调度就是把「谁先谁后」定下来。规则决定次序,次序决定代价。

题面给的那一堆细则(谁抢谁、什么时候能抢、平局怎么办、扫到头往哪拐)全都只做一件事——在每个岔口告诉你下一个该轮到谁。把这些细则一步步执行下去,次序就出来了;次序出来了,题目问的那个数就是在这个次序上数出来的。

所以推演动作是可枚举的,一共五步——2010、2019、2026 这三道都走这五步(2016 那道反着走,下一节单说):

  1. 画一条轴。 CPU 调度的轴是时间,磁盘调度的轴是磁头位置。
  2. 在轴的起点写下「此刻谁可选」——就绪队列,或者 I/O 请求队列。
  3. 按题面给的规则从可选集里挑一个,在轴上落一段,记一笔。
  4. 更新可选集(有人跑完了、有人新到了、有人被踢回来了),回到第 3 步。
  5. 全部挑完,把要的那个量按定义加起来——时间、次数、还是某个时刻。

第 3 步的「规则」是唯一随题变化的东西。它可以是优先级、可以是时间片、可以是离磁头最近,也可以是你自己设计出来的一个公式。

四道题在「规则 → 次序 → 代价」上的四个位置

这条箭头有三节,四道真题分别在不同的位置下手:

年份·题号题面给你的规则让你走到哪一步
2019·44(2)SSTF停在次序——只问访问簇的先后次序,不问耗时
2010·45(2)C-SCAN走完全程——次序排出来,代价是毫秒数
2026·45(1)优先级 + 时间片轮转,外加六条细则走完全程——代价是中断次数、调度次数和四个时刻
2016·46一条会饿死人的规则:priority = nice反着走——从次序的一个坏性质倒推回去改规则

先把「都」这个字拆开逐条对一遍,免得记成一句不成立的话:

  • 2010、2019、2026 这三道要在轴上排出一个实际的次序;
  • 2010、2026 这两道在次序之上还要把代价加出来;
  • 2016 那道不产生任何次序,它问的是「什么样的规则会让某个进程永远排不到队首」,答的是怎么把规则改掉。

所以这个专题真正共有的东西是那条箭头本身,而不是「排次序」这一个动作。2016 那道和另外三道的关系,是同一条箭头的两个方向。

两种资源,同一条轴

CPU 调度和磁盘调度在教材里隔着好几章,卷面上却几乎同构:

CPU 调度(2026·45)磁盘调度(2010·45、2019·44)
轴是什么时间(ms)磁头位置(磁道号 / 柱面号)
可选集就绪队列I/O 请求队列
挑选的依据优先级值、入队先后与当前磁头的距离、当前移动方向
落一段的长度这次占用 CPU 多久这次移动几个磁道
最后加出来的代价次数、时刻磁道数 → 毫秒

两处结构上的差别值得先记住,它们各自对应一个失分点:

其一,请求什么时候进队不一样。 磁盘那两道的请求队列在题面里一次性给全(2010 是 50, 90, 30, 120,2019 是四个簇号),推演途中不会有新请求冒出来。CPU 那道则相反,P3 在 t=12、P4 在 t=14 是推演到一半才到达的,每到一个就要重算一次「此刻谁可选」。

其二,磁盘的代价里有一部分和次序无关。 2010 那道的旋转延迟 4 × 5 = 20 ms、传输时间 4 × 0.1 = 0.4 ms,无论四个请求怎么排都是这两个数——它们只跟「读了几个扇区」有关。次序影响的只有寻道那 170 ms 这一段。先把与次序无关的那两段单独算出来放在一边,再回头排次序,比混在一起算稳得多。

边界必错点

「到达」不等于「可以抢占」(2026 年那道)。 题面规定「仅当发生时钟中断时才触发抢占 CPU 的操作」,而时钟中断每 10 ms 一次。P3 在 t=12 到达、P4 在 t=14 到达,都不是中断时刻,所以它们只入就绪队列、不换 CPU,P2 继续跑到 t=20。把这条漏掉,整条时间轴从 t=12 起就整体偏掉,四个首次调度时刻会连着一起错。

两种「回到就绪队列」的后果不一样(2026 年那道)。 题面给了两条并列的细则:因时间片用完而返回,优先级值减 1;被更高优先级抢占而返回,优先级值保持不变。P2 在 t=20 被 P4 抢走,优先级仍是 4;P4 在 t=70 时间片用完,才从 5 降到 4。每次把一个进程踢回队列时,先问自己是哪一种回法。

平局要看谁先入队,而入队时刻是推演出来的(2026 年那道)。 题面只说「多个进程优先级相同时,先进入就绪队列的进程优先」。t=70 那次 P2 和 P4 都是优先级 4,P2 是 t=20 被抢占时入队的、P4 是 t=70 刚入队,所以选 P2;t=140 那次 P1 和 P3 都是优先级 2,P3 是 t=12 入队的、P1 是 t=140 刚降级入队,所以选 P3。这两个入队时刻题面没有直接给,要从前面的推演里翻出来。

三段时间少一段,总数就对不上(2010 年那道)。 寻道 170 ms、旋转延迟 20 ms、传输 0.4 ms,三段相加才是 190.4 ms。传输那一段是每磁道 100 个扇区里读 1 个,等于 1/100 转 = 0.1 ms,四次共 0.4 ms;按整条磁道算成 10 ms 一次会得到 40 ms。每一问先在草稿边上写「寻道 / 旋转 / 传输」三个字,再往后面填数。

旋转延迟按半转算,判断依据在题面里(2010 年那道)。 题面写着「需读取 1 个随机分布的扇区」,随机分布就取平均值,半转 = 5 ms,四个请求共 20 ms。按最坏情况一整转(10 ms × 4 = 40 ms)会多出 20 ms。

SSTF 比的是柱面距离,不是簇号之差(2019 年那道)。 题面说磁头在「85 号柱面」上,这一个柱面覆盖 85000~85999 整整一千个簇,题面并没有说磁头停在其中哪一个簇上。所以四个请求的簇号必须先各自除以「每柱面 1000 簇」落到柱面号(100、60、101、110),再拿柱面号去和 85 比距离。拿簇号直接做减法就没有起点可减。

符号方向决定分(2016 年那道)。 题面写的是「选择优先数最小的进程运行」,所以跑得越多要让优先数变大、等得越久要让优先数变小cpuTime 前面是加号、waitTime 前面是减号。方向写反,公式的作用就跟着反过来。

一道题的答卷长什么样

2010 年那道的第 (2) 问

这一问 5 分,卷面就是四小段,每段一行结论。中间量全部摆出来——分是按段给的。

① 先把与次序无关的两段算掉

转速 6000 rpm = 100 转/秒  →  每转 10 ms
平均旋转延迟 = 半转 = 5 ms      ← 题面说扇区随机分布,取平均
读 1 个扇区 = 1/100 转 = 0.1 ms  ← 每磁道 100 个扇区

旋转延迟合计 = 4 × 5   = 20 ms
传输时间合计 = 4 × 0.1 = 0.4 ms

② 按 C-SCAN 排出服务次序

磁头在 100 号、沿磁道号增大方向;请求队列 50, 90, 30, 120。

服务次序:100 → 120 → 30 → 50 → 90

③ 累加寻道位移

位移(磁道)
100 → 12020
120 → 30(跳回段,按端点差计)90
30 → 5020
50 → 9040
合计170

⚠️ 跳回那一段在本题标答里是计距离的,四段合计 170 磁道。把它当成免费的传送门,总数就下来了。

④ 三段相加

寻道时间 = 170 × 1 ms = 170 ms
总时间   = 170 + 20 + 0.4 = 190.4 ms

写到 190.4 ms 为止,这一问就完了。190 ms 和 190.4 ms 是两个答案,那 0.4 就是传输段。

2026 年那道的第 (1) 问

这一问的卷面主体是一张推演表。逐行写,每一行只回答「这个时刻谁上 CPU、为什么」,写完表答案就在表里。

t=10   P1(prio 3)、P2(prio 4) 到达,CPU 空闲   → 调度 P2      [调度①]
t=12   P3(prio 2) 到达 —— 非中断时刻,只入队,P2 继续跑
t=14   P4(prio 5) 到达 —— 非中断时刻,只入队,P2 继续跑
t=20   中断:P4 优先级 5 最高 → 抢占 P2       → 调度 P4      [调度②]
       P2 是「被抢占」回队,优先级仍为 4,还剩 10 ms
t=70   中断:P4 连跑 50 ms,时间片用完,5→4
       就绪队列里 P2、P4 同为 4,P2 于 t=20 入队更早 → 调度 P2  [调度③]
t=80   中断:P2 跑满 10+10=20 ms,完成
       就绪队列剩 P1(3)、P3(2)、P4(4)         → 调度 P4      [调度④]
t=90   中断:P4 跑满 50+10=60 ms,完成
       就绪队列剩 P1(3)、P3(2)                → 调度 P1      [调度⑤]
t=140  中断:P1 连跑 50 ms,时间片用完,3→2
       P1、P3 同为 2,P3 于 t=12 入队更早      → 调度 P3      [调度⑥]
t=180  中断:P3 跑满 40 ms,完成               → 调度 P1      [调度⑦]
t=225  P1 跑完剩下的 45 ms,全部结束

三个答案直接从表里读:

时钟中断次数 = 10、20、…、220,共 22 次      ← 末次中断在 220,P1 于 225 结束
CPU 调度次数 = 10、20、70、80、90、140、180,共 7 次
首次调度时刻 = P1: 90   P2: 10   P3: 140   P4: 20

⚠️ 首次调度时刻和到达时刻是两件事。 P3 在 t=12 就进了就绪队列,第一次拿到 CPU 却是 t=140,中间隔了 128 ms。这四个数写的是「第一次占上 CPU 的时刻」。

反着走的那道题,卷面长什么样

2016 年那道不产生任何次序,它给你一个坏结果、让你改规则。全题 6 分,是本专题 唯一一道要写文字论述的,分是按「公式里的每一项」分开给的

(1) 为什么会饥饿(2 分)——要说清机制,不能只答「会」:

priority = nice 时优先数是静态的、执行期间永不变化
只要系统里持续有 nice 更小的进程到达,nice 大的那个就永远排不到 CPU

⚠️ 饥饿不是死锁:死锁是互相等对方的资源、谁也走不了;饥饿是这个进程一直没轮上, 系统其余部分照常推进。混着答会被扣。

(2) 设计动态优先数(4 分)——公式要含三项,每项 1 分,符号方向错就不给:

priority = nice + k₁ · cpuTime − k₂ · waitTime      (k₁, k₂ > 0)

nice      保留静态基准,题面要求用上它
cpuTime   跑得越多优先数越大 → 越不优先(所以是加号)
waitTime  等得越久优先数越小 → 越优先(所以是减号)

还要单独答一句 waitTime 的作用(1 分):它补偿长期等待的进程,等得越久越优先, 这样任何进程等下去总会被调度到,饥饿就被消掉了。这一句是题面点名要的,别以为写完公式就完了。

真题的两种形态

第一组 · 在时间轴上推演(2016-46、2026-45)。 可选集是就绪队列,途中会有新进程到达。2026 那道是完整的推演题,题面把六条细则写得很细,照着一条条执行就行;2016 那道是这一组的反面——题面给的规则会让低优先级进程永远排不上号,让你把规则改成动态的(保留 nice 作基准、+k₁·cpuTime 惩罚长跑、−k₂·waitTime 补偿久等),并说明 waitTime 起什么作用。这道题的分是按公式里的三项分别给的,三项都要写出来,还要单独说一句 waitTime 的作用。

第二组 · 在磁头位置轴上推演(2010-45、2019-44)。 可选集在题面里一次性给全。2010 那道给 C-SCAN 让你排次序并把三段时间加出来,第 (3) 问再换一种硬件——Flash 没有磁臂移动、没有旋转等待,按磁道排序这件事本身就失去了意义,所以答 FCFS(或 NOOP)这种不排序的策略。2019 那道只让你排出 SSTF 的访问次序,不问耗时。

哪几问是外挂

这 4 道题合计 27 分,其中 6 分不在本专题的动作范围内——它们是别的章节挂在同一道题的骨架上,各自独立给分:

外挂的小问手上做的动作分值归属
2019·44 (1) 磁盘容量是多少柱面数 × 磁道数 × 扇区数 × 扇区大小,一次乘法2磁盘几何参数
2019·44 (3) 第 100530 簇的物理地址、由什么程序完成逐层带余除法取商与余数;外加一问 I/O 软件分层3文件系统与磁盘布局 / I/O 软件层次
2010·45 (1) 如何管理磁盘块空闲状态由「2 KB 内存对 16384 个块」反推出每块 1 位1文件系统的空闲空间管理

就看「手上做什么」:把簇号 100530 拆成柱面 100、磁道 5、扇区 60,做的是除法取商余,和「决定谁先谁后」没有关系;它和文件系统那边把字节偏移拆成逻辑块号是同一个动作。这几问不该硬收进调度,把它们算在本专题里只会让统一还原变得什么都能装。

反过来说,2019·44 (2) 那一问用的几何参数(每柱面 1000 簇 = 10 × 200 ÷ 2)直接来自题干前言,并不需要先做出 (1)——这恰恰是 (1) 能独立摘出去的最好证据;但下笔的动作不同,复习时该分开练

交卷前扫一眼

先画轴、再列可选集 · 与次序无关的代价(旋转、传输)先单独算掉 · 「到达」不等于「能抢占」 · 时间片用完才降优先级、被抢占不降 · 平局看谁先入队 · 磁盘比的是柱面距离

配套内容

考纲要求、但这 4 道真题没有正面考过的(专题的巩固栏里配了题):

  • 平均周转时间、平均等待时间、带权周转时间这三个指标——大纲列了「调度的目标」,而这 4 道真题一次都没让算过它们。2026 那道要的是中断次数、调度次数和四个时刻;2016 那道题面里确实出现了 waitTime,但那是喂给优先数公式的一个计数器,不是让你算出来的指标
  • FCFS、SJF、高响应比优先这三种 CPU 调度算法——4 道真题里正面出现过的挑选规则只有优先级加时间片轮转(2026)、C-SCAN(2010)、SSTF(2019)。2010 那道第 (3) 问的答案里出现过 FCFS,但那是「在 SSD 上不必排序」的意思,没有让你按 FCFS 排一次次序再算代价
  • 抢占式与非抢占式的直接对照——大纲把「调度的时机与调度方式(抢占式/非抢占式)」写在了「调度的实现」下面。2026 那道全程是抢占式的,没有让同一组参数换成非抢占再推一遍、比一比差多少
  • 调度的三个层级,以及调度程序在什么时机被调用——2026 那道把时机限定成「仅当发生时钟中断时」,省掉了判断这一步;至于还有哪些事件会触发调度、哪些时刻反而不能调度(比如正在内核临界区里),真题没问过
  • SCAN 与 LOOK——磁盘那两道正面用到的算法只有 C-SCAN 和 SSTF。SCAN 走不走到端点、LOOK 与 SCAN 差在哪一段空跑,没考过
  • 扇区的交替编号(交叉因子)——大纲「磁盘」条目下写着「格式化」。一条磁道上的扇区为什么不按 0、1、2 顺序编号、交叉因子该取多少才配得上控制器的传送时间,没考过
  • 同一条磁道上记录的间隔排布——读一条、处理一条时,记录紧贴着放会导致每读完一条就错过下一条的开头、要空转近一整圈;怎么摆才能不空转,没考过
  • 固态硬盘的读写性能特性与磨损均衡——大纲单列了「固态硬盘」。2010 那道第 (3) 问只让你答 SSD 上该换什么调度策略,读写不对称、擦除以块为单位、磨损均衡这些没问过(暂无配套巩固题)
  • 多处理机调度——大纲明列的一条,4 道真题里一次都没出现(暂无配套巩固题)
  • 上下文及其切换机制——2026 那道第 (2) 问只让判断「中断间隔从 10 ms 缩到 1 ms,系统开销增大」,至于一次切换到底要保存和恢复哪些东西、这个开销由什么构成,没问过(暂无配套巩固题)

逐题精讲(建设中)——真题作答与 AI 判分入口见站内大题专题

真题练习