跳转至

第5章 输入/输出管理

2027 王道 · 专题阅读 · 保留代码与校订注 · 与版本锁一致

第5章 输入/输出管理

本章内容较分散,重点:I/O 接口、I/O 软件、I/O 控制方式、缓冲区管理、SPOOLing 技术、磁盘特性与调度算法。⚠️ 涉及较多硬件知识,建议结合《计算机组成原理》复习;历年分值不大但命题直接,复习到就能答对。

回源 · PDF 第 317 页 · b_317_7

【知识树】第5章骨架

  • I/O 管理概述
  • 设备分类、I/O 接口(设备控制器)、I/O 端口与两种编址
  • 四种 I/O 控制方式:程序直接控制 / 中断驱动 / DMA / 通道
  • I/O 软件四层:用户层 / 设备独立性软件 / 设备驱动 / 中断处理
  • 应用程序 I/O 接口:字符设备 / 块设备 / 网络设备、阻塞与非阻塞
  • 设备独立软件
  • 缓冲区管理:单缓冲、双缓冲、循环缓冲、缓冲池
  • 设备分配与回收(DCT/COCT/CHCT/SDT)
  • SPOOLing 假脱机技术
  • 外存管理
  • 磁盘结构、格式化与分区
  • 磁盘调度算法:FCFS / SSTF / SCAN / C-SCAN / LOOK
  • 固态硬盘 SSD:读写特性、磨损均衡
回源 · PDF 第 317 页 · b_317_2;PDF 第 317 页 · b_317_3

5.1 I/O 管理概述

一个 I/O 设备由哪两部分组成?

  • 设备本身:执行具体输入/输出的物理装置(如磁盘的盘片与磁头)
  • 设备控制器:连接到系统总线上的专用电路,⚠️ 把操作系统发出的抽象命令(如"读取第 x 个扇区")转换为设备可识别的电信号

💡 意义:操作系统无须了解各类设备的具体细节即可统一管理。

回源 · PDF 第 317 页 · b_317_0

块设备和字符设备的三点区别?

  • 块设备:以固定大小的数据块为单位(如磁盘);⚠️ 传输速率较高、支持随机访问(可寻址)
  • 字符设备:以字符(字节)为单位(如终端、打印机);⚠️ 传输速率较低、不可寻址、通常用中断方式实现异步通信

其他三种分类: - 按传输速率:低速(键盘鼠标,每秒几字节至数百字节)、中速(激光打印机,数千至数十千字节)、高速(磁盘,数百千字节至数百兆字节) - 按使用特性:人机交互设备、存储设备、网络通信设备 - 按共享属性:独占设备(如打印机,典型的独占设备多为低速设备)、共享设备(如磁盘)、虚拟设备(⚠️ 通过 SPOOLing 把独占设备改造为多个逻辑设备,实质是用高速共享设备作缓冲)

回源 · PDF 第 318 页 · b_318_0;PDF 第 318 页 · b_318_3

设备控制器由哪三部分组成?有哪六个功能?

三部分: - 与 CPU 的接口:数据线、地址线、控制线 —— ⚠️ 地址线用于指定 I/O 接口中的寄存器编号 - 与设备的接口:一个控制器可连接一个或多个设备,每个接口传输数据、控制、状态三类信号 - I/O 逻辑:对接收的 I/O 命令译码,依据目标地址识别相应设备

六个功能:接收并识别命令、完成数据交换、标识并报告设备状态、地址识别、数据缓冲、差错控制。

💡 例:磁盘控制器收到"读取第 11408 个扇区" → 自动把线性扇区号转换为柱面号、盘面号和扇区号,控制磁头定位、等待旋转延迟、读数据。

回源 · PDF 第 318 页 · b_318_1

I/O 端口是哪三类寄存器?

  • 数据寄存器:缓存输入数据或暂存 CPU 的输出数据
  • 状态寄存器:保存设备状态或执行结果,供 CPU 读取
  • 控制寄存器:由 CPU 写入,启动操作或设置工作模式

💡 I/O 端口 = 设备控制器中可被 CPU 访问的寄存器,每个端口对应一个唯一的端口地址。

回源 · PDF 第 319 页 · b_319_12

独立编址和统一编址的优缺点?

  • 独立编址(I/O 映射):I/O 端口有独立于主存的地址空间,⚠️ 地址值可以相同但不冲突;用专用 I/O 指令(x86 的 IN/OUT)访问
  • 优点:⚠️ 地址线少、译码电路简单、寻址速度快;程序中 I/O 操作清晰可辨
  • 缺点:⚠️ I/O 指令功能有限、灵活性差;CPU 需同时提供两组读/写控制信号
  • 统一编址(内存映射):I/O 端口与内存单元共享同一地址空间,⚠️ 用普通访存指令即可访问
  • 优点:编程灵活、编址空间大;⚠️ 保护机制可由虚拟存储管理系统统一实现,无须额外硬件
  • 缺点:⚠️ 占用主存地址空间;译码电路复杂、译码速度降低
回源 · PDF 第 319 页 · b_319_9;PDF 第 319 页 · b_319_11

5.1.2 I/O 控制方式

四种 I/O 控制方式的发展主线是什么?

⚠️ 贯穿始终的宗旨:尽量减少 CPU 对 I/O 控制的干预,把 CPU 从繁杂的 I/O 事务中解脱出来。

💡 教材裁缝店类比: - 程序直接控制:客户每隔一段时间亲自跑店里看衣服做好没 - 中断驱动:裁缝做完一件就打电话通知,但每件都要跑一趟 - DMA:雇个秘书,衣服暂存仓库,每 100 件才向客户汇报一次 - 通道:给秘书一份办事清单,汇报时机由秘书自行判断,且一个秘书能对接多位裁缝

💡 统一比较只问三件事:① 谁搬数据(CPU 还是 DMA/通道);② 一次搬多大(字/字符还是批量块);③ CPU 何时介入(全程轮询、每次完成、首尾设置、只下达通道程序)。这样比死背四段定义更稳。

回源 · PDF 第 320 页 · b_320_2

程序直接控制方式为什么 CPU 利用率低?

CPU 发出 I/O 指令后不断循环测试设备状态(轮询),直到数据到达数据寄存器,再取出送入内存。

⚠️ CPU 与 I/O 设备只能串行工作,CPU 绝大部分时间处于等待状态,而两者速度差异巨大 → 利用率相当低。

⚠️ 根本原因:CPU 中未采用中断机制,I/O 设备无法主动向 CPU 报告完成。

回源 · PDF 第 320 页 · b_320_3;PDF 第 320 页 · b_320_5

中断驱动方式下 CPU 和控制器各做什么? ★2考

从设备控制器看:接收读命令 → 从设备读数据 → 数据进入数据寄存器后发中断信号 → 等 CPU 来取 → 把数据放到数据总线传到 CPU 寄存器。

从 CPU 看:⚠️ 当前运行进程发出读命令后将被阻塞,保存上下文转去执行其他程序;⚠️ 在每个指令周期的末尾检查中断信号;有中断则保存被中断现场 → 执行中断处理程序 → 从数据寄存器读一个字节写入内核缓冲区 → 唤醒原 I/O 进程并把它加入就绪队列 → 中断返回。

