操作系统 · 2027 考研计算机 408

第 5 章 输入输出管理(I/O 管理)

目标院校:四川大学 / 电子科技大学 | 建议用时:概念 3 小时 + 例题练习 4 小时

本章地位:I/O 管理是操作系统「对外服务的窗口」,408 每年稳定考 2~4 分:选择题覆盖层次归属判断、缓冲计算、SPOOLing 概念,大题最爱考磁盘调度序列 + 平均寻道长度与读一块磁盘数据的时间。本章与组成原理的 I/O 章遥相呼应:组成原理讲「控制器硬件怎么做」,操作系统讲「软件怎么分层管理」。三根主线:① 分层——某功能属于哪一层(高频选择);② 缓冲——单/双缓冲公式 max(C,T)+M 与 max(C+M,T) 必算;③ 磁盘——调度算法画走线图、时间三段式分解。所有数值结论都代具体数字验证过。

5.1 I/O 管理概述

I/O 管理的任务I/O 管理负责完成用户进程与 I/O 设备之间的数据传输,并隐藏设备差异、提高设备利用率。基本任务包括:监视设备状态、进行设备分配与回收、完成 I/O 操作、缓冲管理与地址转换。管理目标:设备独立性(用户程序与具体物理设备无关)、统一命名(设备统一编址,像文件一样使用)、高效与方便。

5.1.1 I/O 设备的分类

三个分类维度
  1. 按信息交换单位:块设备——以数据块为单位存取、可寻址、传输快,典型如磁盘,常用 DMA 方式;字符设备——以字节为单位、不可寻址、传输慢,常采用中断方式,典型如键盘、打印机、鼠标。
  2. 按传输速率:低速设备(键盘、鼠标,每秒几个字节)、中速设备(打印机)、高速设备(磁盘、网卡)。
  3. 按共享属性:独占设备——一段时间内只能被一个进程使用(打印机、终端);共享设备——可被多个进程交替使用(磁盘);虚拟设备——通过 SPOOLing 技术把独占设备改造成的、逻辑上可共享的设备。
一句话记忆磁盘=块设备+共享设备+DMA+可寻址;打印机=字符设备+独占设备;装上 SPOOLing 的打印机=虚拟设备。分类维度彼此独立,一台设备可同时属于多个类别。

5.1.2 I/O 子系统层次结构

四层软件 + 硬件I/O 软件自上而下分为用户层 I/O 软件 → 设备独立性软件(设备无关软件)→ 设备驱动程序 → 中断处理程序,最下面是设备控制器与设备(硬件)。分层思想:把「与硬件相关的部分」压到最底层,上层只看到统一接口;上下层之间通过I/O 请求(向下)与中断/应答(向上)通信。
I/O 请求(自上而下) 中断 / 应答(自下而上) ① 用户层 I/O 软件 库函数 printf / fopen · SPOOLing 假脱机 · 把请求包装成系统调用 ② 设备独立性软件(设备无关软件) 设备命名与保护 · 缓冲管理 · 设备分配 · 逻辑设备名→物理设备名 ③ 设备驱动程序(每类设备一个) 把抽象 I/O 命令翻译成控制器命令 · 设置控制器寄存器 ④ 中断处理程序(最底层软件) 响应 I/O 完成中断 · 保存 / 恢复现场 · 唤醒等待 I/O 的进程 ⑤ 硬件:设备控制器 + I/O 设备 控制器接收命令、控制数据传送,完成后向 CPU 发中断信号
图 5-1 I/O 子系统层次结构:左链路「I/O 请求」自上而下逐层翻译,右链路「中断」自下而上逐层回报——判断某功能属于哪一层是高频选择题(详见例 1)
易错① SPOOLing(假脱机)在用户层实现,不要想当然归入设备独立性软件;
② 缓冲管理、设备分配、逻辑设备名→物理设备名映射、设备保护、统一命名都属于设备独立性软件;
③ 与硬件直接打交道的最底层「软件」是中断处理程序,驱动程序在其上(负责「翻译命令」,中断处理程序负责「善后」);
④ 「向控制器寄存器写入参数」=驱动程序;「I/O 完成后保存/恢复现场、唤醒进程」=中断处理程序。

5.1.3 设备独立性 · I/O 调度 · 设备保护

设备独立性用户程序使用逻辑设备名(如「打印机」)而不是物理设备名(如「1 号打印机」)请求设备;系统在分配时才把逻辑设备名映射到某个空闲的物理设备。好处:设备更换/故障时用户程序不必修改,且便于均衡负载。物理设备名→逻辑设备名的映射由设备独立性软件(借助逻辑设备表 LUT)完成。
I/O 调度与设备保护I/O 调度:当多个 I/O 请求到达同一设备时,系统确定一个合理的执行顺序(如磁盘调度),目标是平均响应时间小、吞吐量高、公平。设备保护:设备被纳入统一编址(内存映射 I/O / 设备作为「特殊文件」),用户不能直接操作物理设备,必须通过系统调用进入内核——防止用户程序越权破坏设备。
例 1 高频考点 层次归属判断

下列 I/O 功能中,属于设备驱动程序职责的是( )
A. 将「读 3 号磁盘第 100 块」的抽象命令翻译为对特定控制器寄存器的读写
B. 为到来的读请求分配一个空闲缓冲区
C. 将用户程序中的逻辑设备名映射为某台物理设备
D. I/O 完成后保存现场并唤醒等待的进程

查看解答

A。「翻译命令、设置控制器寄存器」正是驱动程序(③ 层)的标志性工作。

B 错:缓冲管理属于设备独立性软件(② 层)的公共操作;

C 错:逻辑设备名→物理设备名的映射也属于设备独立性软件;

D 错:响应中断、保存/恢复现场、唤醒进程属于中断处理程序(④ 层)。

套路总结:抓住每层「标志性动作」——用户层=库函数/SPOOLing;独立性层=命名/保护/缓冲/分配;驱动层=翻译命令写寄存器;中断层=现场善后。

练习 1 易错

