Appearance
假脱机技术(SPOOLing)
2026 大纲 五(二)3 假脱机技术(SPOOLing),属「设备独立软件」层。
一台打印机,怎么让所有人同时用
设备的基本概念按共享属性把设备分成独占、共享、虚拟三类, 当时"虚拟设备"这一类只给了个名字。这一节讲它是怎么造出来的。
问题很具体:打印机是独占设备——一份文件打到一半被另一份插进来, 纸上就成了两份文件的交替。所以一台打印机同一时刻只能给一个进程。
代价是进程要排队等,而且等的方式很难看:申请到打印机的进程会一直占着它, 直到自己那份打完。打印机每秒才吐几十个字符,一份长文档能占上几分钟, 期间别的进程既拿不到设备,也不能干别的(它在等)。
SPOOLing 的解法是在中间垫一块磁盘:
进程要打印时,不真的去碰打印机,而是把内容写进磁盘上的输出井、 再往请求队列里挂一条记录,然后立刻返回——从它的角度看,"打印"这件事已经做完了。 真正的打印由一个后台的输出进程慢慢做,按队列一份一份来。
于是独占设备被改造成了共享设备:所有进程都能"同时"使用打印机, 因为它们真正竞争的对象换成了磁盘(可共享),而打印机由系统独家管着、串行使用。
要留意两处:这套东西是系统的进程在做,不是用户作业自己做的—— 用户作业只管往井里写、挂请求,设备与井之间的数据传送由 SPOOLing 的输入/输出进程完成。 另外它有三个硬前提:通道技术、多道程序设计、高速随机外存作后援。
一、从脱机技术到假脱机
20 世纪 50 年代,为缓和 CPU 高速与 I/O 设备低速的矛盾,人们引入脱机输入/输出技术:用专门的外围控制机先把低速设备上的数据搬到高速磁带/磁盘上,主机需要时直接从高速设备读,输出反之。代价是要多买一台外围控制机,而且它与主机不同时工作。
多道程序技术出现后,一个自然的想法是用一道程序去模拟那台外围控制机:
有了多道程序 ⇒ 可以专门开一道程序守在低速输入设备旁,把数据源源不断搬到磁盘(模拟脱机输入) ⇒ 再开一道程序守在低速输出设备旁,把磁盘上的数据慢慢送出去(模拟脱机输出) ⇒ 这两道程序与用户程序在同一台主机上同时运行 ⇒ 效果与脱机相同,却不需要外围控制机
二、SPOOLing 系统的组成
| 组件 | 位置 | 说明 |
|---|---|---|
| 输入井 | 磁盘 | 模拟脱机输入时的磁盘,收容输入设备送来的数据 |
| 输出井 | 磁盘 | 模拟脱机输出时的磁盘,收容用户程序的输出数据 |
| 输入缓冲区 | 内存 | 暂存输入设备送来的数据,再转入输入井;缓和 CPU 与磁盘的速度差 |
| 输出缓冲区 | 内存 | 暂存从输出井取出的数据,再送往输出设备 |
| 输入进程(预输入进程) | —— | 模拟脱机输入的外围控制机:设备 → 输入缓冲区 → 输入井 |
| 输出进程(缓输出进程) | —— | 模拟脱机输出的外围控制机:输出井 → 输出缓冲区 → 设备 |
| 井管理程序 | —— | 控制作业与磁盘井之间的信息交换;进程发出 I/O 请求时由 OS 调用它去读输入井或写输出井 |
井里的数据以文件的形式组织管理,称为井文件:一个井文件只存放某一个进程的输入(或输出)数据,所有进程的输入(输出)文件链接成一个输入(输出)队列,输出进程按队列次序逐个处理。
三、共享打印机:SPOOLing 的典型应用
假脱机打印系统由三部分组成:磁盘缓冲区(即输出井,其中可设置空盘块队列、满盘块队列等)、打印缓冲区(设在内存,缓和 CPU 与磁盘的速度差)、假脱机管理进程与假脱机打印进程。
用户进程发出打印请求后,系统并不把打印机分配给它,而是由假脱机管理进程做两件事:① 在磁盘缓冲区中为它申请一个空闲盘块,把要打印的数据送进去暂存;② 为它申请一张空白的用户请求打印表,填入打印要求(数据在井中的位置、份数、格式等),再把这张表挂到假脱机文件队列(请求打印队列)上。这两件事做完,虽然一个字都还没印出来,但对用户进程而言打印请求已经得到满足。
真正的打印由假脱机打印进程负责:打印机空闲时从队列队首摘取一张请求打印表 → 按表中要求把数据从输出井传送到内存缓冲区 → 交付打印机打印 → 完成后再看队列,非空则重复,队列为空则把自己阻塞,直到再有打印请求时被唤醒。
守护进程是同一思路的另一种实现
把假脱机管理进程取消,改为给打印机建一个守护进程(daemon):由守护进程为用户在磁盘缓冲区申请空闲盘块并返回盘块首址,用户进程自己生成一份"请求打印文件"放进假脱机文件队列(目录)。守护进程是允许使用打印机的唯一进程,其他进程一律只能写文件、不能直接碰设备。
推广到一般结论就是:凡是要把独占设备改造成可共享设备,都可以为它配一个守护进程 + 一个假脱机文件队列。
考点速记
- SPOOLing 用多道程序 + 磁盘模拟脱机时的外围控制机。三个硬前提:通道技术、多道程序设计、高速随机外存(磁盘)作后援。
- 组成:输入井 / 输出井、输入 / 输出缓冲区、输入 / 输出进程、井管理程序;井中数据以井文件形式组织并链成队列。
- ⚠️设备与井之间的数据传送由 SPOOLing 的输入/输出进程完成,不是由用户作业控制的。 用户作业只管往井里写数据、挂一条请求记录,然后立刻返回。
- 三个特点分处三个层面:提高 I/O 速度(性能)、把独占设备改造为共享设备(系统视角的并发)、实现虚拟设备功能(进程视角的抽象)。
- 共享打印机的落法:申请盘块 + 填请求打印表挂队列即返回,后台输出进程按队列逐份打印。
- 由此不会因打印机而死锁,破坏的是互斥条件——进程真正竞争的对象换成了可共享的磁盘。
- 它需要外存支持、需要多道程序设计技术支持、可以让多个作业共享一台独占设备——这三条都是对的。
这一节在真题里被考过的形式:
只出过一道题,四个选项恰好把三条正确性质和一条误解摆在一起。
- 判断 SPOOLing 技术的四条叙述,选错误的(2016-31)。错项是"由用户作业控制设备与输入/输出井之间的数据传送"。⚠️ 那一段传送是 SPOOLing 自己的输入/输出进程干的——用户作业只负责把数据写进井、挂上请求就返回,它根本不知道打印机什么时候真的开始打。如果让用户作业控制这一段,它就还得等设备,SPOOLing 就白做了。 另三条都对:需要外存支持(井在磁盘上)、需要多道程序设计支持(输入/输出进程要与用户进程并发)、可以让多个作业共享一台独占设备(这正是它的目的)。
复习优先级:必须拿满,一句话就够——井与设备之间的传送归系统的 I/O 进程, 用户作业只管写井挂请求。速记第一条那三个前提也要记,它们是选项的常见素材。 第六条(破坏互斥条件、不会因打印机死锁)会在死锁的概念与预防 被当作"破坏互斥"的唯一现实例子用到。
易错:认为井与设备之间的数据传送由用户作业控制。由 SPOOLing 的输入/输出进程完成,用户作业写完井就返回了。
易错:认为 SPOOLing 不需要外存。输入井/输出井就在磁盘上,没有高速随机外存这套东西不成立。
易错:认为 SPOOLing 只是加了个缓冲区。它把独占设备改造成了共享设备,进程竞争的对象从打印机换成了磁盘。
易错:认为 SPOOLing 破坏的是"请求和保持"条件。它破坏的是互斥——这是"破坏互斥"少有的现实可行的例子。
教材出处
- 脱机技术到假脱机技术的演进、SPOOLing 的定义(在联机情况下实现的同时外围操作):汤小丹《计算机操作系统》6.6.2 节,印刷 p205
- SPOOLing 建立在通道技术与多道程序技术基础上、以高速随机外存为后援,四部分组成(输入井/输出井、输入/输出缓冲区、输入/输出进程、井管理程序),井文件与井队列的组织:同书 6.6.2 节,印刷 p206–207
- SPOOLing 的三个特点(提高 I/O 速度、将独占设备改造为共享设备、实现虚拟设备功能):同书 6.6.2 节,印刷 p207
- 假脱机打印系统的三部分、假脱机管理进程的两项工作与假脱机打印进程按请求打印表逐份打印、队列空则阻塞自己:同书 6.6.2 节,印刷 p207–208
- 守护进程方案及"守护进程是允许使用打印机的唯一进程":同书 6.6.2 节,印刷 p208
相关知识
设备分配与回收|缓冲区管理|设备的基本概念与分类|死锁的概念与必要条件|设备驱动程序接口