⚠️ 校订/边界:唤醒不等于立即恢复该 I/O 进程。中断返回通常先回到被中断的执行流;原 I/O 进程何时运行,由后续调度决定。

两个遗留问题: - ⚠️ 设备与内存之间的数据交换都必须经过 CPU 中的寄存器 - ⚠️ CPU 以字(节)为单位干预,用于块设备极其低效

★ 考过 2017、2023

回源 · PDF 第 321 页 · b_321_1

DMA 方式的三个特点和四类寄存器? ★1考

三个特点: - 基本传送单位是数据块,而不是字(节) - ⚠️ 数据直接在设备与内存之间传输,不再经过 CPU - ⚠️ 仅在数据块传送的开始和结束时需要 CPU 干预

四类寄存器: - 命令/状态寄存器 CR:暂存 CPU 发来的 I/O 命令或设备状态 - 内存地址寄存器 MAR:⚠️ 输入时是写入内存的目标地址,输出时是读取的源地址 - 数据寄存器 DR:暂存单次传输的数据单元 - 数据计数器 DC:记录本次需传送的字(节)总数

工作流程:CPU 设置 MAR 和 DC 初值 → 启动 DMA 控制器 → 转去执行其他任务;DMA 控制器在设备与主存之间批量传输一个或多个数据块;结束后向 CPU 发中断。

⚠️ 校订/边界:DMA 可采用突发、周期挪用或交替等总线使用方式,传输计数也由控制器/题设决定;不能把“突发方式传恰好一个整块”当成唯一实现。

★ 考过 2017

回源 · PDF 第 321 页 · b_321_12

通道和 DMA 的两点区别?

I/O 通道是一种专用处理机,能执行存放在主存中的通道程序。CPU 只需发一条 I/O 指令指明设备和通道程序的起始地址,通道即自主完成全部 I/O 操作并在结束后发中断。

通道 vs DMA: - ⚠️ DMA 需由 CPU 预设数据块大小、内存始址等参数;通道通过执行程序动态确定参数,能自主完成涉及多台设备、多个阶段的复杂 I/O 任务 - ⚠️ DMA 的参数通常由 CPU 逐次预设,自主性低于通道;通道可执行通道程序,适合多设备、多阶段 I/O

⚠️ 校订/边界:DMA 控制器与设备不一定一一对应,一个控制器可有多个通道或服务多设备;具体拓扑依实现,核心差别是能否执行通道程序与自主组织复杂 I/O。

通道 vs 通用处理机:⚠️ 指令集专用于 I/O、功能单一;⚠️ 不具备独立的主存储器,通道程序和数据都存放在主机内存中,且所有访存操作均受 CPU 控制。

回源 · PDF 第 322 页 · b_322_2

5.1.3 I/O 软件层次结构

I/O 软件为什么要分层?分哪四层? ★3考

分层的好处:结构清晰、可移植性和适应性好 —— 只要层间接口保持稳定,上层通常无须了解下层细节。

四层(自上而下):用户层软件 → 设备独立性软件 → 设备驱动程序 → 中断处理程序 → (硬件)

用户层软件:实现与用户的交互接口,可直接调用 I/O 库函数;⚠️ 大部分 I/O 软件在内核,但仍有一小部分驻留在用户层(如与用户程序链接的库函数),必须通过系统调用获取操作系统服务。

⚠️ 校订/边界:不能说“只有最低层与硬件相关”。设备驱动程序直接操作硬件,中断处理层也可能设备相关;设备独立性层才负责把这些差异向上屏蔽。

💡 两条链分开画:控制流是“用户层→设备独立层→驱动→中断处理→硬件”;数据流是“设备/寄存器→内核缓冲区→用户缓冲区”。

★ 考过 2011、2012、2013

回源 · PDF 第 322 页 · b_322_0

什么是设备独立性?它靠什么实现? ★1考

设备独立性(设备无关性) = 应用程序使用 I/O 设备时无须依赖具体的物理设备 —— 应用程序用逻辑设备名请求某类设备,系统运行时把逻辑设备名映射为物理设备名。

两个优势:提高设备分配的灵活性;⚠️ 易于实现 I/O 重定向 —— 更换设备而不必修改应用程序。

设备独立性软件的两大功能: - 执行所有设备的公共操作:设备的分配与回收、逻辑设备名到物理设备名的映射、设备保护(禁止用户直接访问硬件)、缓冲管理、差错控制,以及⚠️ 提供统一大小的逻辑块,屏蔽不同设备在信息交换单位和传输速率上的差异 - 向用户层(或文件系统)提供统一的接口

★ 考过 2020

回源 · PDF 第 323 页 · b_323_3

设备驱动程序的五步工作流程? ★1考

⚠️ 每类设备都需要配置一个专用的驱动程序,它是 I/O 子系统与设备控制器之间的通信桥梁。 - ① 将抽象请求转换为具体操作:例如磁盘驱动把逻辑扇区号转换为柱面号、盘面号和扇区号 - ② 校验请求的合法性:⚠️ 禁止从只写设备(打印机)读取,或向只读设备写入 - ③ 检查设备状态:读状态寄存器确认是否就绪,否则进程等待 - ④ 传递参数:向控制器寄存器写入命令、数据缓冲区地址、传输长度 - ⑤ 启动设备并处理后续:⚠️ 当前进程随即被阻塞,CPU 转去执行其他就绪进程;设备完成发中断后由中断处理程序将其唤醒

★ 考过 2025

回源 · PDF 第 323 页 · b_323_8

中断处理的五个步骤?

  • ① 检测并响应中断:⚠️ CPU 在指令周期末检测中断信号
  • ② 保护被中断进程的 CPU 现场:⚠️ 硬件自动把 PC 和 PSW 压入中断栈,操作系统软件再保存其他寄存器
  • ③ 转入相应设备的中断处理程序
  • ④ 处理中断:读状态寄存器判断是否正常完成 → 成功则把数据寄存器内容传送到内存缓冲区,异常则错误处理
  • ⑤ 恢复现场并返回:从中断栈恢复寄存器,从被中断指令的下一条继续执行
回源 · PDF 第 324 页 · b_324_0;PDF 第 324 页 · b_324_1

中断处理程序的注册、处理、注销?

  • 注册中断:⚠️ 驱动程序初始化时向内核注册中断号及处理函数入口地址
  • 处理中断:① 确认中断是否由本设备产生;② 清除控制器中的中断标志防止重复触发;③ 执行硬件操作
  • ⚠️ 由于运行在中断上下文中,处理程序必须快速、非阻塞,不得调用可能引起进程睡眠或调度的函数
  • 注销中断:⚠️ 独占中断请求线 → 注销后内核立即禁用;共享中断线 → 仅移除本设备的处理例程,等所有关联设备都注销后才禁用
回源 · PDF 第 324 页 · b_324_1

