第 6 章 I/O 设备管理¶
依据:《操作系统概论》(2017 年版)第 6 章、配套自考大纲及附录答案。下文编号指大纲“考核内容与考核要求”;标注“自编”的算例为学习辅助,不是真题。
复习导航:大纲要求与笔记位置¶
| 大纲条目 | 层次 | 位置 | 学完应能做到 |
|---|---|---|---|
| 1.1–1.3 I/O 系统组成 | 识记 | 第 1 节 | 说出设备分类、控制器的结构与接口 |
| 2.1–2.3 控制方式 | 领会 | 第 2 节 | 说明轮询、中断、DMA 的完整过程 |
| 3.1–3.2 缓冲 | 领会 | 第 3 节 | 说明循环缓冲、公共缓冲池与同步 |
| 4.1、4.2 分配数据结构与方式 | 领会、识记 | 第 4 节 | 画出 SDT、DCT、COCT、CHCT 的关联,说出设备属性、安全性与分配步骤 |
| 4.3 设备独立性 | 领会 | 第 5 节 | 说明逻辑设备名到物理设备的映射 |
| 4.4 SPOOLing | 识记 | 第 6 节 | 说出组成、打印流程与虚拟设备 |
| 4.5 I/O 软件层次 | 识记 | 第 7 节 | 说出各层职责与请求返回路径 |
| 4.6 磁盘结构与时间 | 识记 | 第 8 节 | 说明格式化与访问时间的组成 |
| 4.7 磁盘调度 | 领会 | 第 9 节 | 跟踪六类算法的运行过程并算移动量 |
| 4.8 访问加速方法 | 识记 | 第 10 节 | 说出缓存、虚拟盘与读写优化 |
全章分为三部分:第 1–2 节介绍设备、控制器、通道和三种 I/O 控制方式;第 3–7 节讨论缓冲、设备分配、设备独立性、SPOOLing 与 I/O 软件层次;第 8–10 节分析磁盘访问时间、磁头调度与读写加速。
本章学习目标¶
本章分析一次 I/O 请求涉及哪些硬件和软件:应用提交请求后,系统按需安排设备、缓冲与请求队列,再由驱动程序和控制器组织传输。磁盘请求还可能经过磁盘调度。
本章的区分点有两组:轮询、中断、DMA 看 CPU 是否等待以及由谁传送数据;磁盘调度则要根据题设的初始方向和扫描边界计算移动量。
1 I/O 系统、设备和控制器(1.1–1.3,识记)¶
微机中的 CPU、主存和设备控制器通过系统总线连接。大型主机还可在 CPU 与控制器之间设置 I/O 通道,由它执行通道程序,独立管理多台控制器的数据传输,以减少 CPU 的设备管理负担。
面对五花八门的外设,教材从三个维度做分类:
| 分类依据 | 类型 | 理解要点 |
|---|---|---|
| 传输速率 | 低速、中速、高速 | 低速如键盘鼠标(每秒几字节到几百字节),高速如磁盘网卡 |
| 交换单位 | 字符设备、块设备 | 字符设备按字节流收发、不可寻址(如键盘打印机);块设备按定长块读写、可随机寻址(如磁盘) |
| 共享属性 | 独占、共享、虚拟设备 | 一段时间内只归一个进程用(打印机)、允许并发交叉访问(磁盘),或靠 SPOOLing 把独占设备包装成共享逻辑设备 |
CPU 通过设备控制器(I/O 接口)控制外设。控制器接收命令和地址、驱动设备、暂存数据,并报告忙闲与出错状态、完成差错校验。教材将控制器划分为三个部分:
- 设备控制器与 CPU 的接口:摆着数据寄存器、控制/状态寄存器,靠数据线、地址线、控制线跟系统总线相连。
- 设备控制器与设备的接口:接具体外设的数据、控制和状态信号线(一个控制器可挂一台或多台设备)。
- I/O 逻辑:整块板子的指挥中枢,里面最核心的两个部件是指令译码器(识别 CPU 发来的是读命令还是写命令)和地址译码器(比对地址总线上的设备号,确认是不是在喊自己)。
设备控制器是硬件电路,设备驱动程序是操作系统中控制该硬件的软件模块,两者不能混用。通道也是硬件,能自行取出并执行通道指令,比单纯的数据搬运控制更进一步。
2 三种 I/O 控制方式(2.1–2.3,领会)¶
I/O 控制方式的差异主要有两点:CPU 如何获知设备状态,以及由谁传送数据。
| 方式 | CPU 如何得知就绪/结束 | 谁组织数据搬运 | 主要代价 |
|---|---|---|---|
| 轮询/程序查询 | CPU 反复读取状态寄存器 | CPU 执行 I/O 指令,逐字或逐字节传送 | 等待期间持续占用 CPU |
| 中断驱动 | 设备就绪后发出中断 | CPU 在中断服务程序中传送数据 | 无需持续轮询;频繁传送时,中断处理开销较大 |
| DMA(直接存储器访问) | 数据块传完或发生错误后发出中断 | DMA 控制器直接在设备与主存之间成块传送 | 需要 DMA 硬件,CPU 负责传送前配置和结束后处理 |
2.1 轮询与中断¶
使用程序查询(轮询)时,CPU 下达读命令后反复读取状态位,直到设备就绪,再读取一个字。传送过程中 CPU 持续检查设备,等待时间不能用于其他工作。
中断驱动由设备就绪事件触发 CPU 处理。CPU 发出命令后可执行其他工作;设备准备好数据时发出中断,CPU 再读取数据并处理。该方式适合低速字符设备。若传送 4 KB 数据时每 4 字节中断一次,则需处理 1024 次中断,保护和恢复现场会产生较大开销。
2.2 DMA 过程与寄存器¶
高速成块传输可使用 DMA 控制器。CPU 设置传输参数并启动 DMA,控制器完成数据块传送,结束后再通知 CPU:
- 预处理(CPU):CPU 设置读写命令、主存起始地址和传输长度,随后启动 DMA。
- 数据传送(DMA):外设准备好一个字时,DMA 控制器申请总线使用权,将数据直接写入或读出主存,并更新地址和剩余计数。
- 后处理(CPU):传输完成或发生错误时,DMA 控制器发出中断。CPU 检查状态,并按需唤醒等待数据的进程。
为了独立干完第 2 步,DMA 控制器内部必须配齐四类寄存器:
| 寄存器 | 教材名称 | 作用 |
|---|---|---|
| CR | 命令/状态寄存器 | 存 CPU 下达的读写命令、控制位以及设备状态 |
| MAR | 内存地址寄存器 | 存当前要读写的主存地址,每传完一单位自动递增 |
| DC | 数据计数器 | 存本次还剩多少数据没传,每传完一单位自动递减 |
| DR | 数据寄存器 | 暂存设备与主存之间中转的那个字或字节 |
DMA 仍需要 CPU 参与:开始时由 CPU 初始化寄存器,结束时由 CPU 处理中断;节省的是传输过程中的逐字搬运与大量中断。周期挪用方式下,DMA 访问主存还会与 CPU 竞争总线,占用期间可能延迟 CPU 的访存。
2.3 两种「等待」不是一回事(跨课程对照)¶
两门课对“等待”的讨论层次不同。操作系统中的“进程阻塞等待 I/O”涉及进程调度;计组中的“DMA 周期挪用”涉及总线仲裁。阻塞进程让出 CPU,并不表示 CPU 在整个 I/O 期间都停止工作。
| 比较 | 操作系统的“进程阻塞” | 计组的“DMA 周期挪用” |
|---|---|---|
| 发生在哪一层 | 操作系统软件:内核将进程置为阻塞并挂入等待队列,按需进行上下文切换 | 硬件电路:DMA 控制器向总线仲裁器申请使用权 |
| 时间尺度 | 等待时长取决于设备与调度,不能由“阻塞”一词确定 | 占用单个或若干存储周期;实际时长取决于硬件与传输方式 |
| 此时 CPU 在干什么 | 有其他就绪任务时可转去执行;否则可能运行空闲任务 | 需要使用同一总线或主存的 CPU 访问可能延迟,其他可独立进行的运算仍可推进 |
| 由谁发起 | 进程执行系统调用后条件未满足,或等待的事件尚未发生 | 外设控制器或 DMA 引擎发起总线请求 |
| 如何恢复 | 事件完成后唤醒进程,重新进入就绪队列,等调度程序选中 | 总线可用后,受延迟的访存可继续,无需为此进行进程调度 |
| 对执行的影响 | 涉及进程状态与调度;阻塞调用完成后才继续执行后续代码 | 不改变程序的指令语义,但可能增加执行时间 |
进程阻塞使当前进程让出 CPU,供其他就绪进程执行;DMA 周期挪用使 CPU 暂时让出总线,可能延迟访存。两者可在同一次 I/O 中出现,也可分别发生。轮询方式通常既不阻塞当前进程,也不使用 DMA。
三处口径差异,与《计算机组成原理》第 6 章「与《操作系统概论》的对照」那一小节对着看:
- 分类:本课把异常算作中断的一类(同步中断,也称内部中断或异常),与异步中断并列在中断之下;计组把内部异常与外部中断并列为两类来源,不设统称。
- 响应步数:本课单重中断按四步讲(关中断与保护断点、保护现场、查向量表、恢复现场并返回),计组只把前半段叫中断响应,三步止于转入服务程序入口。
- 分析对象:进程阻塞讨论任务等待与重新调度,DMA 周期挪用讨论总线或主存的使用。两者可在时间上重叠,不能把等待时长与总线占用时长不加区分地相加。
3 缓冲管理(3.1–3.2,领会)¶
CPU 与 I/O 设备的处理速度及数据粒度往往不同。内存中的缓冲区用于暂存传输数据,以缓和速度差、减少中断频率、匹配数据粒度,并提高计算与 I/O 的并行程度。但缓冲只能吸收暂时的不均衡,无法长期弥补生产速度高于消费速度的问题。
3.1 单缓冲、双缓冲、循环缓冲¶
- 单缓冲:只设置一块系统缓冲区。输入数据先进入系统缓冲区,再复制到用户空间;复制完成后,系统缓冲区可接收下一块数据,进程可处理已复制的数据。输入和复制仍需协调对同一缓冲区的访问。
- 双缓冲(缓冲对换):设置两块缓冲区轮换使用。设备向 A 输入时,进程可从已装满的 B 提取数据;下一轮交换两者角色,从而增加输入与处理重叠的机会。全双工通信也可为收、发方向分别设置缓冲,但这与同一方向上的双缓冲轮换需要区分。
- 循环缓冲:将多块缓冲区首尾相接,适应连续或突发传输。教材将缓冲区分为三种状态:R(空,等待装入)、G(已满,等待提取)、C(正在生产或消费)。
Nexti指向下一个空缓冲 R,Nextg指向下一个满缓冲 G,Current指向当前读写的缓冲 C。
生产者:调 Getbuf 领一块空 R 当 Current 写入 → 写完调 Releasebuf 改成满 G
消费者:调 Getbuf 领一块满 G 当 Current 读取 → 读完调 Releasebuf 改回空 R
追空或追满时照旧得阻塞等待:生产者追上消费者说明没空缓冲了,生产者等;消费者追上生产者说明没新数据了,消费者等。
3.2 公共缓冲池¶
公共缓冲池由多个设备和进程共享,减少分别设置专用缓冲区的空间开销。缓冲区按状态加入三条队列:空缓冲队列 emq、输入队列 inq、输出队列 outq;使用时承担四种角色:收容输入 hin、提取输入 sin、收容输出 hout、提取输出 sout:
| 过程 | 从哪里取 | 做什么 | 放到哪里 |
|---|---|---|---|
| 收容输入 | emq |
外设把输入数据灌进 hin |
inq |
| 提取输入 | inq |
进程从 sin 读走数据 |
emq |
| 收容输出 | emq |
进程把待输出数据写进 hout |
outq |
| 提取输出 | outq |
驱动把 sout 数据送交外设 |
emq |
多个进程并发操作队列时,可用第 2 章的信号量机制同步。每条队列 type 设置资源信号量 RS[type],初值为队列中的缓冲块数;初始全部为空时,emq 的初值为池容量,其他两条为 0。另设互斥信号量 MS[type] 保护队列,初值均为 1:
Getbuf(type):
P(RS[type]) // 先确认该队列有货(先资源)
P(MS[type]) // 再锁住队列摘取(后互斥)
b = 从该队列移除一个缓冲
V(MS[type])
return b
Putbuf(type, b):
P(MS[type])
把 b 插入该队列
V(MS[type])
V(RS[type]) // 挂好后通知等待者有货了
Getbuf 必须先 P(RS) 申请缓冲块,再 P(MS) 锁定队列。若次序相反,队列为空时,取块进程会持有队列锁等待;归还缓冲块的 Putbuf 又无法取得锁,从而形成死锁。
4 设备分配与数据结构(4.1–4.2,领会、识记)¶
一个进程伸手要一台打印机或磁带机,光看那台设备本身闲不闲还不够——连接它的控制器甚至上游通道要是正被同一条线上的别的设备占着,数据照样过不去。内核为此用四张逐级指向的控制表把整条物理通路管起来:
| 表 | 全称 | 用途与关联 |
|---|---|---|
| SDT | 系统设备表 | 全系统一张总表,每台物理设备占一栏,记着设备类型、标识符和指向其 DCT 的指针 |
| DCT | 设备控制表 | 每台设备一张,记设备忙闲状态、等待该设备的 PCB 队列,以及它挂在哪个控制器(COCT)下 |
| COCT | 控制器控制表 | 每个控制器一张,记控制器状态、等待控制器的队列,以及它连在哪个通道(CHCT)上 |
| CHCT | 通道控制表 | 每个通道一张,记通道忙闲状态、等待通道的队列及所辖控制器列表 |
带通道的系统沿 SDT → DCT → COCT → CHCT 查找并分配设备、控制器和通道。某一级忙时,进程进入相应等待队列,整条通路可用后才能启动传输。若应用只指定设备类别,系统便可选择空闲的同类设备,避免因指定某台设备而等待,这也是第 5 节设备独立性的用途。
做设备分配决策时,内核要兼顾三件事:设备固有属性(独占设备一段时间内只给一人,共享设备如磁盘可交叉服务,虚拟设备靠 SPOOLing 多人同享)、分配算法(先来先服务或高优先级优先,体现在阻塞队列怎么排)以及分配安全性:
- 安全分配方式:进程发出 I/O 请求后阻塞,完成后再继续,因而不会在等待本次 I/O 时继续申请另一设备。在教材模型中,这避免了设备分配中的“请求和保持”;代价是该进程的计算不能与其自身 I/O 并行。
- 不安全分配方式:进程发出 I/O 请求后继续运行,还可申请其他设备。并发程度较高,但存在相互等待而死锁的风险,需要配合安全性检查,可联系第 3 章银行家算法理解。
5 设备独立性(4.3,领会)¶
设备独立性(设备无关性)要求应用程序使用逻辑设备名,避免将物理端口号或特定硬件编号写入程序。这样,设备更换或重新分配时,可由系统调整映射,减少对应用程序的影响。
内核通过逻辑设备表(LUT)建立映射。每项记录逻辑设备名、所分配的物理设备名和设备驱动程序入口。运行时可将逻辑打印机映射到空闲物理打印机,也可通过调整映射实现输出重定向,例如将原本送往屏幕的输出写入文件。
相应地,内核 I/O 软件分为两层:设备无关软件处理命名映射、权限检查、公共缓冲、块大小转换、空间分配和通用差错等共性问题;设备驱动程序将标准请求转换为特定控制器的操作。
6 SPOOLing 与共享打印(4.4,识记)¶
打印机是慢速独占设备。SPOOLing(假脱机技术)利用多道程序环境和共享磁盘,先接收并保存各进程的请求,再由后台进程依次驱动设备,使多个用户可以提交任务。系统主要由三部分组成:
- 输入井和输出井:位于磁盘上的专用存储区,分别暂存预先输入的数据和等待输出的文件,注意与内存缓冲区区分。
- 输入缓冲区和输出缓冲区:在内存里辟出的中转站,用来垫平磁盘井与物理外设之间的瞬时速度差。
- 预输入进程和缓输出进程:常驻后台的两个内核/系统服务进程,专门负责在物理外设与磁盘井之间搬运数据。
以共享打印机为例:用户提交打印任务后,系统在磁盘输出井保存数据,建立请求表并加入打印队列,用户进程即可继续执行。物理打印机空闲时,后台的缓输出进程按队列读取文件,经内存输出缓冲区送往打印机。提交完成与实际打印完成是两个阶段;SPOOLing 由此把一台物理独占设备提供为多个用户可用的逻辑设备。
7 I/O 软件层次与一次请求(4.5,识记)¶
把前面散落的模块从上往下摞齐,现代操作系统的 I/O 软件正好排成五层(连底层硬件共五层架构):
| 层次(自上而下) | 主要职责 |
|---|---|
| 用户层 I/O 软件 | 运行在用户态,包括库函数接口、格式化输入输出(如 printf),以及 SPOOLing 假脱机守护进程 |
| 设备无关软件 | 统一命名与逻辑到物理设备映射、权限保护、缓冲管理、块设备空间分配、独占设备分配与公用差错处理 |
| 设备驱动程序 | 唯一认得具体控制器寄存器布局的一层:把抽象读写请求翻成控制器命令字、填好 DMA 参数并启动硬件 |
| 中断处理程序 | 外设干完活发中断时第一时间接手:保护现场、读控制器状态确认成败、唤醒阻塞在此次 I/O 上的进程 |
| 硬件 | 设备控制器、通道与物理外设实打实完成机械与电气传输 |
以未命中缓存的阻塞式磁盘读取为例:
- 用户进程调用库函数,经系统调用进入设备无关层。
- 缓存未命中后,设备无关层调用磁盘驱动;驱动配置控制器、启动 DMA,并将读进程置为阻塞。
- 磁盘完成寻道和旋转后,DMA 将数据传入内存缓冲区。
- 设备发出完成中断,中断处理程序检查状态并唤醒读进程。
- 被唤醒的进程回到就绪队列,待调度器选中后再交付数据并继续执行。中断返回时是否立即调度该进程,取决于内核的调度与抢占策略。
8 磁盘结构、格式化与访问时间(4.6,识记)¶
传统机械硬盘由同轴旋转的盘片组成。每个盘面分成许多同心圆,称为磁道;不同盘面上半径相同的磁道合称一个柱面。切换同一柱面上的磁道通常不需要移动磁头臂,因此传统模型会将连续数据尽量安排在相邻位置。
每条磁道又分为若干扇区,常见扇区容量为 \(512\ \text{B}\) 或 \(4\ \text{KB}\)。文件系统使用的簇由若干连续扇区组成,见第 5 章。
按教材的传统磁盘模型,使用前涉及三项工作:低级(物理)格式化划分磁道与扇区,写入标识和 CRC/ECC 校验信息;分区划分逻辑存储区域,传统 MBR 在主引导记录中保存分区表;高级(逻辑)格式化建立相应文件系统的引导块、空闲空间管理结构、文件管理结构和初始根目录。具体结构因文件系统而异。
磁头固定在每条磁道上的叫固定头磁盘(贵而罕见),日常全是所有磁道共用一个可伸缩磁头的移动头磁盘。移动头磁盘完成一次扇区读写,耗时由三段相加:
- 寻道时间:机械磁头臂横移到目标磁道正上方的时间(通常是三项里的大头,几毫秒量级)。
- 旋转延迟:磁头到位后,等待盘片转到目标扇区所需的时间。若目标扇区位置均匀分布,等待时间从 0 圈到 1 圈,平均旋转延迟为半圈。
- 数据传输时间:扇区划过磁头下方、真正读出或写入比特流的时间,一般只有零点几毫秒。
自编例:硬盘转速为 \(7200\ \text{r/min}\),每秒转 \(7200 / 60 = 120\) 圈,因此转一圈需 \(1 / 120\ \text{s} \approx 8.333\ \text{ms}\),平均旋转延迟为半圈,即约 \(4.167\ \text{ms}\)。若平均寻道时间为 \(5\ \text{ms}\),单块传输时间为 \(0.1\ \text{ms}\),则平均访问时间为 \(5 + 4.167 + 0.1 = 9.267\ \text{ms}\)。题目若另给控制器开销,再将其计入。
本例中寻道与旋转延迟共约 \(9.167\ \text{ms}\),远长于单块传输时间。连续读取较大的数据块,可以摊薄多次机械定位的开销。
9 磁盘调度(4.7,领会)¶
磁盘请求队列中可能有多个不同磁道的请求。磁盘调度通过调整服务次序,减少磁头移动和寻道开销。虽然 FCFS 等名称与第 3 章进程调度相同,这里的计算对象是磁道距离:
| 算法 | 服务规则 | 关注点 |
|---|---|---|
| FCFS 先来先服务 | 按请求到达顺序处理 | 公平性较好,但请求若分散在磁盘两端,磁头移动距离可能很长 |
| SSTF 最短寻道时间优先 | 每次选择距当前磁头最近的请求 | 通常可缩短局部移动距离;远处请求可能长期等待,形成饥饿 |
| SCAN 扫描(电梯算法) | 磁头沿一个方向服务请求,到端点后反向扫描 | 可避免请求长期饥饿;刚经过的磁道需等磁头折返,等待时间仍不完全均匀 |
| C-SCAN 循环扫描 | 磁头单向服务,到端点后返回另一端继续同向扫描 | 各磁道的等待时间较均匀;回程是否计入移动距离按题设处理 |
| NStepSCAN(N 步扫描) | 将请求分成每组至多 \(N\) 个的子队列,逐组执行 SCAN | 扫描期间新请求进入后续子队列,避免新请求持续改变当前扫描次序 |
| FSCAN | 使用两条队列:一条用于当前扫描,另一条接收新请求;完成后交换 | 可视为每组请求数量不设上限的 NStepSCAN,一轮扫描结束后再处理新队列 |
计算 SCAN 和 C-SCAN 前,先确认初始移动方向及折返边界。教材的标准 SCAN/C-SCAN 移动到物理边界(如 0 或 199)后折返或返回;LOOK/C-LOOK 则以该方向最远的实际请求为界。边界口径不同,总移动道数也不同。
9.1 自编完整例¶
磁道范围 0–199,磁头初始位于 50,等待队列按到达顺序为 10、90、20、80,本轮没有新请求。初始扫描方向为磁道号增大的方向。计算到最后一个请求完成为止,C-SCAN 的跨端返回计入移动距离。
| 算法 | 运动路径 | 总移动磁道数 | 每请求平均移动 |
|---|---|---|---|
| FCFS | 50→10→90→20→80 | 40+80+70+60=250 | 62.5 |
| SSTF | 50→20→10→80→90 | 30+10+70+10=120 | 30 |
| SCAN | 50→80→90→199→20→10 | 30+10+109+179+10=338 | 84.5 |
| C-SCAN | 50→80→90→199→0→10→20 | 30+10+109+199+10+10=368 | 92 |
若题目规定“到该方向最远请求即折返”,即采用 LOOK/C-LOOK,则路径分别为 50→80→90→20→10,总移动 120;以及 50→80→90→10→20,总移动 130。本例只有 4 个静态请求,标准 SCAN 因需到达 199 边界,总道数 338 大于 FCFS 的 250。单个短例的结果不能概括算法在其他负载下的表现。
跑 SSTF 时每走完一步都要站在新磁道上重算剩余距离;万一左右两边各有一个请求离得一样近,先写明按“先来先服务”或题设规则破平局。本例第 1 步站在 50 看 20 和 80 都差 30 道,按到达先后(20 在 80 前)先去 20。
9.2 逐步累加:每一步的移动量摆出来¶
上面那张表只给总和,考场上要写的却是逐步过程。一步一行,累计量就是把上一行加上本行增量。
SSTF
| 步 | 当前磁道 | 选中请求 | 移动量 | 累计 |
|---|---|---|---|---|
| 1 | 50 | 20 | 30 | 30 |
| 2 | 20 | 10 | 10 | 40 |
| 3 | 10 | 80 | 70 | 110 |
| 4 | 80 | 90 | 10 | 120 |
SCAN(向磁道号增大方向扫,撞到 199 边界再反向)
| 步 | 当前磁道 | 动作 | 移动量 | 累计 |
|---|---|---|---|---|
| 1 | 50 | 服务 80 | 30 | 30 |
| 2 | 80 | 服务 90 | 10 | 40 |
| 3 | 90 | 扫到边界 199 | 109 | 149 |
| 4 | 199 | 反向,服务 20 | 179 | 328 |
| 5 | 20 | 服务 10 | 10 | 338 |
C-SCAN(同向扫到 199,直接跳回 0 再继续)
| 步 | 当前磁道 | 动作 | 移动量 | 累计 |
|---|---|---|---|---|
| 1 | 50 | 服务 80 | 30 | 30 |
| 2 | 80 | 服务 90 | 10 | 40 |
| 3 | 90 | 扫到边界 199 | 109 | 149 |
| 4 | 199 | 跳回 0 | 199 | 348 |
| 5 | 0 | 服务 10 | 10 | 358 |
| 6 | 10 | 服务 20 | 10 | 368 |
三张表中,SCAN 从 199 返回 20,移动 179 道;C-SCAN 返回时移动 199 道,途中不处理请求。若题设规定回程不计距离,C-SCAN 总数应减去 199,计算前需明确这一约定。
9.3 分批扫描的队列组织¶
新请求若不断到达当前磁道,可能使磁头长期停留,形成磁臂粘着。NStepSCAN 将队列分成每批至多 \(N\) 个请求的小队列,每批按 SCAN 处理,新请求进入后续批次。FSCAN 使用两条队列:开始扫描时固定当前队列,新请求进入另一条等待队列;当前批次完成后交换两条队列的角色。若题目未提供到达时刻,通常按请求一次性到齐计算,不必自行分批。
10 提高磁盘访问速度(4.8,识记)¶
除通过调度减少磁头移动外,教材还介绍以下五种提高磁盘访问效率的方法:
| 方法 | 原理 | 代价或边界 |
|---|---|---|
| 提前读(预读) | 顺序读取文件时,将相邻的下一块也读入内存 | 随机访问时,预读的数据可能未被使用,仍会占用带宽和缓存 |
| 延迟写 | 改写过的盘块先标脏留在内存缓存里,等攒够一批或空闲时再合并写回;中途若又被改写就省掉了重复写盘 | 还没落盘前万一突然断电或死机,内存里的修改就会丢 |
| 优化物理块分布 | 把同一个文件或经常一起读的块尽量排在同一柱面或相邻磁道,扇区编号也可按旋转速度做交错排列 | 依赖文件系统的空间分配策略配合 |
| 虚拟盘(RAM Disk) | 划出一片真实内存装扮成块设备,安装文件系统当超高速临时盘使 | 读写是纯内存速度,但挤占宝贵主存,且默认断电即空 |
| 磁盘高速缓存(Disk Cache) | 在主存里留出一大片缓存区,专门存近期读写过的真实磁盘块副本 | 命中时零磁盘 I/O,但要操心脏块何时刷盘与一致性 |
注意区分三者:虚拟盘以主存模拟独立磁盘,内容未必有硬盘副本;磁盘高速缓存保存硬盘数据块的内存副本,供后续命中时复用;I/O 缓冲区主要用于传输过程中的暂存与速度匹配。现代系统中,缓冲和缓存的功能可能由同一页缓存结构承担。
11 考核要求¶
本章大纲分 I/O 系统组成、控制方式、缓冲管理和设备管理四组。识记包括 1.1–1.3 组成与控制器、4.2 分配方式、4.4 SPOOLing、4.5 软件层次、4.6 磁盘结构与访问时间、4.8 提速手段;领会包括 2.1–2.3 三种控制方式、3.1–3.2 缓冲管理、4.1 设备分配、4.3 设备独立性和 4.7 磁盘调度。计算练习可重点核对第 8、9 节的访问时间求和与磁头移动道数追踪。
12 教材本章习题¶
题目取自教材第 6 章“思考题与练习题”(共 9 题),答案取自教材附录“部分习题参考答案”(全部收录)。
12.1 单项选择题¶
1. 关于 DMA 控制方式,下列说法正确的是【 】。
答案与解析
参考答案: C。CPU 在传输开始前设置参数,结束时处理完成或出错,中间过程由 DMA 控制器组织。A 忽略了初始化与结束处理;B 把完成通知说成每块必做的中断处理;D 与事实相反,DMA 正因解放 CPU 才提高了并行程度。
2. 关于 SPOOLing 系统的组成,下列说法正确的是【 】。
答案与解析
参考答案: D。输入井与输出井位于磁盘,用于暂存待处理与待输出的数据;输入缓存与输出缓存位于内存,用于在内存与设备之间中转。
3. 设备控制器的 I/O 逻辑包含的主要部件是【 】。
答案与解析
参考答案: B。I/O 逻辑负责接收并解释 CPU 发来的命令与地址,因此需要指令(命令)译码和地址译码。前者区分命令种类,后者选定寄存器或设备。
12.2 填空题¶
4. I/O 设备按信息交换的单位分类,可分为字符设备和 ___ 设备。
答案与解析
参考答案: 块。
5. 在数据到达速率与数据离去速率不同的地方,都可以引入 ___。
答案与解析
参考答案: 缓冲区。
6. 设备独立性的基本含义是___独立于具体使用的物理设备。
答案与解析
参考答案: 应用程序。
12.3 简答题¶
7. 说明设备控制器的结构和功能。
答案与解析
参考答案: 设备控制器由 CPU 接口、设备接口和 I/O 逻辑三部分组成。CPU 接口用于与主机交换命令、地址、数据和状态;设备接口连接具体设备;I/O 逻辑含指令译码与地址译码。控制器承担命令接收、地址识别、数据交换、状态报告及差错控制等功能。
8. 说明 DMA 控制器的结构和控制方式。
答案与解析
参考答案: DMA 控制器通过命令/状态寄存器 CR、内存地址寄存器 MAR、数据计数器 DC 和数据寄存器 DR 保存命令、目标地址、剩余数量及传输数据。CPU 初始化这些参数后,控制器直接在主存与设备之间组织成块传输,并在完成或出错时通知 CPU,通常以中断方式报告。
9. 什么是设备驱动程序?
答案与解析
参考答案: 设备驱动程序是实现设备专用控制逻辑的软件模块。它接收上层请求,检查参数,把请求转换为控制器可执行的命令,配置寄存器并启动传输。完成状态的处理也有它参与,上层因此不必关心设备的具体硬件细节。
13 闭卷复习与跨章联系(补充)¶
一、闭卷自答(合上书逐题口述)
- I/O 设备按传输速率、交换单位、共享属性各分几类?
- 设备控制器由哪三部分组成,CPU 接口与设备接口各管什么?
- 轮询、中断、DMA 三种控制方式怎么区分,各自由谁搬数据?
- DMA 控制器有哪四个寄存器?单缓冲、双缓冲、循环缓冲与公共缓冲池各解决什么问题?
- 设备分配用哪四张表,设备独立性是什么,SPOOLing 由哪几部分组成?
- 磁盘访问时间由哪三段组成,六种调度算法怎么走?
二、本章易错
- 设备控制器是硬件,设备驱动程序是控制该硬件的软件,两者不是一回事(第 1 节)。
- DMA 只把块传输交给控制器,初始化和结束处理仍由 CPU 做(第 2.2 节)。
- 旋转等待平均约半圈,不是一整圈(第 8 节)。
三、本章骨架
| 板块 | 内容 | 所在节 |
|---|---|---|
| 硬件 | 设备分类、控制器、通道 | 第 1 节 |
| 控制方式 | 轮询、中断、DMA | 第 2 节 |
| 软件 | 缓冲、分配、独立性、SPOOLing、层次 | 第 3–7 节 |
| 磁盘 | 访问时间、六种调度、加速方法 | 第 8–10 节 |
四、跨章指路
- 公共缓冲池的
Getbuf/Putbuf与进程发起读盘后的阻塞—中断唤醒链路,直接复用信号量与三态转换机制(见第 2 章)。 - 一次读文件请求到底要把哪些簇号排进磁盘调度队列,由 FAT 或 i 结点地址结构决定(见第 5 章)。见《计算机组成原理》第 6 章:那边拆解总线仲裁、中断电路与 DMA 控制器的硬件细节,这边讲操作系统内核如何在其上做排队、分配、假脱机与缓冲。