← 返回学习笔记

Lecture 12:知识 - 设备独立性软件

408 学习笔记:Lecture 12:知识 - 设备独立性软件。保留原有知识内容、公式与图示;有对应原件时提供查看和下载入口。

本页目录

本讲围绕 I/O 核心子系统展开:设备独立性软件把逻辑设备请求与具体硬件隔离,负责设备保护、分配与回收、缓冲管理及逻辑设备映射;驱动程序控制具体设备,中断处理程序承接硬件完成通知。I/O 调度是核心子系统的通用功能;SPOOLing 是本讲重点,但按源课件的软件分层归入用户层。

12.1 I/O 核心子系统

功能 含义
I/O 调度 用合适的算法决定多个 I/O 请求的处理顺序。
设备保护 按访问权限限制设备使用。UNIX 将设备抽象为特殊文件,设备文件具有 FCB 等元数据,系统据其权限信息判断用户是否可访问;现代 UNIX/Linux 的 inode 表述属于教材补充。
缓冲与高速缓存 组织内存中的缓冲区,缓和速度/粒度矛盾并减少磁盘 I/O。
设备分配与回收 在设备、控制器、通道均可用时分配资源,使用结束回收。
假脱机 通过软件和磁盘队列把独占设备虚拟为可共享设备。

在分层 I/O 软件中,设备独立性软件位于用户层软件和驱动程序之间。按源课件的分层口径,SPOOLing 管理程序归入用户层;设备相关控制由驱动程序完成,硬件中断入口由中断处理程序完成。

NOTE · 教材补充:实现边界 实际系统常把设备驱动与其注册的中断处理紧密结合,但概念分层时仍应区分二者。

12.2 缓冲区与高速缓存

缓冲区是暂存数据的区域,可由硬件寄存器实现,也常以主存实现。寄存器缓冲快但贵、容量小,只用于容量需求很小的设备接口;设备独立性软件主要管理内存缓冲区。

NOTE · 教材补充:适用范围 源课件把缓冲区表述为“逻辑上属于磁盘、物理上驻留于内存的盘块”,该说法适合其讨论的块设备缓冲;字符设备、网络、管道等缓冲区并不对应磁盘块。

缓冲的五个目的

  1. 缓和 CPU 与 I/O 设备的速度不匹配。
  2. 减少 CPU 中断频率,放宽中断响应时间限制。
  3. 匹配数据粒度,例如进程每次生成一块、设备每次只能输出一个字符。
  4. 让 CPU 与 I/O 设备并行工作。
  5. 利用局部性缓存常用磁盘块,减少磁盘 I/O 次数。

缓冲不能减少平均寻道时间、不能直接提高磁盘数据可靠性、也不是实现设备无关性的手段。

NOTE · 教材补充:效果边界 若 I/O 时间远小于 CPU 处理时间,缓冲对流水吞吐瓶颈的改善通常很小,但仍可能减少一部分同步等待,不能理解为任何场景下都毫无作用。

延迟写:把修改后的数据先写入缓冲区,在缓冲区首部设置延迟写标志,并稍后批量写回。若短期内再次访问同一数据,可直接命中缓冲,避免不必要的磁盘写入。按课件所述的经典空闲缓冲区链表算法,该缓冲区随后被申请是触发写回的时机之一。

NOTE · 教材补充:写回触发条件 一般系统也可能因后台周期回写、内存压力或缓存回收,以及 sync、fsync 等显式同步请求而写回,不能绝对化为“只有再次申请时才写盘”。

单缓冲时间计算

题目未特别说明时,一个缓冲区大小为一个块。设:

  • $T$:设备 → 缓冲区的输入时间;
  • $M$:缓冲区 → 用户工作区的传送时间;
  • $C$:CPU 处理工作区的时间。

单缓冲通常假设初态为“工作区满、缓冲区空”。缓冲非空时不能继续输入,缓冲为空时必须先充满才能输出给工作区。