一次 write 请求怎么穿过四层? ★2考

  • ① 用户通过 write 命令接口发起请求,进入用户层软件
  • ② 设备独立性层解析这个统一的通用接口命令,传给下一层
  • ③ ⚠️ 设备驱动层把通用的 write 命令转换为设备特定的指令(磁盘与打印机行为差异显著)
  • ④ 驱动把指令发给设备控制器启动写操作,完成后控制器发中断
  • ⑤ 中断处理程序确认完成、清除中断标志、唤醒等待进程,结果逐层返回

★ 考过 2010、2024

回源 · PDF 第 324 页 · b_324_0

Linux 中 write 调用的完整执行流程?

⚠️ 以下是教材 IA-32 同步设备 I/O 示例链,先假定用户态缓冲确实需要下发: - 用户空间:printf() 可能先写 C 标准库缓冲;当缓冲刷新或直接调用 write() 时,才进入 write 系统调用封装函数 - ⚠️ 执行陷阱指令(IA-32 下的 int 0x80)前,若干传送指令把系统调用号及参数写入寄存器(如 eax) - ⚠️ 陷阱指令产生一个受控的软中断,硬件自动完成从用户态到内核态的模式切换 - 内核态:跳到统一入口 system_call() → 按 eax 中的系统调用号经跳转表分派给 sys_write() - sys_write() 先做与设备无关的公共操作(参数合法性检查、内核缓冲区分配)→ 按文件描述符定位目标设备 → 调用设备驱动 - 驱动初始化 I/O 接口、设置参数、启动传输;若本次调用必须等待设备完成,才把当前进程置为阻塞态并让出 CPU - 传输完成 → 控制器发中断 → 中断服务程序读状态、清标志、唤醒进程 - ⚠️ 最终在 system_call() 末尾执行 iret 等特权指令切回用户态,在陷阱指令的下一条指令处恢复执行

💡 一句话总结:系统调用指令(trap/syscall/sysenter 等)是用户程序主动请求内核服务的受控入口;外中断和执行异常也能使 CPU 受控进入内核。

⚠️ 校订/边界:buffered write 可能写入内核缓存后就返回,不必阻塞到物理设备完成;因此本卡不能推广为所有 printf()/write() 的唯一流程。

回源 · PDF 第 325 页 · b_325_0

三类设备接口的操作各是什么?

  • 字符设备接口:⚠️ 不可寻址只能顺序存取,通常设一个字符缓冲区 —— 用 get 从缓冲区读、put 向缓冲区写;还提供通用的 in-control 指令(含多个参数)指定设备相关的特定功能;⚠️ 大部分字符设备是独占设备,所以还需提供打开和关闭操作实现互斥共享
  • 块设备接口:常用 read()、write()、seek()(seek() 用来指定下一个传输块);⚠️ 隐藏磁盘的物理二维结构(磁道号+扇区号),把所有扇区从 0 到 n−1 依次编号,变成线性地址空间;磁盘 I/O 常用 DMA 方式
  • 网络设备接口:多数系统采用套接字(Socket)接口作为网络 I/O 标准
回源 · PDF 第 325 页 · b_325_7

阻塞 I/O 和非阻塞 I/O 的优缺点?

  • 阻塞 I/O(⚠️ 多数操作系统默认采用):数据未就绪时进程立即被阻塞并移入等待队列,完成后内核把它移回就绪队列
  • 优点实现简单,适用于顺序处理或低并发;缺点是调用进程等待期间不能继续执行
  • 💡 类比:咖啡店点单后原地干等
  • 非阻塞 I/O:⚠️ 系统调用立即返回,数据未就绪时返回"暂无数据"的错误状态(如 −1),进程可继续执行其他任务并择机重试
  • 优点适合高并发或高响应性应用;⚠️ 缺点采用轮询方式频繁检查 I/O 状态,浪费 CPU
  • 💡 类比:点单后去逛商场,每隔一段时间回来问"好了吗"

⚠️ 校订/边界:阻塞的是调用者,不是整个 CPU;调度器通常可运行其他就绪进程,只有没有任何可运行任务时 CPU 才会空闲。

回源 · PDF 第 326 页 · b_326_3

I/O 管理的四个核心功能?

  • 状态监控:掌握设备的忙、就绪、故障等状态
  • 数据传输:协调主机与设备之间的数据交换
  • 设备分配:多用户/多进程环境下的分配、共享与回收
  • 设备控制:通过驱动程序启动 I/O,并处理完成信号或故障中断
回源 · PDF 第 326 页 · b_326_13

5.2 设备独立性软件

设备独立性软件的五项公共功能?

⚠️ 它位于设备驱动程序之上,是内核 I/O 子系统的最高层;⚠️ 它与驱动程序之间的界限并非固定,某些功能有时会被下放至驱动程序。 - 提供统一的驱动程序接口:把抽象设备名映射到物理设备并定位驱动入口 - 缓冲管理:单缓冲、双缓冲、环形缓冲、缓冲池 - 差错控制:⚠️ 暂时性错误(如网络丢包)通过重试纠正,主要由驱动程序处理;持久性错误(如磁盘划痕)记入坏块表,后续 I/O 自动绕过 - 独占设备的分配与回收 - 提供统一的逻辑数据块:屏蔽字符设备按字节、块设备按块且块长不一的差异

回源 · PDF 第 332 页 · b_332_3;PDF 第 332 页 · b_332_6

磁盘高速缓存和硬件 Cache 有什么不同? ★1考

⚠️ 磁盘高速缓存不是 CPU 与主存之间的硬件高速缓存,而是利用内存中的存储空间暂存从磁盘读取的盘块数据 —— 逻辑上是磁盘内容的副本,物理上驻留在内存中。

两种组织形式:在内存中开辟固定大小的专用缓存区;⚠️ 把系统空闲内存作为动态缓冲池,供请求分页系统和磁盘 I/O 子系统共享。

★ 考过 2015

回源 · PDF 第 332 页 · b_332_11

引入缓冲区的四个目的?

  • 缓和 CPU 与 I/O 设备速度不匹配的矛盾
  • ⚠️ 减少对 CPU 的中断频率,放宽对中断响应时间的限制
  • ⚠️ 解决基本数据单元大小(数据粒度)不匹配的问题
  • 提高 CPU 与 I/O 设备之间的并行性

实现方法:硬件缓冲器(成本高,一般不采用);用内存作缓冲区(本章讨论的)。

回源 · PDF 第 333 页 · b_333_1;PDF 第 333 页 · b_333_2

单缓冲处理一块数据要多久? ★2考

三个时间:T(设备送一块数据到缓冲区)、M(缓冲区传到用户工作区)、C(CPU 处理)。 ⚠️ 对块设备,必须等整块数据装入缓冲区后才能传送到工作区。

单缓冲:T 可与 C 并行 - T > C:CPU 处理完要等设备装满缓冲区 → 每块耗时 T + M - T < C:设备装满后要等 CPU 处理完才能腾出缓冲区 → 每块耗时 C + M

结论:单缓冲每块耗时 = Max(T, C) + M。

