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 · 教材补充:适用范围 源课件把缓冲区表述为“逻辑上属于磁盘、物理上驻留于内存的盘块”,该说法适合其讨论的块设备缓冲;字符设备、网络、管道等缓冲区并不对应磁盘块。
缓冲的五个目的
- 缓和 CPU 与 I/O 设备的速度不匹配。
- 减少 CPU 中断频率,放宽中断响应时间限制。
- 匹配数据粒度,例如进程每次生成一块、设备每次只能输出一个字符。
- 让 CPU 与 I/O 设备并行工作。
- 利用局部性缓存常用磁盘块,减少磁盘 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
- 据物理设备名查 SDT。
- 由 SDT 找 DCT;设备忙则 PCB 入设备等待队列,否则占用设备。
- 由 DCT 找 COCT;控制器忙则 PCB 入控制器等待队列,否则占用控制器。
- 由 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 管理进程不立即分配物理打印机,而是:
- 在磁盘输出井为该进程申请空闲存储区,写入待打印数据。
- 建立打印请求表(记录数据位置等),把请求表挂入假脱机文件队列。
- 打印机空闲时,输出进程从队首取请求表,按表从输出井取数据到输出缓冲区,再送打印机;按队列逐个完成。
结果是每个进程均获得一个输出井存储区,仿佛独占一台逻辑打印机;物理打印机仍按次序一次打印一个作业。
12.6 设备驱动程序接口与图示复核
不同厂商的驱动若接口不统一,OS 就无法用统一方式调用设备。因此 OS 规定驱动接口标准,厂商按此开发。图示层次为:用户层 I/O 软件 → 设备独立性软件 → 标准驱动接口 → 驱动程序 → 中断处理程序 → 硬件。
NOTE · 教材补充:驱动与中断处理 驱动负责设备相关控制,并通常注册或配合相应的中断处理程序;实现上二者联系紧密,但概念分层时仍要区分。
- 缓冲图复核:单缓冲稳态平均时间为 $M+\max(T,C)$,双缓冲稳态平均时间为 $\max(T,C+M)$;循环缓冲用
in/out分别定位空/满缓冲,缓冲池有空、输入、输出三类队列及四种工作缓冲。 - 设备表图复核:物理名分配走 SDT、DCT、COCT、CHCT;逻辑名分配在最前增加 LUT。
- SPOOLing 图复核:输入路径为“输入设备 → 输入缓冲区 → 输入井”,输出路径为“输出井 → 输出缓冲区 → 输出设备”。
相关知识
- 科目导航:操作系统导航
- 阅读顺序:上一篇:I/O 管理概述 · 下一篇:磁盘管理
- 关联专题:I/O 接口
12.7 本节复盘
- 缓冲解决速度、粒度、并行和中断频率问题;计算题先定义 $T,M,C$ 并确认单/双缓冲的初始状态。
- 设备分配成功必须同时得到设备、控制器和通道;安全/静态分配通过破坏本设备分配模型中的“请求和保持”来避免设备死锁,不能据此推出系统整体绝无死锁。
- LUT 使程序使用逻辑设备名,屏蔽物理设备替换;LUT 的作用域决定逻辑名能否在不同用户间重复。
- SPOOLing 用输入井/输出井和输入/输出进程把独占设备虚拟共享,打印请求表与文件队列是共享打印机的核心。