6.6 用户层的I/O软件

L38

学习目标

系统调用与库函数封装I/O细节,SPOOLing将独占设备改造为共享设备。

  • 系统调用与库函数:库函数封装系统调用,提供更易用的接口,如C标准库的read/write封装OS系统调用。
  • SPOOLing系统:用高速虚拟设备模拟多台低速设备,将独占设备改造为共享设备。
  • SPOOLing的组成:输入井和输出井、输入缓冲区和输出缓冲区、输入进程和输出进程。
  • SPOOLing的典型应用:共享打印机,实现假脱机打印。

原理 · 深入理解

6.6 用户层的I/O软件

本节概览:先建立「用户层的I/O软件」的框架,再依次展开下列小节。

  1. 系统调用与库函数
  2. 假脱机(Spooling)系统

6.6.1 系统调用与库函数

在C语言及UNIX系统中,系统调用(如read)与各系统调用所使用的库函数(如read)之间几乎一一对应。而微软定义了一套称为Win32 API的应用程序接口,程序员利用它们取得OS服务,该接口与实际的系统调用并不一一对应。

用户程序通过调用对应的库函数使用系统调用,这些库函数与调用程序连接在一起,被嵌入在运行时装入内存的二进制程序中。

图6-20 系统调用的执行过程 用户 API 陷入 系统调用表 内核函数 返回
图6-20 系统调用的执行过程

为使各进程有条不紊地使用I/O设备且能保护设备的安全性,不允许运行在用户态的应用进程直接调用运行在核心态(系统态)的OS过程。但应用进程运行时又必须取得OS提供的服务,否则应用程序几乎无法运行。

为解决此矛盾,OS在用户层中引入了一个中介过程——系统调用,应用程序可通过它间接调用OS中的I/O过程,对I/O设备进行操作。

6.6.2 假脱机(Spooling)系统

SPOOLing系统主要由四部分构成。SPOOLing技术是对脱机输入/输出系统的模拟,建立在通道技术和多道程序技术的基础上,以高速随机外存(通常为磁盘)为后援存储器。

  1. 输入井和输出井
  2. 输入缓冲区和输出缓冲区
  3. 输入进程和输出进程
  4. 井管理程序
脱机输入 / 输出 脱机 I/O:外围机先把数据送到磁带 外围机 磁带 主机 CPU 装带、运输不占用主机;主机从高速磁带取数。

对利用假脱机系统实现打印机共享的方案进行修改,如取消假脱机管理进程,为打印机建立一个守护进程,由它执行部分原由假脱机管理进程实现的功能:为用户在磁盘缓冲区中申请一个空闲盘块,将要打印的数据送入其中,将该盘块首址返回给请求进程。

另一部分由请求进程自己完成:每个要求打印的进程先生成一份要求打印的文件,其中包含对打印的要求和指向装有打印输出数据盘块的指针等信息,然后将用户请求打印文件放入假脱机文件队列(目录)中。

图6-21 SPOOLing系统组成及工作原理 输入井 / 输出井 磁盘上的缓冲 预输入 / 缓输出进程 用户进程 以为独占了一台设备
图6-21 SPOOLing系统组成及工作原理
  1. 提高了I/O的速度
  2. 将独占设备改造为共享设备
  3. 实现了虚拟设备功能

打印机是常用的输出设备,属于独占设备。利用假脱机技术可将它改造为一台可供多个用户共享的打印设备,从而提高设备利用率,也方便了用户。共享打印机技术已被广泛用于多用户系统和局域网络中。

假脱机打印系统主要有以下三部分。

  1. 磁盘缓冲区
  2. 打印缓冲区
  3. 假脱机管理进程和假脱机打印进程
脱机输入 / 输出 脱机 I/O:外围机先把数据送到磁带 外围机 磁带 主机 CPU 装带、运输不占用主机;主机从高速磁带取数。

20世纪50年代,为缓和CPU的高速性与I/O设备低速性间的矛盾,引入了脱机输入、脱机输出技术。该技术利用专门的外围控制机,先将低速I/O设备上的数据传送到高速磁盘上,或者相反。

处理机需要输入数据时可直接从磁盘读取,极大提高输入速度;需要输出数据时也可快速把数据先输出到磁盘上,处理机便可去做自己的事情。

脱机输入 / 输出 脱机 I/O:外围机先把数据送到磁带 外围机 磁带 主机 CPU 装带、运输不占用主机;主机从高速磁带取数。

做 · 交互动画

  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
  • 写出 RAMFS 的最小 API 列表与数据结构草图。

用户层的I/O软件

用控件单步操作;日志区记下每一步发生了什么。

总结与提升

  • 能解释路径名解析步骤。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。
  • 能说明位图一项代表什么。
  • 能指出 Flash 与磁盘的一个关键差异。
  • 能说出文件相对「裸扇区」的好处。
  • 设计稿含 create/read/write/list。
  • 能说明双缓冲的好处。

延伸思考

  • 扁平「对象键值存储」算目录吗?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?
  • 掉电时位图一致性怎么办(导读 8.5)?
  • 小文件用连续分配的问题?

← 本阶段封面 · 课程列表