判断正误:(1) 磁盘是典型的字符设备;(2) 打印机属于独占设备;(3) 经 SPOOLing 技术改造后,打印机可当作共享设备(虚拟设备)使用;(4) 块设备可寻址,通常采用 DMA 方式传输。

查看答案

(1) 错:磁盘以「块」为交换单位且可寻址,是块设备;键盘/打印机才是字符设备。

(2) 对:一段时间内只允许一个进程使用。

(3) 对:SPOOLing 用输入井/输出井把独占设备改造成虚拟(共享)设备。

(4) 对:块设备传输快、数据成块,适合 DMA;字符设备多用中断方式。

5.2 I/O 控制方式 高频考点

「CPU 如何知道设备忙/闲、数据何时就绪」决定了控制方式的演化方向:程序直接控制 → 中断驱动 → DMA。演化的主线只有一条——让 CPU 越来越少地干预数据传送。这一节与组成原理的 I/O 章完全呼应,OS 视角重点考「CPU 的干预粒度」。

程序直接控制(程序查询 / 轮询)

过程CPU 向控制器发命令后,不断读取状态寄存器并测试(忙等待);设备就绪后 CPU 亲自把数据从控制器的数据缓冲寄存器一个字一个字地搬进内存。CPU 与设备串行工作,传输单位:一个字。
// 程序查询方式伪码:CPU 全程盯梢
while (status != DEVICE_READY)   // 反复读状态寄存器,忙等
    ;                             // CPU 空转,什么正事都干不了
data = read_data_register();      // 就绪后 CPU 亲自搬一个字
mem[i] = data;

中断驱动方式

过程CPU 发出启动命令后转去执行其他程序;控制器每传完一个字,通过中断请求线向 CPU 发中断信号;CPU 暂停现行程序、保存现场,转中断处理程序搬走数据,再恢复现场继续。CPU 与设备并行,但每传一个字仍要中断一次。

DMA 方式(直接存储器存取)

过程在控制器中增设 DMA 控制器。CPU 只在传输前「启动物理设备、给出内存起始地址与字节数」,之后整块数据在 DMA 控制器操纵下直接与内存交换,不经过 CPU;整块传完后才向 CPU 发一次结束中断。传输单位:一个数据块。
方式传输单位CPU 干预时机CPU 与设备并行性数据流向
程序查询一个字传送前+传送后全程轮询完全串行(忙等)设备→控制器寄存器→CPU→内存
中断驱动一个字每传完一个字中断一次并行(字间 CPU 可干别的)设备→控制器寄存器→CPU→内存
DMA一个数据块仅初始化一次+整块结束中断一次高度并行设备→控制器→直接进内存
一句话记忆干预粒度:查询「每个字都要盯」→ 中断「每个字报一次」→ DMA「每块报一次」。凡出现「数据不经过 CPU 直接进内存」「一块只中断一次」,立刻锁定 DMA。
易错① 中断方式下 CPU 在每个字传送完成后被中断,不是每块;DMA 是一块完成后中断一次;
② 中断方式需要保存/恢复现场,若设备速度很高(如磁盘),中断开销会淹没收益——这正是磁盘采用 DMA 的原因;
③ DMA 期间 CPU 与 DMA 控制器可能争用内存(周期挪用/窃取),此细节属组成原理,但「DMA 减轻了 CPU 负担」是两科通用结论。
例 2 真题风格 中断与 DMA 对比

某设备以中断方式输入数据时,每传完一个字节(字)就向 CPU 发一次中断;改为 DMA 方式后,下列说法正确的是( )
A. 每传完一个字节仍需中断一次,但 CPU 无需搬运数据
B. 整块数据传送完毕后才向 CPU 发一次中断,且数据直接写入内存
C. CPU 在整个传送过程中必须连续查询设备状态
D. DMA 方式下设备只能与 CPU 串行工作

查看解答

B。DMA 的两个标志:① 数据在 DMA 控制器控制下直接与内存交换(不经过 CPU);② 一块数据传送完才发一次中断。CPU 只负责启动前设置参数(内存地址、字节数)和结束后的善后。

A 错:每字一次中断是中断驱动方式;C 是程序查询方式;D 显然反了——DMA 的意义正是让 CPU 与设备并行。

数值感受:传 4KB 的块共 4096 字节,中断方式要 4096 次中断;DMA 只需 1 次——中断次数降为原来的 1/4096。

练习 2

某低速字符设备每次传送 1 字节。分别采用程序查询与中断驱动方式完成 100 字节的输入,CPU 至少被「拖住」多少次?

查看答案

程序查询:CPU 从发出命令到 100 字节全部到齐,全程陷入忙等,相当于被拖住 1 次但时长覆盖整个传送过程(最差);

中断驱动:每字节到齐中断一次,共 100 次短暂介入,字间 CPU 可运行其他程序;

可见「拖住次数」:查询 1 次超长 ≥ 中断 100 次极短;若高速块设备改用 DMA,100 字节(不足一块)只需 1 次结束中断——设备越快,越应减少干预频度。

5.3 缓冲区管理 高频考点

为什么需要缓冲缓冲区是协调数据生产者与消费者速度不匹配的存储区域,作用:① 缓和 CPU 与设备速度矛盾;② 减少中断频率(数据攒成块再处理);③ 解决数据粒度不匹配(如设备一次产出 1 字节、进程按块消费);④ 提高 CPU 与设备并行性。
易错:缓冲区 vs cache缓冲区解决「速度匹配」——在生产者与消费者之间暂存数据,属于操作系统 I/O 管理的机制;cache 解决「访问速度」——用更快的存储层缓存「还会被再次访问」的数据,利用的是局部性原理。缓冲区缓解的是设备与 CPU 的速度差距,cache 缓解的是两层存储器的速度差距,两者目的、层次都不同。

5.3.1 单缓冲与双缓冲:公式推导

约定记号:\(T\) = 设备把一块数据输入缓冲区的时间;\(M\) = 缓冲区把一块数据传送到用户工作区的时间;\(C\) = CPU 处理(计算)一块数据的时间。设 \(T\gt M\)、\(C\gt M\)(真题均如此约定)。