⚠️ 单缓冲区是共享资源,设备与 CPU 对其访问必须互斥。

★ 考过 2011、2013

回源 · PDF 第 333 页 · b_333_15

双缓冲处理一块数据要多久? ★1考

双缓冲(缓冲对换):设备向一个缓冲区写的时间 T,可与"传送 + 处理"的时间 C + M 并行。 - T > C + M:⚠️ 设备可连续工作,系统要等缓冲区装满 → 每块耗时 T - T < C + M:⚠️ 设备输入较快,CPU 无须等待设备 → 每块耗时 C + M

结论:双缓冲每块耗时 = Max(T, C + M)。

⚠️ 双机通信场景:要实现全双工,每台机器需分别设置发送缓冲区和接收缓冲区;若每台机器只配一个缓冲区,则无法同时收发。

★ 考过 2011

💡 对照记忆:单缓冲 Max(T, C) + M;双缓冲 Max(T, C + M) —— 双缓冲把 M 也并行进去了。

回源 · PDF 第 334 页 · b_334_3

循环缓冲的两个指针和两种同步情形?

若干大小相等的缓冲区用链接指针串成循环队列;系统维护两个指针:in 指向下一个待写入的空缓冲区,out 指向下一个待读取的满缓冲区。

  • ⚠️ in 追上 out(系统受计算限制):输入快于计算,所有缓冲区都满 → 输入进程阻塞,等计算进程取走数据释放空缓冲区后被唤醒
  • ⚠️ out 追上 in(系统受 I/O 限制):计算快于输入,所有缓冲区都空 → 计算进程阻塞,等输入进程写入后被唤醒

💡 引入原因:双缓冲在输入输出速度基本匹配时效果好,速率相差较大时就要用多缓冲/循环缓冲。

⚠️ 校订/边界:仅凭 in == out 无法同时区分“全空”和“全满”。完整实现还需维护 count、维护 full 标志,或永远预留一个空槽;本卡的“追上”语义必须建立在其中一种状态编码上。

回源 · PDF 第 334 页 · b_334_11;PDF 第 334 页 · b_334_13

缓冲池的三个队列和四种工作方式?

⚠️ 缓冲池不只是一块内存,而是一种包含管理数据结构和操作函数的软件机制,供多进程共享。

三个队列:空缓冲队列、输入队列、输出队列。 四种角色:收容输入 hin、提取输入 sin、收容输出 hout、提取输出 sout。

四种工作方式: - 收容输入:从空缓冲队列队首摘一个 → 写入数据 → 装满后挂到输入队列队尾 - 提取输入:从输入队列队首摘一个 → 读数据 → 读完挂到空缓冲队列队尾 - 收容输出:从空缓冲队列队首摘一个 → 写输出数据 → 装满后挂到输出队列队尾 - 提取输出:从输出队列队首摘一个 → 读数据 → 读完挂到空缓冲队列队尾

💡 规律:取都从队首,还都到队尾。

回源 · PDF 第 335 页 · b_335_2;PDF 第 335 页 · b_335_3

高速缓存和缓冲区的两点区别?

相同点:⚠️ 都位于高速设备和低速设备之间,用于缓解速度差异。

区别 高速缓存 缓冲区
存放数据 ⚠️ 已存在于慢速设备上的数据副本,可长期驻留直至被替换 ⚠️ 正在传输过程中的数据,传输完成后通常立即释放
目的 提高重复访问的效率(命中则避免访问低速设备) 提高传输效率与并行性(协调速度差异、降低中断频率、匹配数据粒度)
回源 · PDF 第 335 页 · b_335_13

5.2.3 设备分配与回收

设备分配的四张表分别管什么?

  • 设备控制表 DCT:⚠️ 每个物理设备一张;字段有设备类型、设备标识符(物理设备名,系统内唯一)、设备状态(忙/闲)、指向控制器表的指针、重复执行次数或时间、设备队列的队首指针(指向因请求该设备而阻塞的进程 PCB 队列)
  • 控制器控制表 COCT:每个控制器一张;含控制器标识符、状态、与控制器连接的通道表指针、队列首尾指针
  • 通道控制表 CHCT:每个通道一张;含通道标识符、状态、与通道连接的控制器表首址、队列首尾指针
  • 系统设备表 SDT:⚠️ 整个系统只有一张,是所有物理设备的全局索引

⚠️ 回收:进程释放设备且无其他进程等待时,把 DCT 中的设备状态置为空闲。

回源 · PDF 第 336 页 · b_336_3;PDF 第 336 页 · b_336_4

设备分配要考虑哪三方面? ★1考

  • 设备的固有属性:独占设备(用完或终止才释放)、共享设备(需调度协调访问顺序)、虚拟设备(SPOOLing 虚拟化后可并发提交请求)
  • 设备分配算法:FCFS;最高优先级优先(⚠️ 优先级相同时按 FCFS 排队)
  • 设备分配中的安全性:
  • 安全分配方式:⚠️ 发出 I/O 请求后立即阻塞,直到完成才唤醒,期间不再请求任何其他资源 → 有效避免死锁;缺点是同一进程的计算与 I/O 不能重叠,推进较慢
  • 不安全分配方式:⚠️ 发出请求后仍继续运行,可发第二、第三个请求,只有所请求的设备已被占用时才阻塞 → 进程推进迅速,但可能因循环等待造成死锁

★ 考过 2023

⚠️ 校订/边界:上述“串行”只针对同一进程;系统仍可让 CPU 运行其他进程,也可让其他设备并行工作。

回源 · PDF 第 337 页 · b_337_2

设备分配的三个步骤?为什么要用逻辑设备名?

  • ① 分配设备:按物理设备名查 SDT → 找到 DCT → 看设备状态;忙则把 PCB 挂入设备等待队列
  • ② 分配控制器:由 DCT 找到 COCT;忙则挂入控制器等待队列
  • ③ 分配通道:由 COCT 找到 CHCT;忙则挂入通道等待队列 ⚠️ 只有设备、控制器、通道三者全部分配成功,此次分配才算完成,随后才能启动设备传送数据。

⚠️ 按物理设备名分配缺乏设备独立性 —— 指定设备被占用就直接失败。 改用逻辑设备名后:系统从 SDT 中依次查找该类设备的 DCT,只要有一个空闲就继续后续分配;⚠️ 仅当所有同类设备都忙时,才把进程挂入该类设备的公共等待队列。

💡 “三道门”做题法:先由逻辑名/LUT 确定设备类,再沿 SDT→DCT→COCT→CHCT 逐级检查;设备、控制器、通道任一道忙,都要明确 PCB 挂到哪一层的等待队列。

回源 · PDF 第 337 页 · b_337_14

逻辑设备表 LUT 里存什么?两种设置方式? ★1考

LUT 建立逻辑设备名到物理设备名的映射,每个表项含三项:逻辑设备名、物理设备名、驱动程序入口地址。