情形 瓶颈 处理一块数据的平均时间
$T\ge C$ CPU 完成后仍需等待下一块输入;$T=C$ 时恰好同时结束 $T+M$
$T<C$ 缓冲已满,设备需等 CPU 取走数据 $C+M$

即稳态平均时间为:

$$T_{single}=M+\max(T,C)$$

IMPORTANT · 教材补充:公式适用边界 这是源课件在“工作区初始有一块待处理数据、唯一缓冲区为空”条件下得到的稳态平均每块时间。它还假设每块的 $T、M、C$ 固定,数据必须整块填满后才能传送,且同一块的 $M$ 与 $C$ 串行;单缓冲执行 $M$ 时缓冲区尚未释放,下一块输入不能同时占用它。若改为从设备、缓冲区和工作区均为空开始处理 $n\ge1$ 块,并以第 $n$ 块完成 CPU 处理为终点,则在同一简化模型下: $$ T_{single,total}=T+M+(n-1)\left[M+\max(T,C)\right]+C $$ 开头的 $T+M$ 是启动,末尾的 $C$ 是排空;因此有限批次不能直接写成 $nT_{single}$。

双缓冲、循环缓冲与缓冲池

双缓冲:两个缓冲区交替使用。设备把数据装满缓冲区 1 后转向缓冲区 2;同时 OS 可把缓冲区 1 的数据送入工作区供 CPU 处理。未特别说明时,初态为“工作区空、一个缓冲满、另一个缓冲空”。设备输入时间 $T$ 可与 $C+M$ 并行:

$$T_{double}=\max(T,C+M)$$

IMPORTANT · 教材补充:公式适用边界 这是“工作区空、一个缓冲区已满、另一个为空”的课件初态下的稳态平均每块时间。它假设设备可在一个缓冲区输入下一块的 $T$,同时系统对另一个缓冲区完成 $M$ 并让 CPU 处理上一块的 $C$,而同一块的 $M$ 与 $C$ 仍串行。若从全空状态处理 $n\ge1$ 块,并以第 $n$ 块完成 CPU 处理为终点,则在同一简化模型下: $$ T_{double,total}=T+(n-1)\max(T,M+C)+M+C $$ 开头的 $T$ 是首块输入启动,末尾的 $M+C$ 是最后一块传送与处理的排空。若内存复制和设备传输争用同一总线,或 CPU 不能按时服务缓冲区,则上述重叠前提失效,仍须按实际时间线计算。

在教材的双机通信模型中,每端只有一个共用缓冲时只能轮流发送和接收;每端分别配置发送与接收缓冲时,可以同时容纳两个方向的数据。

NOTE · 教材补充:双向通信的前提 真正“一边发送、一边接收”还要求物理链路支持全双工,并且发送、接收缓冲各自独立,不能由“应用了双缓冲”这一句话自动推出。对普通输入流水线而言,两个缓冲的直接收益是让“设备填充下一块”与“系统/进程处理上一块”重叠,并不表示数据必然沿两个方向流动。

循环缓冲:多个等大缓冲区首尾相连成循环队列。in 指向第一个可输入的空缓冲区,out 指向第一个可提取的满缓冲区;输入/输出时两指针沿环移动。图中橙色为满、绿色为空。

缓冲池:系统共享的缓冲区集合,不等同于循环缓冲。按状态分为空缓冲队列、满输入缓冲队列、满输出缓冲队列;另有四种工作缓冲:

工作缓冲 作用
hin 收容输入数据。
sin 提取输入数据。
hout 收容输出数据。
sout 提取输出数据。

例如从输入队列取一块满输入缓冲作为 sin,提取完后挂回空缓冲队列。

12.3 设备分类、分配安全性与静动态分配

设备属性 含义与例子
独占设备 同一时段只能分给一个进程,如打印机。
共享设备 可被多个进程宏观同时、微观交替使用,如磁盘。
虚拟设备 用 SPOOLing 把独占设备改造成逻辑共享设备,如共享打印机。