结论 单缓冲(缓冲区唯一):每处理一块数据平均耗时 \[ \max(C,\ T)+M \] 双缓冲(两个缓冲区交替):每处理一块数据平均耗时 \[ \max(C+M,\ T) \]

单缓冲推导(看图 5-2 上半部):块 ① 输入缓冲区耗时 \(T\);随后缓冲区→用户区耗时 \(M\),这期间缓冲区被占用,设备必须等;\(M\) 结束后缓冲区腾空,设备立即开始输入块 ②(耗时 \(T\)),与此同时 CPU 在用户区处理块 ①(耗时 \(C\),与块 ② 的 \(T\) 并行)。于是稳态下每个「块周期」= 串行的 \(M\) + 并行段的 \(\max(C,T)\)。

双缓冲推导(看图 5-2 下半部):设备写缓冲区 A 的同时,CPU 从缓冲区 B 取数——设备的节奏是每 \(T\) 产出一块,CPU 的节奏是每 \(M+C\) 消费一块,两者完全解耦,周期取慢者 \(\max(C+M,\ T)\)。

单缓冲 每块 = max(C,T)+M = 250μs 0μs 设备 T₁=200 T₂=200 T₃=200 CPU M₁ C₁=100 M₂ C₂=100 周期 250μs周期 250μs M 期间设备被迫等待(缓冲区被占),故 M 串行计入每块时间 双缓冲 每块 = max(C+M,T) = 200μs 设备 T₁(缓冲A) T₂(缓冲B) T₃(缓冲A) CPU M₁ C₁ M₂ C₂ 空闲50μs 周期 200μs周期 200μs
图 5-2 单缓冲 vs 双缓冲时间对比(\(T=200\mu s\)、\(M=50\mu s\)、\(C=100\mu s\),横轴时间等比):单缓冲中 M 期间设备停等、周期 250μs;双缓冲中设备连续输入、CPU 与设备完全解耦,周期降为 \(\max(C+M,T)=200\mu s\)(C 与 T 并行、空闲段可见)
例 3 高频考点 单 / 双缓冲计算

某系统中,设备把一块数据输入缓冲区需要 \(T=200\mu s\),缓冲区把数据传送到用户工作区需要 \(M=50\mu s\),CPU 处理一块数据需要 \(C=100\mu s\)。求:(1) 单缓冲时每处理一块的平均时间;(2) 双缓冲时每处理一块的平均时间;(3) 双缓冲下处理 10 块数据的总时间。

查看解答

(1) 单缓冲:\(\max(C,T)+M=\max(100,200)+50=200+50=\mathbf{250\mu s}\)。

(2) 双缓冲:\(\max(C+M,T)=\max(150,200)=\mathbf{200\mu s}\)(瓶颈在设备 \(T\),CPU 侧每块只耗 150μs,还要空闲 50μs 等设备)。

(3) 稳态下每块 200μs;第一块需先等 \(T=200\mu s\) 装满一个缓冲区后 CPU 才能开始,此后流水线衔接,总时间 \(=T+9\times200=200+1800=\mathbf{2000\mu s}\)(若题目不要求精确到首块,答 \(10\times200=2000\mu s\),两者此处恰好相同:首块周期本身也是 200μs)。

数值自检(单缓冲,第一块):设备输入 0→200,M:200→250,CPU 处理 250→350;与此同时设备输入块 ②:250→450。第二块 M 从 450 开始——块间隔恰 250μs ✓。

5.3.2 循环缓冲与缓冲池

循环缓冲在内存中分配多个(如 3~5 个)大小相等的缓冲区链成环形,设两个指针:Next(Nextg,下一个装数据的空缓冲区)、Current(Nexti,下一个待取数据的满缓冲区)。输入进程沿环写入,计算进程沿环读取;生产快则空缓冲区逐渐耗尽,消费快则满缓冲区逐渐耗尽——通过指针追赶体现同步。循环缓冲仍是专为某个(对)进程专用的缓冲组织。
缓冲池(公用缓冲池)缓冲池中的缓冲区供多个进程共享,既能用于输入也能用于输出,是操作系统公用的资源。组织为三条队列 + 四种工作缓冲区:
  • 三个队列:空缓冲队列 emq(empty buffer queue)、装满输入数据的输入队列 inq(input queue)、装满输出数据的输出队列 outq(output queue);
  • 四种工作缓冲区(从队列中摘下、正在使用的缓冲区):hin 收容输入、sin 提取输入、hout 收容输出、sout 提取输出。
基本操作:GetBuf(队列)——摘下队首缓冲区;PutBuf(队列, 缓冲区)——挂到队尾。收容/提取各走「取一空(或满)→ 使用 → 挂到另一队列」三步。
四条流程一张表记牢
流程执行者取自作为数据动作挂到
收容输入输入进程emq(空)hin设备数据写入 hininq(满)
提取输入计算进程inq(满)sin数据送用户区emq(空)
收容输出计算进程emq(空)hout用户区数据写入 houtoutq(满)
提取输出输出进程outq(满)sout数据送 I/O 设备emq(空)
口诀:「收容」从 emq 拿空的来装,「提取」从满队列拿去卸,卸完都回 emq。
例 4 缓冲池工作流程

在缓冲池机制中,输入进程要完成「收容输入」工作,正确的动作序列是( )
A. GetBuf(inq) → 数据写入该缓冲区 → PutBuf(emq)
B. GetBuf(emq) → 设备数据写入该缓冲区(作 hin)→ PutBuf(inq)
C. GetBuf(emq) → 用户区数据写入该缓冲区(作 hout)→ PutBuf(outq)
D. GetBuf(outq) → 数据送往设备 → PutBuf(emq)

查看解答

B。收容输入=「把设备送来的数据收进来」:从空缓冲队列 emq 摘一个空缓冲区(此刻它就是工作缓冲区 hin),设备数据灌入其中,装满后挂到输入队列 inq 尾部,等待计算进程提取。