两种设置方式: - 整个系统仅设一张 LUT:⚠️ 要求所有用户不能使用相同的逻辑设备名 → 适用于单用户系统 - 每个用户一张 LUT:⚠️ 不同用户可以使用相同的逻辑设备名,互不干扰 → 适用于多用户系统(系统仍维护全局的 SDT)

★ 考过 2009

回源 · PDF 第 337 页 · b_337_19

SPOOLing 中的"假"和"脱机"分别指什么?

思想源于早期脱机 I/O:靠专用外围控制机在主机不参与的情况下完成 I/O。

⚠️ "脱机"承袭自早期脱机 I/O 的思想;"假"体现在用多道程序和磁盘空间替代外围机 —— 现代系统不再需要物理外围机,而是用专门的输入进程与输出进程在主机直接控制下模拟外围机的功能。

效果:把一台物理独占设备虚拟为多台逻辑设备,实现设备共享,并让 I/O 与 CPU 计算并行。

回源 · PDF 第 338 页 · b_338_6;PDF 第 338 页 · b_338_7

SPOOLing 系统由哪四部分组成?

  • 输入井和输出井:⚠️ 在磁盘上开辟的两个专用存储区域;每个进程的数据以井文件形式保存,按顺序链接成输入队列或输出队列
  • 输入缓冲区和输出缓冲区:⚠️ 在内存中开辟;输入缓冲区暂存输入设备来的数据再送到输入井,输出缓冲区暂存从输出井读出的数据再送到输出设备
  • 输入进程和输出进程:模拟脱机 I/O 的外围控制机
  • 井管理程序:控制作业与磁盘井之间的信息交换

⚠️ 别记混:井在磁盘上,缓冲区在内存中。

回源 · PDF 第 338 页 · b_338_9

打印机是怎么被虚拟成多台的? ★1考

多个用户发出打印请求时,SPOOLing 接受请求但并不真正分配物理打印机,而是由输出进程做两件事: - ① 在磁盘输出井中分配一个空闲盘块,把待打印数据写入 - ② 申请一张用户请求打印表记录打印要求,挂到假脱机打印队列上

⚠️ 此时用户进程即认为打印任务已完成,可继续执行后续代码(真实打印尚未开始,该过程对用户完全透明)。

真正的打印由后台的假脱机打印进程负责:打印机空闲时检查队列 → 取队首请求表 → 从输出井读入内存缓冲区 → 送物理打印机;⚠️ 队列为空则进入等待状态,直到有新请求将其唤醒。

★ 考过 2016

回源 · PDF 第 339 页 · b_339_3;PDF 第 339 页 · b_339_8

SPOOLing 的三个特点?为什么说它以空间换时间?

三个特点: - 提高了 I/O 速度:把对低速设备的操作转化为对磁盘输出井中数据的存取 - ⚠️ 将独占设备改造为共享设备:实际上并未把物理设备分配给任何进程 - 实现了虚拟设备功能:每个进程都认为自己独占了一台设备

⚠️ 以空间换时间:牺牲磁盘空间(输入井和输出井),换取时间 —— 因为磁盘与内存交换数据的速度远高于打印机等低速设备,CPU 把数据快速写入磁盘输出井后即可继续执行其他任务。

回源 · PDF 第 339 页 · b_339_7

设备驱动程序的四项功能? ★3考

  • ① 接收上层命令和参数,⚠️ 把抽象 I/O 请求转换为设备相关的操作指令(如逻辑盘块号 → 盘面号、磁道号、扇区号)
  • ② 检查请求合法性、查询设备状态、传递参数、设置工作方式
  • ③ 发出 I/O 命令:⚠️ 设备空闲则立即启动;设备正忙则把请求进程的 PCB 挂到该设备的等待队列
  • ④ 及时响应中断请求,按中断类型调用相应的中断处理程序

★ 考过 2013、2019、2023

回源 · PDF 第 339 页 · b_339_11

设备驱动程序的五个特点? ★1考

  • 在抽象 I/O 请求与具体设备操作之间实现双向转换,并把状态及完成情况反馈给请求进程
  • ⚠️ 其实现与设备采用的 I/O 控制方式(中断驱动、DMA)紧密相关
  • ⚠️ 不同类型的设备必须配备相应的专用驱动程序
  • 部分底层驱动功能可能由设备固件或系统 ROM 提供
  • ⚠️ 驱动程序应设计为可重入的,以支持多个进程对同一设备的并发调用

统一接口的三点要求:遵循相同或相近的接口规范;把逻辑设备名映射为物理设备名并定位驱动入口;对设备访问实施权限控制。

★ 考过 2022

回源 · PDF 第 340 页 · b_340_0

为什么数据要先进内核缓冲区再进用户缓冲区?

⚠️ 因为内核空间与用户空间相互隔离:内核空间存放操作系统代码和数据供所有进程共享,用户程序运行在用户空间;系统调用在内核态执行,所以必须先把设备数据复制到内核缓冲区,返回前再复制到用户缓冲区。

⚠️ 两次搬运的负责层次不同(高频考点): - I/O 端口 → 内核缓冲区:由设备驱动程序完成(因其需直接操作 I/O 端口) - 内核缓冲区 → 用户缓冲区:由设备无关的 I/O 软件层完成(因其不依赖具体硬件)

回源 · PDF 第 341 页 · b_341_3;PDF 第 341 页 · b_341_5

scanf() 的完整执行过程?

第一阶段(C 标准库中): - 检查与 scanf() 关联的用户缓冲区 buf:⚠️ 有数据则直接读取;为空才触发 read 系统调用 - 执行 read 前传入三个参数:fd(文件描述符)、buf(用户缓冲区)、count(期望读取的最大字节数)

第二阶段(内核中,中断驱动方式): - ① 设置 I/O 参数后,发起 I/O 的进程 P 进入阻塞态,CPU 调度其他进程 - ② 用户键入字符,字符送入键盘 I/O 接口的数据端口 - ③ 键盘 I/O 接口向 CPU 发出中断请求 - ④ CPU 执行键盘中断处理程序,把字符从 I/O 端口送入内核缓冲区 - ⑤ 进程 P 被唤醒并加入就绪队列 - ⑥ 再次获得 CPU 后,系统调用服务例程把字符从内核缓冲区复制到用户缓冲区 - ⑦ 从系统调用返回,scanf() 解析字符存入变量 d

💡 双线复述:控制流是“用户库→系统调用→驱动→阻塞→中断→唤醒→以后再调度”;数据流是“键盘→I/O 端口→内核缓冲区→用户缓冲区→变量 d”。最关键的断点是:唤醒只进入就绪队列,不等于立即继续执行 read。

回源 · PDF 第 340 页 · b_340_4;PDF 第 340 页 · b_340_8;PDF 第 340 页 · b_340_10;PDF 第 340 页 · b_340_14;PDF 第 340 页 · b_340_15;PDF 第 341 页 · b_341_0;PDF 第 341 页 · b_341_3

5.3 磁盘和固态硬盘

