Alex_McAvoy

想要成为渔夫的猎手

用户层的 I/O 软件

【概述】

一般而言,大部分的 I/O 软件都放在 OS 内部,但仍有一小部分在用户层中。

主要是分为三部分:

  • 系统调用:间接调用 OS 中的 I/O 过程
  • 库函数:与用户程序链接在一起
  • 假脱机系统:完全运行于内核之外

【系统调用】

为使诸进程能有条不紊的使用 I/O 设备,因此不允许在用户态的应用进程去直接调用运行在核心态的 OS 过程,而应用进程在运行时,又必须取得OS所提供的服务

于是,OS 在用户层中引入了系统调用,应用程序可以通过它,间接调用 OS 中的 I/O 过程,对 I/O 设备进行操作

当应用程序需要咨询某种 I/O 操作时,在应用程序中必须执行相应的系统调用,当 OS 捕获到系统调用命令后,会从用户态转为核心态,执行系统调用。执行完毕后,再返回用户程序

【库函数】

在 C 语言以及 UNIX 系统中,系统调用与各系统调用所使用的库函数几乎一一对应

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

【假脱机系统】

概述

假脱机系统(SPOOLing 技术),是指利用程序模拟脱机 I/O 的外围机,来完成设备 I/O 操作,简单来说,就是在引入多道程序后,利用其中一道程序,来模拟脱机输入时的外围控制机的功能

一般进程对独占设备的需求被假脱机模拟到磁盘上,所以实现设备虚拟,多道是前提,还需高速、大容量、可随机存取的外存支持

假脱机系统提高了 I/O 速度,缓和了 CPU 与 I/O 速度不匹配的矛盾,同时将独占设备改造为共享设备,并实现了虚拟设备的功能

组成

假脱机系统是对脱机输入/输出系统的模拟,主要由以下四部分组成:

  • 输入井和输出井:在磁盘上开辟两大存储空间,输入井模拟脱机输入的磁盘设备,输出井模拟脱机输出时的磁盘
  • 输入缓冲区和输出缓冲区:为缓解速度矛盾,在内存中开辟两大缓冲空间,输入缓冲区暂存输入设备送来的数据,再送给输入井;输出缓冲区暂存输出井送来的数据,再送输出设备
  • 输入进程和输出进程:用一进程模拟脱机输入时外围设备控制器的功能,把低速输入设备上的数据传送到高速磁盘上;再用另一进程模拟脱机输出时外围设备控制器的功能,把数据从磁盘上传送到低速输出设备上
  • 井管理程序:用于控制作业与磁盘井直接的信息交换。

假脱机系统的使用

打印机是最常使用的输出设备之一,其属于独占设备,但利用假脱机技术可以将其改造为多用户共享的打印设备,从而提高设备利用率

用户进程请求打印输出时,假脱机系统同意为它打印输出,但并不真正立即把打印机分配给用户进程,而只为用户做两件事:

  1. 由输出进程在输出井中为之请求一个空闲磁盘块区,并将要打印的数据送入其中
  2. 输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂在请求打印队列上

这样一来,如果打印机空闲,那么输出进程将从请求打印队列的队首取出一张请求打印表,根据表中的要求将要打印的数据,从输出井传送到输出缓冲区,再由打印机进行打印

打印完毕后,输出进程再查看请求打印队列中是否还有等待打印的请求表,如此下去,直至请求打印队列为空,输出进程才将自己阻塞起来,仅当下次再有打印请求时,输出进程才被唤醒

感谢您对我的支持,让我继续努力分享有用的技术与知识点!