A 颠倒:inq 里是已装满的数据,不能拿来「装」;C 是收容输出(hout);D 是提取输出(sout)。

套路总结:看见「收容」→ 从 emq 取空缓冲;看见「提取」→ 从 inq/outq 取满缓冲;用完一律归还 emq。

练习 3 易错

若 \(T=100\mu s\)、\(C=200\mu s\)、\(M=50\mu s\)(设备比 CPU 快),求单缓冲与双缓冲下每处理一块的时间,并解释结论。

查看答案

单缓冲:\(\max(C,T)+M=\max(200,100)+50=250\mu s\);双缓冲:\(\max(C+M,T)=\max(250,100)=250\mu s\)。

两者相等!当 CPU 是瓶颈(\(C+M\ge T\))时,多设一个缓冲区也无法让「处理流水线」快过 CPU 自身的 \(C+M\)——双缓冲只在设备是瓶颈(\(T\gt C+M\))时才把每块时间从 \(\max(C,T)+M\) 压到 \(T\)。真题爱用「双缓冲一定比单缓冲快」设坑。

5.4 设备分配与 SPOOLing

5.4.1 设备分配的数据结构与流程

设备、控制器、通道都是临界资源,系统借助四张表(DCT、COCT、CHCT、SDT)记录状态并完成分配:

四张表的关系链
  • DCT(设备控制表):每个设备一张,记录设备状态(忙/闲)、等待队列指针、指向其 COCT;
  • COCT(控制器控制表):每个控制器一张,记录控制器状态、指向其 CHCT;
  • CHCT(通道控制表):每个通道一张,记录通道状态、等待队列;
  • SDT(系统设备表):整个系统一张,每个物理设备占一个表目,记录设备类型/标识/状态,指向其 DCT。
查找链条:SDT → DCT → COCT → CHCT,与「分配一台设备必须连带分配控制器与通道」一一对应。
设备分配程序按「物理设备名 → 逻辑设备名」两步走:① 用户进程以逻辑设备名申请设备;② 系统先查 SDT 找到可分配的物理设备(不止一台同类设备时按算法选一台空闲的),再沿 DCT→COCT→CHCT 检查对应控制器、通道是否空闲;三者皆空闲才启动 I/O,否则将进程挂到相应等待队列。设备独立性体现在:分配的是「一台可用的同类设备」,而非用户点名的固定设备。
易错① 分配顺序:先设备、再控制器、后通道,三者缺一不可(通道方式下);
② SDT 全系统一张、DCT/COCT/CHCT 每个对象一张——「每设备一张 DCT、每控制器一张 COCT、每通道一张 CHCT」;
③ 指向关系是 DCT→COCT→CHCT(设备找它的控制器,控制器找它的通道),SDT→DCT(从系统总表定位设备),方向别画反。
练习 4

填空:系统为每个设备配置一张( )表,为每个控制器配置一张( )表,为每个通道配置一张( )表;整个系统只有一张( )表,其每个表目指向一台物理设备的( )表。

查看答案

依次为:DCT(设备控制表)、COCT(控制器控制表)、CHCT(通道控制表)、SDT(系统设备表)、DCT。

记忆链:SDT(总目录)→ DCT(某设备)→ COCT(其控制器)→ CHCT(其通道)——「总表找设备,设备找控制器,控制器找通道」。

5.4.2 SPOOLing:独占设备改造为共享 高频考点

打印机这类独占设备若直接分配给进程,其他进程只能排队干等。SPOOLing(Simultaneous Peripheral Operations On-Line,假脱机操作)用「速度最快的共享设备(磁盘)模拟速度慢的独占设备」——这是用空间(磁盘井)换取设备并行/共享的典型技术。

SPOOLing 系统组成
  • 输入井 / 输出井:磁盘上的两个存储区域(由空闲盘块链成),模拟脱机输入/输出时的「磁带数据区」,井在磁盘;
  • 输入缓冲区 / 输出缓冲区:内存中开辟,设备与井之间的中转站(设备不能直接对磁盘井细粒度读写);
  • 输入进程 / 输出进程:模拟脱机时代的外围处理机,控制数据「设备↔缓冲区↔井」的搬运,在用户层实现;
  • 请求打印队列(打印请求表):登记各进程的打印请求,输出进程按先来先服务逐个打印。
输出流(共享打印机) 用户进程区 进程 P1 进程 P2 进程 P3 ① 写输出文件 挂打印请求表 磁盘 · 输出井 P1 的打印数据 P2 的打印数据 ② 输出进程 内存 · 输出缓冲区 井与打印机之间 的中转站 打印机 逐份打印 输入流(模拟脱机输入) 输入设备 键盘 / 终端 输入进程 内存 · 输入缓冲区 中转 磁盘 · 输入井 预输入排队 ③ 计算进程需要时从输入井读入(需井中已有数据) 井(磁盘)+缓冲区(内存)+输入/输出进程(用户层)=把「一台独占打印机」变成「逻辑上人人可用的共享打印机」
图 5-3 SPOOLing 系统:输出流 P1/P2/P3 的数据先各存入输出井(①),输出进程经输出缓冲区(②)把井中数据逐份送打印机;打印机物理上仍独占,逻辑上被共享——这就是虚拟设备
// SPOOLing 共享打印机的完整流程(用户进程 + 输出进程协同)
// 用户进程一侧:write 调用"秒回",并未真正碰打印机
用户进程 write(打印机, 数据):
    申请输出井空闲盘块;
    数据 经内存输出缓冲区 缓存后 写入输出井;   // 落盘
    在打印请求表中登记本请求;                   // 排队
    返回, 进程继续计算;                         // 不阻塞等待打印

// SPOOLing 输出进程(打印机守护进程)一侧
while (true) {
    if (打印请求表 == 空)
        阻塞, 等待新打印请求;
    摘下请求表中最早的请求;                     // 先来先服务
    从输出井读出该作业的数据 → 输出缓冲区;       // 井到内存
    从输出缓冲区送打印机逐块打印;                // 真正占用设备
    归还输出井盘块, 注销该请求;
}
例 5 高频考点 SPOOLing 概念