磁盘的物理结构和地址表示? ★2考

  • 磁道:盘面上的同心圆,⚠️ 每个磁道宽度与磁头相当,一个盘面包含上千个磁道
  • 扇区:磁道划分成的数百个片段,大小固定(如 1KB),⚠️ 是磁盘寻址的最小物理单位;相邻磁道及扇区间留有间隙避免读写干扰
  • 柱面:⚠️ 所有盘片上半径相同的磁道构成一个柱面
  • 磁盘地址 = 柱面号 · 盘面号 · 扇区号;⚠️ 总容量由柱面数、盘面数、每磁道扇区数共同决定

⚠️ 传统设计每个磁道扇区数相同 → 外道线性密度低于内道 → 存储能力受限于最内道的最大密度; ⚠️ 现代磁盘采用区域记录 ZBR 技术:把盘面划分为若干环带,同一环带内磁道扇区数相同,外层环带比内层多。

读写三步:① 按柱面号移动磁头臂定位柱面 → ② 激活对应盘面的磁头 → ③ 等待目标扇区旋转到磁头下方。

★ 考过 2019

回源 · PDF 第 352 页 · b_352_9

磁盘按结构分成哪几类?什么是温盘?

  • 固定头磁盘:每个磁道配一个磁头,磁头位置固定
  • 活动头磁盘:磁头可沿径向移动
  • 固定盘磁盘:盘片永久密封在驱动器内,不可拆卸
  • 可换盘磁盘:允许拆卸和更换

💡 温彻斯特磁盘(温盘):IBM 于 1973 年推出,采用活动磁头 + 固定盘片结构,是现代机械硬盘的雏形。

回源 · PDF 第 353 页 · b_353_6

低级格式化和逻辑格式化各做什么? ★2考

  • 低级格式化(物理格式化):⚠️ 把磁盘划分为扇区;每个扇区由头部、数据区域、尾部组成,⚠️ 用磁道号、磁头号、扇区号标志一个扇区,用 CRC 字段校验
  • ⚠️ 大多数磁盘出厂时已完成低级格式化,便于制造商测试并建立逻辑块地址到物理扇区的初始映射;数据区域大小通常为 256B、512B 或 4KB
  • 分区:划分逻辑区域(C 盘、D 盘),⚠️ 每个分区的起始位置和大小记录在 MBR 的分区表中
  • 逻辑格式化(高级格式化):⚠️ 在分区上建立文件系统 —— 初始化根目录、创建管理空闲与已分配空间的数据结构、把初始目录置为空

⚠️ 簇(块):多个连续扇区的组合 —— 非空文件的数据空间通常按簇的整数倍分配,因此最后一簇可能产生内部碎片。

⚠️ 校订/边界:0 字节普通文件通常仍占目录项、inode/FCB 等元数据,但可以不分配任何数据簇;是否预分配数据簇由具体文件系统决定。

★ 考过 2017、2021

回源 · PDF 第 353 页 · b_353_10

引导块为什么不全放在 ROM 里?

自举程序要初始化 CPU、寄存器、设备控制器和内存,然后加载并启动操作系统。

⚠️ 若把完整引导程序放 ROM,修改就得更换硬件 → 做法是:ROM 中只保留一个小型自举装入程序,功能完整的引导程序存放在磁盘的引导块中(位于固定位置)。 ⚠️ 含有引导块的磁盘称为启动磁盘或系统磁盘。

传统 BIOS/MBR 引导链:ROM 代码读 MBR(第 0 号扇区)→ MBR 含引导代码、分区表和标志位 → 读活动分区的首扇区(引导扇区)→ 加载系统服务与驱动程序。

回源 · PDF 第 354 页 · b_354_2;PDF 第 354 页 · b_354_4

坏块的两种处理方式?

  • 简单磁盘(如 IDE):⚠️ 由操作系统在逻辑格式化时检测 —— 例如 MS-DOS 的 Format 命令识别坏扇区并在 FAT 表中标记为不可用
  • 现代复杂磁盘:⚠️ 控制器内部维护一份坏块列表(出厂低级格式化时初始化,使用中动态更新);低级格式化预留部分备用扇区(对操作系统透明),发现坏块时自动映射到备用扇区 —— 称为扇区备用

💡 核心思想:通过软件标记或硬件重映射,确保系统不会使用坏块。

回源 · PDF 第 354 页 · b_354_8;PDF 第 354 页 · b_354_9

磁盘存取时间的三个组成和公式?

\[T_a = T_s + \frac{1}{2r} + \frac{b}{rN}\]
  • 寻道时间 Tₛ = m·n + s(m 为跨越每条磁道的时间约 0.2ms,s 为磁头臂启动时间约 2ms,n 为跨越的磁道数)
  • 旋转延迟 = 1/(2r):⚠️ 因扇区位置随机,平均为半圈旋转时间;典型转速 5400 转/分 → 一圈 11.1ms → 平均延迟约 5.56ms
  • 传输时间 = b/(rN)(b 为字节数,N 为每磁道字节数,r 为每秒转数)

⚠️ 关键结论:寻道时间占主导地位,且直接受磁盘调度算法影响;旋转延迟和传输时间都与转速成反比,难以从操作系统层面优化 → 磁盘调度的主要目标是减少平均寻道时间。

💡 调度题五步法:画磁道轴 → 标当前磁头位置 → 写明初始方向 → 按算法排访问序列 → 逐段求绝对差并检查是否必须到物理端点。SCAN/C-SCAN 若未给方向,答案可能不唯一;LOOK/C-LOOK 只到当前方向最远请求。

回源 · PDF 第 354 页 · b_354_14

FCFS 磁盘调度的例题? ★2考

队列 55, 58, 39, 18, 90, 160, 150, 38, 184,磁头初始在 100: 移动距离 45+3+19+21+72+70+10+112+146 = 498 个磁道,平均寻道长度 = 498/9 = 55.3。

评价:⚠️ 公平性好;请求少且扇区位置聚集时性能尚可;⚠️ 大量进程竞争时磁头频繁长距离移动,效率低下。

★ 考过 2010、2018

回源 · PDF 第 355 页 · b_355_9

SSTF 的例题和饥饿问题? ★2考

每次选择距离当前磁头位置最近的请求。

同一队列下:移动距离 10+32+3+16+1+20+132+10+24 = 248 个磁道,平均寻道长度 = 248/9 = 27.5。

⚠️ 两个要点: - 不能保证平均寻道时间最小,但通常优于 FCFS - ⚠️ 可能引发饥饿 —— 若磁头在 18 号磁道附近持续出现新请求,则较远磁道(如 184 号)长时间得不到服务

★ 考过 2019、2021

回源 · PDF 第 355 页 · b_355_16

SCAN 算法为什么叫电梯调度?

⚠️ 规则:磁头只有到达最外侧磁道后才转向内侧,到达最内侧后才转向外侧 —— 在 SSTF 基础上加了磁头移动方向的约束。

💡 行为类似电梯运行,所以也称电梯调度算法。

⚠️ 缺点:对最近扫描过的区域不公平,因此在访问局部性方面不如 FCFS 和 SSTF。

回源 · PDF 第 356 页 · b_356_0

SCAN 的例题(同一队列对照)? ★3考