设备分配算法可采用 FCFS、优先级优先或短任务优先。设备分配还必须考虑设备类型、访问权限、当前占用状态以及逻辑设备名到物理设备名的映射;设备忙时将请求进程的 PCB 挂到相应等待队列。

分配方式 行为 优缺点
安全分配 进程获得设备并启动一次 I/O 后即阻塞,待本次 I/O 完成再唤醒;一个进程同一时段只能使用一个设备。 破坏“请求和保持”,不会因这种设备分配方式形成设备死锁;但 CPU 计算与 I/O 对该进程只能串行。
不安全分配 设备分配后进程继续运行,可再申请更多设备;仅当新请求不能满足时阻塞。 计算和 I/O 可并行、进程推进快;但可能死锁,需要避免、检测或解除。
静态分配 进程运行前一次分配全部所需资源,结束后归还。 运行前一次取得本次所需全部设备资源,破坏“请求和保持”。
动态分配 运行过程中按需申请设备。 利用率高,但需处理等待与死锁。

NOTE · 教材补充:死锁结论的范围 安全分配与静态分配只是在源课件所述的设备分配模型中破坏“请求和保持”,因此不会由纳入该策略的设备资源形成死锁;这不是对系统中其他锁或资源的全局保证。

2023 题总结:设备类型、设备访问权限、设备占用状态、逻辑设备与物理设备的映射关系,均是设备分配必须考虑的因素。

12.4 设备分配的数据结构与过程

资源层次为:一个通道可控制多个控制器,一个控制器可控制多个设备。

表 每个对象一张 图示中的关键信息
DCT(设备控制表) 每个设备 设备类型、物理设备名、忙/闲/故障状态、指向 COCT 的指针、重复执行次数/时间、设备等待队列的队首指针。
COCT(控制器控制表) 每个控制器 控制器标识、状态、指向 CHCT 的指针、控制器等待队列的队首指针和队尾指针。
CHCT(通道控制表) 每个通道 通道标识、状态、所连接控制器表的首址、通道等待队列的队首指针和队尾指针。
SDT(系统设备表) 系统每个设备一项 设备类型、物理设备名、DCT 指针、驱动程序入口。

若进程直接请求物理设备名,分配顺序为:

SDT → DCT → COCT → CHCT
  1. 据物理设备名查 SDT。
  2. 由 SDT 找 DCT;设备忙则 PCB 入设备等待队列,否则占用设备。
  3. 由 DCT 找 COCT;控制器忙则 PCB 入控制器等待队列,否则占用控制器。
  4. 由 COCT 找 CHCT;通道忙则 PCB 入通道等待队列,否则占用通道。

只有设备、控制器、通道三者均成功分配,才可启动 I/O 数据传送。

逻辑设备表(LUT)与设备独立性

直接使用物理设备名会暴露硬件细节;设备更换后程序也不能运行;请求的物理设备忙时即使另有同类设备也只能等待。LUT 建立“逻辑设备名 → 物理设备名(及驱动入口)”的映射,使用户按设备类型/逻辑名编程。

首次请求尚未建立映射的逻辑设备名时:在 SDT 中查找同类空闲设备,沿 DCT、COCT、CHCT 检查并分配相关资源;再次以相同逻辑名请求时,可由 LUT 得到既有物理设备和驱动入口,再检查相应控制表。课件把概念关系概括为:

进程 → LUT → SDT → DCT → COCT → CHCT

NOTE · 教材补充:提交时机 LUT 表项应在设备、控制器和通道均分配成功后提交;若中途失败,则应等待或回滚已占用资源,不能留下一个指向未完成分配的映射。

  • Linux 可把设备当文件处理,用户通过文件名访问物理设备,而非直接使用物理设备名。
  • 更换物理设备后,使用逻辑设备名的应用程序无需修改。
  • 全系统一张 LUT:逻辑设备名不得重复,适合单用户;每用户一张 LUT:不同用户可重名,适合多用户。