下列关于 SPOOLing 系统的叙述中,错误的是( )
A. SPOOLing 技术把独占设备改造成共享设备,实现了虚拟设备功能
B. 输入井和输出井位于磁盘,输入缓冲区和输出缓冲区位于内存
C. 用户进程发出打印请求后,数据立即被送往打印机打印
D. 输出进程按先来先服务的顺序为各进程的打印请求服务

查看解答

C。打印请求被「假脱机」处理:数据先写入磁盘输出井并登记打印请求表,用户进程立刻返回继续运行;真正的打印由输出进程稍后从井中取出、经输出缓冲区送打印机——如果立即送往打印机,进程就必须等待打印机空闲,也就谈不上虚拟设备了。

A、B、D 均为标准表述。再记两点:SPOOLing 需要多道程序设计技术的支持(用户进程与输出进程并发);「打印机被改造为虚拟设备」=「用高速共享设备(磁盘)模拟低速独占设备」。

5.5 磁盘与磁盘调度 高频考点

5.5.1 磁盘结构与存取时间

磁盘结构磁盘由若干盘片组成,每个盘面一个磁头;每个盘面上一圈圈同心圆是磁道,每条磁道分为若干扇区——扇区是磁盘最小的可寻址读写单位(通常 512B~4KB);所有盘面上同一半径的磁道组成一个柱面。磁盘物理地址 =(柱面号(磁道号),盘面号(磁头号),扇区号)。总容量 = 磁头数 × 每面磁道数 × 每磁道扇区数 × 每扇区字节数。读写一块数据时,先按柱面号寻道(所有磁头同时定位),再选盘面,最后等扇区转到磁头下——按「柱面→盘面→扇区」的顺序存放连续数据可使移动磁头的次数最少。
存取时间三段式(大题必背)读写一块磁盘数据的时间 \[ T_a=T_s+T_r+T_t \]
  • \(T_s\) 寻道时间:磁头移动到目标磁道,\(T_s=s+m\times n\)(\(s\) 为启动磁臂时间,\(m\) 为跨一条磁道的时间,\(n\) 为跨越的磁道数);
  • \(T_r\) 旋转延迟:目标扇区转到磁头下,平均为半圈。转速 \(r\) 转/分时每转一圈 \(\dfrac{60}{r}\) 秒,故 \(T_r=\dfrac{60}{2r}\) 秒 \(=\dfrac{30000}{r}\) ms;
  • \(T_t\) 传输时间:读写数据本身经过磁头的时间。每磁道 \(N\) 个扇区(或每道容量 \(B\) 字节)时,读一块(\(b\) 字节):\(T_t=\dfrac{60}{r}\times\dfrac{1}{N}=\dfrac{60}{r}\times\dfrac{b}{B}\) 秒。
一句话记忆「找道(机械,最慢)→ 等半圈(平均)→ 读一块」。\(\frac{30000}{r}\) ms 代转速即可:7200rpm → 4.17ms;10000rpm → 3ms;15000rpm → 2ms。传输时间 = 一圈时间 ×(块大小 ÷ 每道容量)。
例 6 真题风格 读一块磁盘数据的时间(全程推导)

某磁盘转速 \(r=7200\) 转/分,每个磁道容量 \(B=160\mathrm{KB}\),每个数据块 \(b=4\mathrm{KB}\),平均寻道时间 \(T_s=6\mathrm{ms}\)。求:(1) 平均读一块数据的总时间;(2) 若 100 块数据连续存放在同一磁道上,全部读出共需多久?

查看解答

(1) 转一圈:\(\frac{60}{7200}\mathrm{s}=\frac{60000}{7200}\mathrm{ms}=8.33\mathrm{ms}\);

旋转延迟(平均半圈):\(T_r=\frac{8.33}{2}=4.17\mathrm{ms}\);

传输时间:每道块数 \(N=\frac{160\mathrm{KB}}{4\mathrm{KB}}=40\) 块,故 \(T_t=\frac{8.33}{40}\approx0.21\mathrm{ms}\);

\[ T_a=6+4.17+0.21\approx\mathbf{10.38ms} \]

(2) 连续 100 块存同一磁道:只寻道一次、只等一次平均旋转延迟;100 块 \(=100/40=2.5\) 圈,传输时间 \(=2.5\times8.33=20.83\mathrm{ms}\),总时间 \(=6+4.17+20.83=\mathbf{31.0ms}\),平均每块仅 0.31ms——约为随机读(10.38ms/块)的 1/33,这就是「顺序/连续存放远快于随机访问」的量化依据。

易错:① 旋转延迟取半圈不是一圈;② 传输时间按「块占一圈的比例」算,不是想当然的常数;③ 转速 r 的单位是转/分,\(\frac{60}{r}\) 得到的是秒,别忘换单位。

5.5.2 磁盘调度算法 高频考点

磁盘调度的优化对象是寻道时间(机械移动最慢):给定当前磁头位置与一批等待的磁道请求,确定访问顺序使平均寻道长度最短。设当前磁头位于 100 号磁道,磁道范围 0~199,沿磁道号增大方向移动,先后到达的请求为 68, 170, 30, 190, 44, 125, 80(即请求集合 {30, 44, 68, 80, 125, 170, 190})——下面所有算法都用这组数据。

