也称与设备无关的软件,是 I/O 系统的最高层软件。设备独立性软件包括执行所有设备公有操作的软件。
高速缓存与缓冲区
磁盘高速缓存(Disk Cache)
与介于 CPU 和内存之间的 Cache 不同,Disk Cache 是位于磁盘和内存之间的缓存。磁盘高速缓存逻辑上属于磁盘,物理上是内存中的盘块。
缓冲区
设备分配与回收
设备控制表(DCT)
DCT 包含以下字段:
- 设备类型。如打印机、扫描仪、键盘等
- 设备标识符。即物理设备名(唯一)
- 设备状态。当前设备状态(空闲/忙碌)
- 指向控制器表的指针
- 重复执行次数或时间。重复 n 次仍不成功时,才认为此次 I/O 失败
- 设备队列的队首指针。指向正在等待该设备的进程队列(由 PCB 组成)的队首
控制器控制表(COCT)
每个设备控制器对应一张 COCT。字段包含:
- 控制器标识符(id)
- 控制器状态(忙碌/空闲)
- 与控制器连接的通道表指针
- 控制器队列的队首指针
- 控制器队列的队尾指针
通道控制表(CHCT)
每个通道对应一张 CHCT。字段包含:
- 通道标识符(id)
- 通道状态(忙碌/空闲)
- 与通道连接的控制器表指针
- 通道队列的队首指针
- 通道队列的队尾指针
系统设备表(SDT)
整个系统只有一张 SDT。每个物理设备对应一项。每项的字段包含:
- 设备类型
- 设备标识符
- 指向 DCT 的指针
- 驱动程序入口
设备分配应考虑的因素
设备的固有(共享)属性
- 独占设备
- 共享设备
- 虚拟设备
设备分配算法
- FCFS 算法
- 最高优先级优先算法。优先级相同则按 FCFS 排队
设备分配中的安全性
- 安全分配方式。每当进程发出 I/O 请求后,便进入阻塞态,知道 I/O 操作完成时才被唤醒
- 不安全分配方式。进程发出 I/O 请求后仍继续运行,可能会发出更多的 I/O 请求。仅当进程所请求的设备被另一进程占用时,才进入阻塞态。
设备分配的步骤
- 分配设备。根据 I/O 请求中的物理设备名,查找 SDT,从中找出该设备的 DCT,在根据 DCT 中的设备状态字段判断设备状态。若忙,则将进程 PCB 挂到设备等待队列中;若不忙,则根据 设备分配算法 将设备分配给该进程
- 分配控制器。设备分配后,根据 DCT 找到 COCT,查询控制器状态。若忙,则将进程 PCB 挂到控制器等待队列中;若不忙,则将控制器分配给该进程
- 分配通道。控制器分配后,根据 COCT 找到 CHCT,查询通道状态。若忙,则将 PCB 挂到通道等待队列中;若不忙,则将通道分配给该进程。只有设备、控制器、通道都分配成功时,才是一次成功的设备分配。
总结:因为 SDT 一个系统只有一张,所以从 SDT 开始,SDT →CDT→COCT→CHCT 按顺序分配。
逻辑设备名到物理设备名的映射
逻辑设备名就是设备类型(如 printer)
逻辑设备表 LUT 用于将逻辑设备名映射为物理设备名。
可采用两种方式:
- 整个系统中只设置一张 LUT
- 每个用户设置一张 LUT
SPOOLing 技术
SPOOLing (假脱机) 技术是为了缓和 CPU 的高速性和 I/O 设备的低速性。该技术将独占设备改造成共享设备。
SPOOLing 系统由预输入程序、井管理程序、缓输出程序组成。
输入井和输出井是磁盘空间中的两块固定区域。输入井模拟脱机输入时的磁盘设备,用于暂存 I/O 设备输入的数据;输出井模拟脱机输出时的磁盘,用于暂存用户程序的输出数据。
假脱机系统的特点:
- 提高了 I/O 速度
- 将独占设备改造成共享设备
- 实现了虚拟设备功能
- 需要外存的支持
- 需要支持多道程序设计技术