12.5 SPOOLing(假脱机)

从脱机技术到假脱机

早期人工操作阶段,主机直接和慢速 I/O 设备交换数据,CPU 大量等待。批处理阶段采用脱机输入/输出:在外围控制机控制下先把慢速设备数据写入较快的磁带,主机再从磁带读入;“脱机”即脱离主机控制进行 I/O。

其核心是使用较快区域(通常磁盘)作为缓存,保存 CPU 与慢速设备之间交换的数据。即使 CPU 或慢速设备忙,也可提前把数据输入/输出到中间介质。

**假脱机(SPOOLing)**以软件模拟脱机技术,由预输入程序、井管理程序和缓输出程序构成,必须有多进程支持(输入进程和输出进程可并发)。它允许多个作业逻辑上共享一台独占设备。

WARNING · 教材补充与纠错:输入、输出方向 源课件第 14 页把“输入进程/输出进程”写重,并把两者模拟的脱机方向互换;同页流程图给出的数据流向是正确的。应以数据流为准:输入进程模拟脱机输入,输出进程模拟脱机输出。

组件 作用
输入井 磁盘区域,模拟脱机输入时的磁带,收容输入设备数据。
输出井 磁盘区域,模拟脱机输出时的磁带,收容用户进程输出数据。
输入进程/输入缓冲区 把输入设备数据先暂存于输入缓冲区,再转存输入井。
输出进程/输出缓冲区 从输出井取数据,暂存于输出缓冲区,再送到输出设备。

共享打印机的流程

打印机本是独占设备。多个用户申请打印时,SPOOLing 管理进程不立即分配物理打印机,而是:

  1. 在磁盘输出井为该进程申请空闲存储区,写入待打印数据。
  2. 建立打印请求表(记录数据位置等),把请求表挂入假脱机文件队列。
  3. 打印机空闲时,输出进程从队首取请求表,按表从输出井取数据到输出缓冲区,再送打印机;按队列逐个完成。

结果是每个进程均获得一个输出井存储区,仿佛独占一台逻辑打印机;物理打印机仍按次序一次打印一个作业。

12.6 设备驱动程序接口与图示复核

不同厂商的驱动若接口不统一,OS 就无法用统一方式调用设备。因此 OS 规定驱动接口标准,厂商按此开发。图示层次为:用户层 I/O 软件 → 设备独立性软件 → 标准驱动接口 → 驱动程序 → 中断处理程序 → 硬件。

NOTE · 教材补充:驱动与中断处理 驱动负责设备相关控制,并通常注册或配合相应的中断处理程序;实现上二者联系紧密,但概念分层时仍要区分。

  • 缓冲图复核:单缓冲稳态平均时间为 $M+\max(T,C)$,双缓冲稳态平均时间为 $\max(T,C+M)$;循环缓冲用 in/out 分别定位空/满缓冲,缓冲池有空、输入、输出三类队列及四种工作缓冲。
  • 设备表图复核:物理名分配走 SDT、DCT、COCT、CHCT;逻辑名分配在最前增加 LUT。
  • SPOOLing 图复核:输入路径为“输入设备 → 输入缓冲区 → 输入井”,输出路径为“输出井 → 输出缓冲区 → 输出设备”。

相关知识

12.7 本节复盘

  • 缓冲解决速度、粒度、并行和中断频率问题;计算题先定义 $T,M,C$ 并确认单/双缓冲的初始状态。
  • 设备分配成功必须同时得到设备、控制器和通道;安全/静态分配通过破坏本设备分配模型中的“请求和保持”来避免设备死锁,不能据此推出系统整体绝无死锁。
  • LUT 使程序使用逻辑设备名,屏蔽物理设备替换;LUT 的作用域决定逻辑名能否在不同用户间重复。
  • SPOOLing 用输入井/输出井和输入/输出进程把独占设备虚拟共享,打印请求表与文件队列是共享打印机的核心。