FCFS 先来先服务按请求到达顺序服务。公平、简单,但磁头来回抖动,平均寻道长。本例:\(100\to68\to170\to30\to190\to44\to125\to80\),总移动 \(32+102+140+160+146+81+45=706\) 条磁道,平均 \(706/7\approx100.9\)。
SSTF 最短寻道时间优先每次都选距离当前磁头最近的请求(贪心),平均寻道短;但远处请求可能长期得不到服务——可能饥饿(不保证公平)。
SCAN 电梯调度磁头沿一个方向移动并服务途经请求,到头(最边缘磁道或最远请求)后再折返反向扫描。两个变体:严格 SCAN——必须到达磁盘最边缘磁道(0 或 199)才折返;LOOK——只需到达当前方向上最远的请求即折返(「看一眼」再回头),省去空跑。
C-SCAN 循环扫描磁头只沿一个方向服务请求,扫到头后快速返回起点(返回途中不服务),再开始下一轮单向扫描——磁道号均匀分布时各磁道等待机会均等。变体 C-LOOK:只到当前方向最远请求即返回(返回到最小/最大请求处)。
SSTF:贪心选最近,总移动 230,平均 230/7≈32.9 0 199 ① ② ③ ④ ⑤ ⑥ ⑦ 30 44 68 80 100 125 170 190 SCAN(严格版):先扫到边 199 再折返,总移动 268,平均 268/7≈38.3 0 199 ① ② ③ ④到边 ⑤ ⑥ ⑦ ⑧ 30 44 68 80 100 125 170 190
图 5-4 同一请求集合的 SSTF 与 SCAN 走线对比(当前磁道 100,向增大方向):SSTF 先贪心向左 100→80→68→44→30(④),再长距离跳向 125→170→190(⑤⑥⑦);SCAN 先向右服务 125→170→190 并到边 199(④),再折返向左 80→68→44→30——LOOK 变体只到 190 即折返,可省去 190↔199 的空跑
例 7 真题风格 磁盘调度大题(FCFS / SSTF / SCAN)

磁盘磁道编号 0~199,当前磁头位于 100 号磁道,沿磁道号增大方向移动,等待的请求依次为 68, 170, 30, 190, 44, 125, 80。分别用 FCFS、SSTF、SCAN(严格版,须到达边缘 199 才折返)给出服务序列,并计算总寻道数与平均寻道长度。

查看解答

① FCFS(按到达序):\(100\to68\to170\to30\to190\to44\to125\to80\)

\[ 32+102+140+160+146+81+45=706,\quad \bar{L}=706/7\approx100.9 \]

② SSTF:从 100 出发依次选最近:80(20)→ 68(12)→ 44(24)→ 30(14)→ 125(95)→ 170(45)→ 190(20)

\[ 20+12+24+14+95+45+20=230,\quad \bar{L}=230/7\approx32.9 \]

③ SCAN:向增大方向扫:125(25)→170(45)→190(20)→199(9,到边),折返:80(119)→68(12)→44(24)→30(14)

\[ (25+45+20+9)+(119+12+24+14)=99+169=268,\quad \bar{L}=268/7\approx38.3 \]

算法服务序列总寻道数平均
FCFS68,170,30,190,44,125,80706100.9
SSTF80,68,44,30,125,170,19023032.9
SCAN125,170,190,(199),80,68,44,3026838.3

数值自检(SCAN):上行程 \(100\to199\) 共 99 条;回程 \(199\to30\) 共 169 条;\(99+169=268\) ✓。注意 SSTF 平均最短但不公平,本例恰比 SCAN 好;若请求持续聚集在一侧,SSTF 会让另一侧饥饿。

C-SCAN(严格版):99+199+80=378(计返回;不计返回 179) 0 199 单向服务 125→170→190→199 快速返回 199→0(不服务) 下一轮 30→44→68→80 30 44 68 80 100 125 170 190 C-LOOK:90+160+50=300(计返回;不计返回 140) 单向服务到最远请求 190 即止(不到 199) 直接返回最小请求 30(不服务) 44→68→80 30 44 68 80 100 125 170 190
图 5-5 C-SCAN 与 C-LOOK 走线(同一数据):单向服务+快速返回(虚线、不服务)。C-SCAN 返回时从边缘 199 跳回 0;C-LOOK 只从最远请求 190 跳回最小请求 30。返回行程是否计入总寻道数依题目约定,作答时务必注明
例 8 高频考点 SCAN 变体大题(LOOK / C-SCAN / C-LOOK)

数据同例 7(当前 100,向增大方向,请求 {30, 44, 68, 80, 125, 170, 190})。求:(1) LOOK 的服务序列与总寻道数;(2) C-SCAN(返回行程也计移动)与 C-LOOK 的总寻道数;(3) 判断:某算法「磁头只朝一个方向服务,到达最远请求后直接返回最小请求处再继续同向扫描」,它是谁?

查看解答

(1) LOOK:向增大方向服务 125(25)→170(45)→190(20)即折返(不到 199),再 80(110)→68(12)→44(24)→30(14):

\[ 90+160=250,\quad \bar{L}=250/7\approx35.7 \]

(2) C-SCAN(含返回):上行 \(100\to199\) 共 99;返回 \(199\to0\) 共 199;再 \(0\to30\to44\to68\to80\) 共 80:\(99+199+80=\mathbf{378}\),\(\bar{L}=378/7=54\)(若不计返回:\(99+80=179\),\(\bar{L}\approx25.6\))。

C-LOOK(含返回):上行 \(100\to190\) 共 90;返回 \(190\to30\) 共 160;再 \(30\to44\to68\to80\) 共 50:\(90+160+50=300\),\(\bar{L}\approx42.9\)(不计返回:\(140\),\(\bar{L}=20\))。

(3) C-LOOK。三个判别特征:「只单向服务」→ C 系;「返回途中不服务」→ C 系;「到最远请求即返回、不空跑到边缘」→ LOOK 系。若叙述为「必须到达磁盘边缘 0/199 再折返」→ SCAN/C-SCAN。

易错:本例中「计返回」时 C 系总寻道数反而大于 SCAN——C-SCAN 的优势不在总距离,而在磁道均匀分布时等待时间更公平,别把「平均寻道最短」扣在 C-SCAN 头上。

易错:算法归属判断速查① 每次选最近的请求 → SSTF(可能饥饿);
② 沿一个方向扫、到头折返、返程也服务 → SCAN;只到最远请求就折返 → LOOK;
③ 单向服务、返回不服务、回到起点再来 → C-SCAN(回 0);回到最小请求再来 → C-LOOK;
④ 题目问「平均寻道时间最短」一般选 SSTF;问「对两端磁道公平/响应时间方差小」选 C-SCAN;问「像电梯」选 SCAN。