队列 55, 58, 39, 18, 90, 160, 150, 38, 184,磁头初始 100,⚠️ SCAN 还必须知道磁头移动方向。

沿磁道号增大方向:访问顺序 100, 150, 160, 184, 200, 90, 58, 55, 39, 38, 18 移动距离 50+10+24+16+110+32+3+16+1+20 = 282,平均寻道长度 = 282/9 = 31.33。

⚠️ 注意它走到了物理端点 200 才折返。

★ 考过 2009、2010、2015

回源 · PDF 第 356 页 · b_356_4;PDF 第 356 页 · b_356_7

C-SCAN 的例题和它解决了什么? ★1考

⚠️ 规则:磁头仅沿单一方向移动并提供服务,返回时快速移至起始端且不处理任何请求。

同一队列:访问顺序 100, 150, 160, 184, 200, 0, 18, 38, 39, 55, 58, 90 移动距离 50+10+24+16+200+18+20+1+16+3+32 = 390,平均寻道长度 = 390/9 = 43.33。

解决的问题:⚠️ SCAN 往返扫描时通常更有利于中间磁道,而两端可能等待更久;C-SCAN 只沿一个方向提供服务、回程不服务,使各位置的等待时间分布更均匀。

⚠️ 校订/边界:不要记成“SCAN 偏向两端”;经典往返扫描下,中间区域通常被经过得更频繁。

★ 考过 2024

回源 · PDF 第 356 页 · b_356_7

LOOK 和 C-LOOK 改进了什么?

⚠️ SCAN 和 C-SCAN 总是严格地从磁盘一端移动到另一端;改进是:磁头只需移动到当前方向上最远的请求位置即可返回,无须抵达物理端点。

  • SCAN 的改进 → LOOK 调度
  • C-SCAN 的改进 → C-LOOK 调度

💡 名字来源:在朝某一方向移动前会"查看(look)"该方向是否存在待处理请求。 ⚠️ 若无特别说明,实际系统中所称的 SCAN 和 C-SCAN 通常指 LOOK 和 C-LOOK。

回源 · PDF 第 356 页 · b_356_12;PDF 第 356 页 · b_356_14

四种磁盘调度算法的优缺点总表?

算法 优点 缺点
FCFS 公平、简单 平均寻道距离大,仅适用于磁盘 I/O 较少的场合
SSTF 性能优于 FCFS ⚠️ 不能保证平均寻道时间最短,可能出现饥饿
SCAN 寻道性能较好,可避免饥饿 ⚠️ 对远离磁头当前位置一端的请求响应较慢
C-SCAN 单向服务,使等待分布更均匀 回程快速跳转会增加移动距离

💡 同一例题的对照结果:FCFS 498 / SSTF 248 / SCAN 282 / C-SCAN 390。

回源 · PDF 第 357 页 · b_357_3;PDF 第 357 页 · b_357_4

什么是磁臂黏着?NStepSCAN 和 FSCAN 怎么解决?

⚠️ 磁臂黏着:一个或多个进程频繁发出对某个磁道的 I/O 请求时,磁头长期滞留于该区域,其他进程难以获得服务 —— SSTF、SCAN、C-SCAN 在特定情况下都可能出现。

  • NStepSCAN:把请求队列划分为若干长度为 N 的子队列;⚠️ 子队列之间按 FCFS 处理,每个子队列内部用 SCAN;⚠️ 处理某子队列时新到的请求放入其他尚未处理的子队列,不插入当前队列
  • N 很大时趋近 SCAN;N = 1 时退化为 FCFS
  • FSCAN:NStepSCAN 的简化 —— ⚠️ 固定划分为两个子队列:当前服务队列(调度开始时已有的请求,按 SCAN 处理) 和 新请求队列(本轮新到的,推迟到下一轮)
  • 💡 策略叫"冻结当前、延后新请求",实现简单、开销低
回源 · PDF 第 357 页 · b_357_6

交替编号和错位命名各解决什么?

⚠️ 共同前提:磁头读完一个扇区后系统需要处理时间,期间盘面继续旋转,下一个目标扇区可能已被错过,只能等近一整圈。

  • 扇区交替编号(同一盘面内):使逻辑相邻的块在物理布局上保持适当间隔,确保处理完一个扇区后下一个目标扇区正好转到磁头下方
  • 盘面错位命名(不同盘面之间):⚠️ 因为所有盘面同步旋转,同一柱面内的块按盘面顺序连续存放(盘面0扇区0…盘面0扇区7、盘面1扇区0…);读完盘面0扇区7后仍需处理时间 → 错位命名使盘面1扇区0恰好或即将到达磁头位置

💡 教材总结:寻道时间和旋转延迟属于"找"的时间,可通过调度算法或布局优化降低;传输时间由磁盘本身特性决定,难以用软件手段减少。

回源 · PDF 第 357 页 · b_357_10

提高磁盘 I/O 速度的七种方法? ★2考

  • 采用磁盘高速缓存
  • 调整磁盘请求顺序(磁盘调度算法)
  • 提前读:读当前块时把逻辑上紧随其后的块一并预读到内存缓冲区
  • 延迟写:⚠️ 修改缓冲区数据时只设延迟写标志,被替换时才真正写盘 → 合并多次写操作,减少 I/O 次数
  • 优化物理块的分布:把链接或索引文件的块尽量安排在同一磁道或相邻磁道;以簇为单位分配
  • 虚拟盘(RAM 盘):⚠️ 用内存仿真磁盘;与磁盘高速缓存的区别是:虚拟盘的内容完全由用户程序控制,磁盘高速缓存由操作系统透明管理
  • 采用磁盘阵列 RAID:某些级别支持交叉存取

💡 文件访问速度的三个优化方向:改进目录结构与检索方法、选好文件存储结构、提高磁盘 I/O 速度。

★ 考过 2012、2018

回源 · PDF 第 358 页 · b_358_6

SSD 的结构和读写单位? ★1考

SSD = 一个或多个闪存芯片 + 闪存翻译层:⚠️ 闪存芯片替代机械驱动器,闪存翻译层相当于代替了磁盘控制器(把逻辑块读写请求转换为对物理闪存的控制信号)。

层次与容量:一个闪存芯片由 B 块组成,每块包含 P 页;页 512B~4KB,每块 32~128 页,块 16KB~512KB。

⚠️ 单位不对称(核心考点): - 读/写操作以页为单位 - 擦除操作以块为单位 —— ⚠️ 只有整块被擦除后才能向其中的页写入新数据;一旦某块被擦除,其所有页均可重新写入一次 - ⚠️ 每个块的擦写次数有限,重复写入后会因磨损而失效

★ 考过 2025

回源 · PDF 第 358 页 · b_358_11

SSD 随机写为什么慢?它有什么优势?

两个原因: - ⚠️ 擦除操作耗时长,通常比页访问慢一个数量级 - ⚠️ 要修改一个已含有效数据的页 Pi,必须先把该块中所有有效页复制到一个新的(已擦除的)块,再执行写入

