6.6 用户层的I/O软件
L38
学习目标
系统调用与库函数封装I/O细节,SPOOLing将独占设备改造为共享设备。
- 系统调用与库函数:库函数封装系统调用,提供更易用的接口,如C标准库的read/write封装OS系统调用。
- SPOOLing系统:用高速虚拟设备模拟多台低速设备,将独占设备改造为共享设备。
- SPOOLing的组成:输入井和输出井、输入缓冲区和输出缓冲区、输入进程和输出进程。
- SPOOLing的典型应用:共享打印机,实现假脱机打印。
原理 · 深入理解
6.6 用户层的I/O软件
本节概览:先建立「用户层的I/O软件」的框架,再依次展开下列小节。
- 系统调用与库函数
- 假脱机(Spooling)系统
6.6.1 系统调用与库函数
在C语言及UNIX系统中,系统调用(如read)与各系统调用所使用的库函数(如read)之间几乎一一对应。而微软定义了一套称为Win32 API的应用程序接口,程序员利用它们取得OS服务,该接口与实际的系统调用并不一一对应。
用户程序通过调用对应的库函数使用系统调用,这些库函数与调用程序连接在一起,被嵌入在运行时装入内存的二进制程序中。
为使各进程有条不紊地使用I/O设备且能保护设备的安全性,不允许运行在用户态的应用进程直接调用运行在核心态(系统态)的OS过程。但应用进程运行时又必须取得OS提供的服务,否则应用程序几乎无法运行。
为解决此矛盾,OS在用户层中引入了一个中介过程——系统调用,应用程序可通过它间接调用OS中的I/O过程,对I/O设备进行操作。
6.6.2 假脱机(Spooling)系统
SPOOLing系统主要由四部分构成。SPOOLing技术是对脱机输入/输出系统的模拟,建立在通道技术和多道程序技术的基础上,以高速随机外存(通常为磁盘)为后援存储器。
- 输入井和输出井
- 输入缓冲区和输出缓冲区
- 输入进程和输出进程
- 井管理程序
对利用假脱机系统实现打印机共享的方案进行修改,如取消假脱机管理进程,为打印机建立一个守护进程,由它执行部分原由假脱机管理进程实现的功能:为用户在磁盘缓冲区中申请一个空闲盘块,将要打印的数据送入其中,将该盘块首址返回给请求进程。
另一部分由请求进程自己完成:每个要求打印的进程先生成一份要求打印的文件,其中包含对打印的要求和指向装有打印输出数据盘块的指针等信息,然后将用户请求打印文件放入假脱机文件队列(目录)中。
- 提高了I/O的速度
- 将独占设备改造为共享设备
- 实现了虚拟设备功能
打印机是常用的输出设备,属于独占设备。利用假脱机技术可将它改造为一台可供多个用户共享的打印设备,从而提高设备利用率,也方便了用户。共享打印机技术已被广泛用于多用户系统和局域网络中。
假脱机打印系统主要有以下三部分。
- 磁盘缓冲区
- 打印缓冲区
- 假脱机管理进程和假脱机打印进程
20世纪50年代,为缓和CPU的高速性与I/O设备低速性间的矛盾,引入了脱机输入、脱机输出技术。该技术利用专门的外围控制机,先将低速I/O设备上的数据传送到高速磁盘上,或者相反。
处理机需要输入数据时可直接从磁盘读取,极大提高输入速度;需要输出数据时也可快速把数据先输出到磁盘上,处理机便可去做自己的事情。
做 · 交互动画
- 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
- 写出 RAMFS 的最小 API 列表与数据结构草图。
用户层的I/O软件
用控件单步操作;日志区记下每一步发生了什么。
总结与提升
- 能解释路径名解析步骤。
- 能用自己的话复述学习目标,并指出概念与板上实验的对应。
- 能说明位图一项代表什么。
- 能指出 Flash 与磁盘的一个关键差异。
- 能说出文件相对「裸扇区」的好处。
- 设计稿含 create/read/write/list。
- 能说明双缓冲的好处。
延伸思考
- 扁平「对象键值存储」算目录吗?
- 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?
- 掉电时位图一致性怎么办(导读 8.5)?
- 小文件用连续分配的问题?