5.6 磁盘管理

磁盘格式化(两级)
  • 物理格式化(低级格式化):划分扇区、检查坏扇区并用备用扇区替换,建立扇区校验信息(如 ECC)。低格后磁盘才能被识别为「一堆可用扇区」;
  • 分区:把磁盘划分为柱面组成的分区(如 C 盘、D 盘),每个分区可视为独立的逻辑磁盘;
  • 逻辑格式化(高级格式化):在分区上建立文件系统——初始化管理信息(超级块、空闲空间管理结构、根目录 / 索引结点区等)。此后才能存文件。
坏块与引导块坏块:简单磁盘(如早期 IDE)由 FAT 表中标记坏块「登记在案」;复杂磁盘(SCSI 等)由磁盘控制器维护坏块链表,并用备用扇区逻辑替换(对上层透明)。引导块:计算机启动时 ROM 中仅有很小的自举装入程序(bootstrap loader),它负责从磁盘的固定位置(如 0 号扇区,MBR)读入完整的引导程序,再由引导程序装入操作系统——「自举程序在 ROM、引导块在磁盘」。
固态硬盘 SSD 简述SSD 由闪存芯片 + 控制器(含闪存翻译层 FTL)组成:FTL 维护逻辑块地址→物理页的映射表;读写以页为单位,而擦除以块为单位(一个块含多个页),且页写前必须先擦除所在块。读写不对称:随机读极快(无寻道与旋转延迟),写慢(要整块擦除搬移有效数据)。因此控制器要做:垃圾回收(把稀疏的有效页集中搬走,整块擦除回收)与磨损均衡(动态:把新写分散到较新的块;静态:把冷数据从旧块搬走腾出擦写寿命),延长闪存寿命。
易错:SSD vs 机械盘① SSD 没有寻道时间与旋转延迟——磁盘调度算法(SSTF/SCAN 等)对 SSD 意义骤减;
② SSD 的「块」是擦除单位,与文件系统的逻辑块、机械盘的扇区概念不同层;
③ 机械盘随机访问慢的根源是机械移动(寻道 + 旋转),SSD 写慢的根源是先擦后写;两者不对称的方向不同。
练习 5 易错

判断正误:(1) 建立 FAT/根目录等文件系统信息属于物理格式化;(2) 自举装入程序存放在磁盘 0 号扇区;(3) SSD 以页为单位读写、以块为单位擦除;(4) 磨损均衡的目的是让各闪存块的擦写次数尽量均匀。

查看答案

(1) 错:建立文件系统管理信息是逻辑格式化;物理格式化只划分扇区、处理坏扇区。

(2) 错:ROM 中放自举装入程序,磁盘 0 号扇区(MBR)放的是引导块/引导程序;程序自举在 ROM、引导块在磁盘。

(3) 对:页为读写单位、块为擦除单位,故写前需整块擦除。

(4) 对:闪存块有擦写寿命上限,磨损均衡(含动态与静态)为延长整体寿命而设。

5.7 章末自测 真题风格

限时 50 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。所有计算题都给出了数值自检路径,务必动笔验算。

自测 1(选择 · ★★)

关于 I/O 设备分类,下列说法正确的是( )
A. 磁盘是字符设备,打印机是块设备
B. 磁盘属于块设备,且是共享设备
C. 键盘是块设备,可寻址
D. 打印机是共享设备,多个进程可同时向它输出

查看答案

B。磁盘以块为单位、可寻址、多进程可交替使用(共享设备)。A 两处全反;键盘是字符设备且不可寻址;打印机物理上是独占设备,多个进程「同时直接输出」要靠 SPOOLing 改造成虚拟设备后逻辑上实现。

自测 2(选择 · ★★★ 高频考点)

缓冲管理、设备分配、逻辑设备名到物理设备名的映射,这些功能由 I/O 系统的( )实现
A. 用户层 I/O 软件 B. 设备独立性软件 C. 设备驱动程序 D. 中断处理程序

查看答案

B。设备独立性软件承担「所有设备的公共操作」:命名、保护、缓冲、分配、映射。顺带复习:SPOOLing 在用户层;「写控制器寄存器」在驱动层;「保存/恢复现场」在中断层。

自测 3(选择 · ★★★)

与中断驱动方式相比,DMA 方式的特点是( )
A. 数据传送仍以字为单位,每字中断一次
B. 数据块传送直接在内存与设备间进行,整块结束才中断 CPU 一次
C. CPU 需要全程查询设备状态
D. 只能用于低速字符设备

查看答案

B。DMA 的两大标志:直接与内存交换(不经 CPU 搬运)、一块一次中断。A 是中断方式;C 是程序查询;DMA 恰恰用于高速块设备(磁盘)。

自测 4(选择 · ★★ 易错)

下列磁盘调度算法中,可能导致某些磁道请求长期得不到服务(饥饿)的是( )
A. FCFS B. SSTF C. SCAN D. C-SCAN

查看答案

B。SSTF 贪心选最近,若新请求持续出现在磁头附近,远处请求会被无限推迟。FCFS 按到达序天然公平;SCAN/C-SCAN 是周期性扫过全部磁道,不会饿死个别请求。

自测 5(计算 · ★★★)

设备输入一块到缓冲区 \(T=150\mu s\),缓冲区到用户区 \(M=30\mu s\),CPU 处理一块 \(C=120\mu s\)。求单缓冲与双缓冲下每处理一块的时间。

查看答案

单缓冲:\(\max(C,T)+M=\max(120,150)+30=150+30=180\mu s\);

双缓冲:\(\max(C+M,T)=\max(150,150)=150\mu s\)——注意本题 \(C+M\) 恰等于 \(T\),两瓶颈打平,双缓冲把每块时间压到设备节奏 \(T=150\mu s\)。

自测 6(计算 · ★★★★ 冲刺)

若 \(T=400\mu s\)、\(C=100\mu s\)、\(M=50\mu s\),双缓冲下 CPU 每处理一块后还要空闲多久?此时再增加第三个缓冲区有无意义?