相比机械磁盘的优势:由半导体器件构成、无机械运动部件 → 随机访问延迟极低、无噪声、无振动、功耗更低、抗震性强、安全性更高。

回源 · PDF 第 359 页 · b_359_4

动态磨损均衡和静态磨损均衡的区别?

⚠️ 问题根源:闪存擦写寿命仅几百至几千次,而读写往往集中在少数物理块上 —— 一块 256GB 的 SSD 可能仅因几兆字节的闪存损坏而报废。

  • 动态磨损均衡:写入时优先选择擦写次数较少的空闲块,把写入负载分散
  • 静态磨损均衡(更高级):⚠️ 即使没有新数据写入,控制器也会迁移长期不变的冷数据 —— 把冷数据迁到历史擦写次数较高的块,从而释放低磨损块去承担后续热写入

⚠️ 校订/边界:不要用含混的“老块/新块”记方向;固定记成“冷数据→高磨损块,低磨损块→新写入”。

💡 教材算例:256GB SSD,擦写寿命 500 次 → 理论总写入量 125TB;即使每天写 10GB,也需三十多年才达到寿命极限。

回源 · PDF 第 359 页 · b_359_6;PDF 第 359 页 · b_359_8

文件放不下时,应该换磁道还是换盘面?

⚠️ 应优先放在同一柱面的不同盘面上。

理由:同一柱面的各磁道半径相同,切换盘面仅需选择对应磁头,无须移动磁头臂,故无寻道开销;而放在同一盘面的不同磁道则必须移动磁头臂,产生显著寻道延迟。

💡 前提结论:三部分时间中寻道时间通常最长(因为磁头臂的机械运动较慢)。

回源 · PDF 第 359 页 · b_359_0

【疑难点】第5章

"设备分配,要过三关"是什么意思?

在具有通道的系统中,设备分配需依次访问 SDT → DCT → COCT → CHCT;⚠️ 成功分配必须同时满足:设备可用、控制器可用、通道可用 —— 所以常说"设备分配,要过三关"。

两个改进方向: - 增强设备无关性:用逻辑设备名,⚠️ 依次查该类设备的 DCT,只要有一个可用就继续,全忙才挂起 - 支持多通路 I/O 结构:⚠️ 控制器与通道的分配也要逐级尝试 —— 第一个忙就试下一个,全部不可用才失败

回源 · PDF 第 371 页 · b_371_1

用户缓冲区和内核缓冲区的作用有什么不同?

  • 用户缓冲区:用户进程预先申请的一块内存(如一个数组),⚠️ 主要作用是减少系统调用的次数 → 降低频繁在用户态与内核态之间切换的开销
  • 内核缓冲区:操作系统在内核空间维护的缓冲区,⚠️ 核心目的是提升磁盘 I/O 的整体效率,对写操作优化尤其突出
  • 读:先查内核缓冲区有没有 —— 有就直接复制到用户缓冲区;没有才发起磁盘 I/O 并挂起进程
  • 写:⚠️ 数据先写入内核缓冲区,积累到一定量或满足刷新条件才批量写盘
回源 · PDF 第 371 页 · b_371_6

【易混点】第5章成对概念对照

概念 A 概念 B 一句话切分
块设备 字符设备 成块、高速、可寻址(DMA) vs 按字节、低速、不可寻址(中断)
独占设备 共享设备 / 虚拟设备 打印机 vs 磁盘 / SPOOLing 造出来的
独立编址 统一编址 专用 I/O 指令、译码快 vs 普通访存指令、占内存空间
程序直接控制 中断驱动 轮询、CPU 串行等待 vs 设备主动报告,仍按字节干预
中断驱动 DMA 数据经过 CPU 寄存器、按字节 vs 直接进内存、按块,仅首尾干预
DMA 通道 参数由 CPU 预设、批量直达内存;设备数依实现 vs 执行通道程序、可组织多设备多阶段 I/O
设备独立性软件 设备驱动程序 公共操作、统一接口 vs 每类设备一个、直接对硬件
逻辑设备名 物理设备名 程序里用、靠 LUT 映射 vs 系统内唯一
高速缓存 缓冲区 慢速设备数据的副本、可长期驻留 vs 正在传输的数据、传完即释放
单缓冲 双缓冲 Max(T,C) + M vs Max(T, C+M)
循环缓冲 缓冲池 in/out 两指针的环 vs 三队列四角色,多进程共享
in 追上 out out 追上 in 受计算限制、输入进程阻塞 vs 受 I/O 限制、计算进程阻塞
安全分配方式 不安全分配方式 发请求即阻塞、不会死锁但慢 vs 可继续申请、快但可能死锁
输入井/输出井 输入/输出缓冲区 在磁盘上 vs 在内存中
低级格式化 逻辑格式化 划分扇区(含 CRC) vs 建立文件系统、初始化根目录
寻道时间 旋转延迟 磁头臂移动,最长、可被调度优化 vs 等扇区转来,= 1/(2r)
SSTF SCAN 就近服务、可能饥饿 vs 加方向约束、像电梯
SCAN C-SCAN 往返服务,通常更有利于中间磁道 vs 单向服务、回程不服务,等待分布更均匀
SCAN/C-SCAN LOOK/C-LOOK 走到物理端点 vs 只走到该方向最远的请求
NStepSCAN FSCAN 分 N 长的多个子队列 vs 固定两个队列(当前 + 新请求)
虚拟盘(RAM盘) 磁盘高速缓存 内容由用户程序控制 vs 由操作系统透明管理
SSD 读写 SSD 擦除 以页为单位 vs 以块为单位
动态磨损均衡 静态磨损均衡 写时挑擦写少的块 vs 不写也定期迁移数据

【必背数字】第5章

数字 含义
四种 I/O 控制方式 程序直接控制 → 中断驱动 → DMA → 通道
四类 DMA 寄存器 CR、MAR、DR、DC
I/O 软件四层 用户层 → 设备独立性软件 → 设备驱动 → 中断处理
三类 I/O 端口寄存器 数据、状态、控制
Max(T, C) + M 单缓冲处理每块数据的时间
Max(T, C + M) 双缓冲处理每块数据的时间
三队列 + 四工作方式 缓冲池:空/输入/输出;hin/sin/hout/sout
四张表 DCT(每设备)、COCT(每控制器)、CHCT(每通道)、SDT(全系统唯一)
Tₛ = m·n + s 寻道时间(m≈0.2ms,s≈2ms)
1/(2r) 平均旋转延迟;5400 转/分 → 一圈 11.1ms → 约 5.56ms
b/(rN) 传输时间
498 / 248 / 282 / 390 教材例中 FCFS / SSTF / SCAN / C-SCAN 的总移动磁道数
55.3 / 27.5 / 31.33 / 43.33 对应的平均寻道长度(除以 9)
N = 1 NStepSCAN 退化为 FCFS
0 号扇区 MBR 位置
512B~4KB / 32~128 页 / 16KB~512KB SSD 的页 / 每块页数 / 块大小
几百至几千次 闪存块的擦写寿命
256GB × 500 次 = 125TB 教材算例的理论总写入量