第 5 章 输入输出管理(I/O 管理)
本章地位:I/O 管理是操作系统「对外服务的窗口」,408 每年稳定考 2~4 分:选择题覆盖层次归属判断、缓冲计算、SPOOLing 概念,大题最爱考磁盘调度序列 + 平均寻道长度与读一块磁盘数据的时间。本章与组成原理的 I/O 章遥相呼应:组成原理讲「控制器硬件怎么做」,操作系统讲「软件怎么分层管理」。三根主线:① 分层——某功能属于哪一层(高频选择);② 缓冲——单/双缓冲公式 max(C,T)+M 与 max(C+M,T) 必算;③ 磁盘——调度算法画走线图、时间三段式分解。所有数值结论都代具体数字验证过。
5.1 I/O 管理概述
5.1.1 I/O 设备的分类
- 按信息交换单位:块设备——以数据块为单位存取、可寻址、传输快,典型如磁盘,常用 DMA 方式;字符设备——以字节为单位、不可寻址、传输慢,常采用中断方式,典型如键盘、打印机、鼠标。
- 按传输速率:低速设备(键盘、鼠标,每秒几个字节)、中速设备(打印机)、高速设备(磁盘、网卡)。
- 按共享属性:独占设备——一段时间内只能被一个进程使用(打印机、终端);共享设备——可被多个进程交替使用(磁盘);虚拟设备——通过 SPOOLing 技术把独占设备改造成的、逻辑上可共享的设备。
5.1.2 I/O 子系统层次结构
② 缓冲管理、设备分配、逻辑设备名→物理设备名映射、设备保护、统一命名都属于设备独立性软件;
③ 与硬件直接打交道的最底层「软件」是中断处理程序,驱动程序在其上(负责「翻译命令」,中断处理程序负责「善后」);
④ 「向控制器寄存器写入参数」=驱动程序;「I/O 完成后保存/恢复现场、唤醒进程」=中断处理程序。
5.1.3 设备独立性 · I/O 调度 · 设备保护
下列 I/O 功能中,属于设备驱动程序职责的是( )
A. 将「读 3 号磁盘第 100 块」的抽象命令翻译为对特定控制器寄存器的读写
B. 为到来的读请求分配一个空闲缓冲区
C. 将用户程序中的逻辑设备名映射为某台物理设备
D. I/O 完成后保存现场并唤醒等待的进程
查看解答
A。「翻译命令、设置控制器寄存器」正是驱动程序(③ 层)的标志性工作。
B 错:缓冲管理属于设备独立性软件(② 层)的公共操作;
C 错:逻辑设备名→物理设备名的映射也属于设备独立性软件;
D 错:响应中断、保存/恢复现场、唤醒进程属于中断处理程序(④ 层)。
套路总结:抓住每层「标志性动作」——用户层=库函数/SPOOLing;独立性层=命名/保护/缓冲/分配;驱动层=翻译命令写寄存器;中断层=现场善后。
判断正误:(1) 磁盘是典型的字符设备;(2) 打印机属于独占设备;(3) 经 SPOOLing 技术改造后,打印机可当作共享设备(虚拟设备)使用;(4) 块设备可寻址,通常采用 DMA 方式传输。
查看答案
(1) 错:磁盘以「块」为交换单位且可寻址,是块设备;键盘/打印机才是字符设备。
(2) 对:一段时间内只允许一个进程使用。
(3) 对:SPOOLing 用输入井/输出井把独占设备改造成虚拟(共享)设备。
(4) 对:块设备传输快、数据成块,适合 DMA;字符设备多用中断方式。
5.2 I/O 控制方式 高频考点
「CPU 如何知道设备忙/闲、数据何时就绪」决定了控制方式的演化方向:程序直接控制 → 中断驱动 → DMA。演化的主线只有一条——让 CPU 越来越少地干预数据传送。这一节与组成原理的 I/O 章完全呼应,OS 视角重点考「CPU 的干预粒度」。
程序直接控制(程序查询 / 轮询)
while (status != DEVICE_READY) // 反复读状态寄存器,忙等
; // CPU 空转,什么正事都干不了
data = read_data_register(); // 就绪后 CPU 亲自搬一个字
mem[i] = data;
中断驱动方式
DMA 方式(直接存储器存取)
| 方式 | 传输单位 | CPU 干预时机 | CPU 与设备并行性 | 数据流向 |
|---|---|---|---|---|
| 程序查询 | 一个字 | 传送前+传送后全程轮询 | 完全串行(忙等) | 设备→控制器寄存器→CPU→内存 |
| 中断驱动 | 一个字 | 每传完一个字中断一次 | 并行(字间 CPU 可干别的) | 设备→控制器寄存器→CPU→内存 |
| DMA | 一个数据块 | 仅初始化一次+整块结束中断一次 | 高度并行 | 设备→控制器→直接进内存 |
② 中断方式需要保存/恢复现场,若设备速度很高(如磁盘),中断开销会淹没收益——这正是磁盘采用 DMA 的原因;
③ DMA 期间 CPU 与 DMA 控制器可能争用内存(周期挪用/窃取),此细节属组成原理,但「DMA 减轻了 CPU 负担」是两科通用结论。
某设备以中断方式输入数据时,每传完一个字节(字)就向 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。
某低速字符设备每次传送 1 字节。分别采用程序查询与中断驱动方式完成 100 字节的输入,CPU 至少被「拖住」多少次?
查看答案
程序查询:CPU 从发出命令到 100 字节全部到齐,全程陷入忙等,相当于被拖住 1 次但时长覆盖整个传送过程(最差);
中断驱动:每字节到齐中断一次,共 100 次短暂介入,字间 CPU 可运行其他程序;
可见「拖住次数」:查询 1 次超长 ≥ 中断 100 次极短;若高速块设备改用 DMA,100 字节(不足一块)只需 1 次结束中断——设备越快,越应减少干预频度。
5.3 缓冲区管理 高频考点
5.3.1 单缓冲与双缓冲:公式推导
约定记号:\(T\) = 设备把一块数据输入缓冲区的时间;\(M\) = 缓冲区把一块数据传送到用户工作区的时间;\(C\) = CPU 处理(计算)一块数据的时间。设 \(T\gt M\)、\(C\gt M\)(真题均如此约定)。
单缓冲推导(看图 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)\)。
某系统中,设备把一块数据输入缓冲区需要 \(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 循环缓冲与缓冲池
- 三个队列:空缓冲队列 emq(empty buffer queue)、装满输入数据的输入队列 inq(input queue)、装满输出数据的输出队列 outq(output queue);
- 四种工作缓冲区(从队列中摘下、正在使用的缓冲区):hin 收容输入、sin 提取输入、hout 收容输出、sout 提取输出。
| 流程 | 执行者 | 取自 | 作为 | 数据动作 | 挂到 |
|---|---|---|---|---|---|
| 收容输入 | 输入进程 | emq(空) | hin | 设备数据写入 hin | inq(满) |
| 提取输入 | 计算进程 | inq(满) | sin | 数据送用户区 | emq(空) |
| 收容输出 | 计算进程 | emq(空) | hout | 用户区数据写入 hout | outq(满) |
| 提取输出 | 输出进程 | outq(满) | sout | 数据送 I/O 设备 | emq(空) |
在缓冲池机制中,输入进程要完成「收容输入」工作,正确的动作序列是( )
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。
若 \(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 每个对象一张——「每设备一张 DCT、每控制器一张 COCT、每通道一张 CHCT」;
③ 指向关系是 DCT→COCT→CHCT(设备找它的控制器,控制器找它的通道),SDT→DCT(从系统总表定位设备),方向别画反。
填空:系统为每个设备配置一张( )表,为每个控制器配置一张( )表,为每个通道配置一张( )表;整个系统只有一张( )表,其每个表目指向一台物理设备的( )表。
查看答案
依次为:DCT(设备控制表)、COCT(控制器控制表)、CHCT(通道控制表)、SDT(系统设备表)、DCT。
记忆链:SDT(总目录)→ DCT(某设备)→ COCT(其控制器)→ CHCT(其通道)——「总表找设备,设备找控制器,控制器找通道」。
5.4.2 SPOOLing:独占设备改造为共享 高频考点
打印机这类独占设备若直接分配给进程,其他进程只能排队干等。SPOOLing(Simultaneous Peripheral Operations On-Line,假脱机操作)用「速度最快的共享设备(磁盘)模拟速度慢的独占设备」——这是用空间(磁盘井)换取设备并行/共享的典型技术。
- 输入井 / 输出井:磁盘上的两个存储区域(由空闲盘块链成),模拟脱机输入/输出时的「磁带数据区」,井在磁盘;
- 输入缓冲区 / 输出缓冲区:内存中开辟,设备与井之间的中转站(设备不能直接对磁盘井细粒度读写);
- 输入进程 / 输出进程:模拟脱机时代的外围处理机,控制数据「设备↔缓冲区↔井」的搬运,在用户层实现;
- 请求打印队列(打印请求表):登记各进程的打印请求,输出进程按先来先服务逐个打印。
// 用户进程一侧:write 调用"秒回",并未真正碰打印机
用户进程 write(打印机, 数据):
申请输出井空闲盘块;
数据 经内存输出缓冲区 缓存后 写入输出井; // 落盘
在打印请求表中登记本请求; // 排队
返回, 进程继续计算; // 不阻塞等待打印
// SPOOLing 输出进程(打印机守护进程)一侧
while (true) {
if (打印请求表 == 空)
阻塞, 等待新打印请求;
摘下请求表中最早的请求; // 先来先服务
从输出井读出该作业的数据 → 输出缓冲区; // 井到内存
从输出缓冲区送打印机逐块打印; // 真正占用设备
归还输出井盘块, 注销该请求;
}
下列关于 SPOOLing 系统的叙述中,错误的是( )
A. SPOOLing 技术把独占设备改造成共享设备,实现了虚拟设备功能
B. 输入井和输出井位于磁盘,输入缓冲区和输出缓冲区位于内存
C. 用户进程发出打印请求后,数据立即被送往打印机打印
D. 输出进程按先来先服务的顺序为各进程的打印请求服务
查看解答
C。打印请求被「假脱机」处理:数据先写入磁盘输出井并登记打印请求表,用户进程立刻返回继续运行;真正的打印由输出进程稍后从井中取出、经输出缓冲区送打印机——如果立即送往打印机,进程就必须等待打印机空闲,也就谈不上虚拟设备了。
A、B、D 均为标准表述。再记两点:SPOOLing 需要多道程序设计技术的支持(用户进程与输出进程并发);「打印机被改造为虚拟设备」=「用高速共享设备(磁盘)模拟低速独占设备」。
5.5 磁盘与磁盘调度 高频考点
5.5.1 磁盘结构与存取时间
- \(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}\) 秒。
某磁盘转速 \(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})——下面所有算法都用这组数据。
磁盘磁道编号 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 \]
| 算法 | 服务序列 | 总寻道数 | 平均 |
|---|---|---|---|
| FCFS | 68,170,30,190,44,125,80 | 706 | 100.9 |
| SSTF | 80,68,44,30,125,170,190 | 230 | 32.9 |
| SCAN | 125,170,190,(199),80,68,44,30 | 268 | 38.3 |
数值自检(SCAN):上行程 \(100\to199\) 共 99 条;回程 \(199\to30\) 共 169 条;\(99+169=268\) ✓。注意 SSTF 平均最短但不公平,本例恰比 SCAN 好;若请求持续聚集在一侧,SSTF 会让另一侧饥饿。
数据同例 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 头上。
② 沿一个方向扫、到头折返、返程也服务 → SCAN;只到最远请求就折返 → LOOK;
③ 单向服务、返回不服务、回到起点再来 → C-SCAN(回 0);回到最小请求再来 → C-LOOK;
④ 题目问「平均寻道时间最短」一般选 SSTF;问「对两端磁道公平/响应时间方差小」选 C-SCAN;问「像电梯」选 SCAN。
5.6 磁盘管理
- 物理格式化(低级格式化):划分扇区、检查坏扇区并用备用扇区替换,建立扇区校验信息(如 ECC)。低格后磁盘才能被识别为「一堆可用扇区」;
- 分区:把磁盘划分为柱面组成的分区(如 C 盘、D 盘),每个分区可视为独立的逻辑磁盘;
- 逻辑格式化(高级格式化):在分区上建立文件系统——初始化管理信息(超级块、空闲空间管理结构、根目录 / 索引结点区等)。此后才能存文件。
② SSD 的「块」是擦除单位,与文件系统的逻辑块、机械盘的扇区概念不同层;
③ 机械盘随机访问慢的根源是机械移动(寻道 + 旋转),SSD 写慢的根源是先擦后写;两者不对称的方向不同。
判断正误:(1) 建立 FAT/根目录等文件系统信息属于物理格式化;(2) 自举装入程序存放在磁盘 0 号扇区;(3) SSD 以页为单位读写、以块为单位擦除;(4) 磨损均衡的目的是让各闪存块的擦写次数尽量均匀。
查看答案
(1) 错:建立文件系统管理信息是逻辑格式化;物理格式化只划分扇区、处理坏扇区。
(2) 错:ROM 中放自举装入程序,磁盘 0 号扇区(MBR)放的是引导块/引导程序;程序自举在 ROM、引导块在磁盘。
(3) 对:页为读写单位、块为擦除单位,故写前需整块擦除。
(4) 对:闪存块有擦写寿命上限,磨损均衡(含动态与静态)为延长整体寿命而设。
5.7 章末自测 真题风格
限时 50 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。所有计算题都给出了数值自检路径,务必动笔验算。
关于 I/O 设备分类,下列说法正确的是( )
A. 磁盘是字符设备,打印机是块设备
B. 磁盘属于块设备,且是共享设备
C. 键盘是块设备,可寻址
D. 打印机是共享设备,多个进程可同时向它输出
查看答案
B。磁盘以块为单位、可寻址、多进程可交替使用(共享设备)。A 两处全反;键盘是字符设备且不可寻址;打印机物理上是独占设备,多个进程「同时直接输出」要靠 SPOOLing 改造成虚拟设备后逻辑上实现。
缓冲管理、设备分配、逻辑设备名到物理设备名的映射,这些功能由 I/O 系统的( )实现
A. 用户层 I/O 软件 B. 设备独立性软件 C. 设备驱动程序 D. 中断处理程序
查看答案
B。设备独立性软件承担「所有设备的公共操作」:命名、保护、缓冲、分配、映射。顺带复习:SPOOLing 在用户层;「写控制器寄存器」在驱动层;「保存/恢复现场」在中断层。
与中断驱动方式相比,DMA 方式的特点是( )
A. 数据传送仍以字为单位,每字中断一次
B. 数据块传送直接在内存与设备间进行,整块结束才中断 CPU 一次
C. CPU 需要全程查询设备状态
D. 只能用于低速字符设备
查看答案
B。DMA 的两大标志:直接与内存交换(不经 CPU 搬运)、一块一次中断。A 是中断方式;C 是程序查询;DMA 恰恰用于高速块设备(磁盘)。
下列磁盘调度算法中,可能导致某些磁道请求长期得不到服务(饥饿)的是( )
A. FCFS B. SSTF C. SCAN D. C-SCAN
查看答案
B。SSTF 贪心选最近,若新请求持续出现在磁头附近,远处请求会被无限推迟。FCFS 按到达序天然公平;SCAN/C-SCAN 是周期性扫过全部磁道,不会饿死个别请求。
设备输入一块到缓冲区 \(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\)。
若 \(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 口径下「双缓冲已消除设备等待」。
某磁盘转速 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} \]
磁道范围 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。
操作系统中实现「虚拟设备」功能、把独占设备改造为共享设备的关键技术是( )
A. 中断处理 B. DMA C. SPOOLing D. 通道技术
查看答案
C。SPOOLing 用磁盘的输入井/输出井模拟独占设备,配以内存缓冲区和输入/输出进程(用户层)。A、B、D 都只是提高数据传输效率的控制/连接手段,不改变设备的独占属性。
磁盘转速 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 页读写/块擦除、磨损均衡、读写不对称 |