查看答案

每块周期 \(\max(C+M,T)=\max(150,400)=400\mu s\)(设备是瓶颈)。CPU 每块只耗 \(C+M=150\mu s\),空闲 \(400-150=250\mu s\)。

再加缓冲区无意义:瓶颈在设备输入速度 \(T\),缓冲再多也无法让设备更快产块;只有当 \(T\gt C+M\) 时双缓冲已把周期降到 \(T\),三缓冲及更多只在「希望 CPU 领先预取多块」等特殊场景才有一点平滑作用,408 口径下「双缓冲已消除设备等待」。

自测 7(计算 · ★★★)

某磁盘转速 10000 转/分,每磁道 128KB,每块 4KB,平均寻道时间 8ms。求平均读一块的时间。

查看答案

一转 \(=60000/10000=6\mathrm{ms}\);旋转延迟 \(=6/2=3\mathrm{ms}\);每道 \(N=128/4=32\) 块,传输 \(=6/32\approx0.19\mathrm{ms}\);

\[ T_a=8+3+0.19\approx\mathbf{11.19ms} \]

自测 8(解答 · ★★★★ 冲刺)

磁道范围 0~199,当前磁头在 90 号磁道,沿磁道号减小方向移动,请求队列:120, 40, 70, 160, 20, 55。用 SSTF 和 SCAN(须到边缘 0 才折返)分别给出服务序列、总寻道数与平均寻道长度。

查看解答

SSTF:\(90\to70(20)\to55(15)\to40(15)\to20(20)\to120(100)\to160(40)\),总 \(=20+15+15+20+100+40=210\),平均 \(210/6=35\)。

贪心自检:90 最近是 70(20<30);70 之后最近 55;55 之后 40;40 之后 20;20 之后只剩 120、160,先 120 后 160 ✓。

SCAN:向减小方向 \(90\to70(20)\to55(15)\to40(15)\to20(20)\to\mathbf{0(20)}\),到边折返 \(0\to120(120)\to160(40)\),总 \(=90+160=250\),平均 \(250/6\approx41.7\)。

易错:SCAN 向减小方向时「边缘」是 0 不是 199;返程只服务尚未处理的 120、160。

自测 9(选择 · ★★★)

操作系统中实现「虚拟设备」功能、把独占设备改造为共享设备的关键技术是( )
A. 中断处理 B. DMA C. SPOOLing D. 通道技术

查看答案

C。SPOOLing 用磁盘的输入井/输出井模拟独占设备,配以内存缓冲区和输入/输出进程(用户层)。A、B、D 都只是提高数据传输效率的控制/连接手段,不改变设备的独占属性。

自测 10(解答 · ★★★)

磁盘转速 5400 转/分,每磁道 96KB,块大小 4KB,平均寻道 10ms。求平均读一块的时间,并回答:连续读同一磁道上的 12 块共需多久(只寻道一次、只等一次平均旋转延迟)?

查看解答

一转 \(=60000/5400\approx11.11\mathrm{ms}\);旋转延迟 \(=5.56\mathrm{ms}\);每道 \(96/4=24\) 块,单块传输 \(=11.11/24\approx0.46\mathrm{ms}\);平均读一块 \(=10+5.56+0.46\approx\mathbf{16.02ms}\)。

连续 12 块 \(=12/24=0.5\) 圈,传输 \(=5.56\mathrm{ms}\),总时间 \(=10+5.56+5.56=\mathbf{21.11ms}\),平均每块仅约 1.76ms——连续存放的收益随块数增长而凸显(对照例 6 的 33 倍结论)。

5.8 本章考点总结

考点常考题型热度核心方法
I/O 设备分类选择题★★★块/字符、独占/共享/虚拟三维度独立判断;磁盘=块+共享,打印机=字符+独占
层次结构与功能归属选择题★★★★ 高频用户层(库函数/SPOOLing)→独立性层(命名/保护/缓冲/分配/映射)→驱动(翻译命令写寄存器)→中断处理(现场善后,最底层软件)
I/O 控制方式选择 / 对比★★★干预粒度:查询每字忙等 → 中断每字一次 → DMA 每块一次、直接进内存
单 / 双缓冲计算选择 / 计算★★★★★ 必考单缓冲 \(\max(C,T)+M\);双缓冲 \(\max(C+M,T)\);\(C+M\ge T\) 时双缓冲无增益
缓冲池选择★★★emq/inq/outq 三队列+hin/sin/hout/sout 四工作缓冲区;「收容从 emq 取空、提取从满队列取、用完回 emq」
设备分配四张表选择 / 填空★★★SDT(一张总表)→DCT→COCT→CHCT;分配顺序:设备→控制器→通道
SPOOLing / 虚拟设备选择 / 判断★★★★ 高频井在磁盘、缓冲区在内存、进程在用户层;打印=写输出井+挂请求表+输出进程排队打印
磁盘存取时间大题 / 计算★★★★★ 必考\(T_a=T_s+T_r+T_t\);\(T_r=\frac{30000}{r}\) ms(半圈);\(T_t=\) 一圈时间×(块÷每道容量);连续存放只寻道一次
磁盘调度算法大题 / 选择★★★★★ 必考画走线图:SSTF 贪心(可饥饿)、SCAN 到边折返、LOOK 到最远请求折返、C-SCAN/C-LOOK 单向+返回不服务;总寻道÷请求数=平均
磁盘管理与 SSD选择 / 判断★★物理格式化划扇区、逻辑格式化建文件系统;自举在 ROM、引导块在磁盘;SSD 页读写/块擦除、磨损均衡、读写不对称
下一步本章过关标准:两个公式(\(\max(C,T)+M\)、\(\max(C+M,T)\))能当场推导并代两组数值验证;任给请求序列与起始磁道,5 分钟内画出走线图并算出各算法总寻道数;四张表、四种工作缓冲区、SPOOLing 三组件能默写。磁盘调度大题务必动笔算——回 总目录 复习操作系统前几章的「中断与进程切换」再回来做本章自测第二遍,效果最佳。