设备管理

需了解操作系统缓冲区、设备管理和 SPOOLing 知识,可能在选择题中考察。

缓冲区

缓冲区 是一块预留在内存中的区域,用于临时存放数据,从而使得输入/输出操作与其他处理操作可以相对独立地进行。缓冲区 的使用可以减少 I/O 操作的等待时间,提高系统的整体效率。

磁盘高速缓存

磁盘缓存 指的是利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。

因此,磁盘高速缓存 从逻辑上属于磁盘,物理上则是驻留在内存中的盘块。

缓冲区实现

单缓冲

单缓冲 策略中,只有一个 缓冲区 用于数据的读取或写入。

工作过程:

  • 数据从源(例如,磁盘)读入到 单个缓冲区
  • 当数据在 缓冲区 内时,应用程序可以从该 缓冲区 中处理数据。
  • 当应用程序处理完 缓冲区 中的数据并需要更多数据时,新的数据再次被读入到同一 缓冲区 中。

缺点:当 缓冲区 被填满并且数据被应用程序处理时,I/O 操作必须等待,直到 缓冲区 再次可用。这可能导致 I/O 操作的延迟

双缓冲

双缓冲 使用两个 缓冲区 而不是一个。当一个 缓冲区 被应用程序用于读取或处理数据时,另一个 缓冲区 可以用于并行的 I/O 操作

工作过程:

  • 数据从源读入到第一个 缓冲区
  • 当第一个 缓冲区 的数据被应用程序处理时,第二个 缓冲区 可以开始并行地加载下一批数据。
  • 一旦第一个 缓冲区 的数据被处理完毕,应用程序可以立即切换到第二个 缓冲区,而第一个 缓冲区 则开始加载新的数据。

优点:

由于两个 缓冲区 交替使用,I/O 操作和数据处理可以并行进行,从而减少了等待时间,提高了效率。

工作区
缓冲区
I/O设备
输入
传送
用户进程
工作区
缓冲区
I/O设备
输入
传送
用户进程
缓冲区
循环缓冲

循环缓冲 是一个固定大小的 缓冲区,其特点是当达到 缓冲区 的尾部时,下一个位置自动“回绕”到 缓冲区 的开始位置。循环缓冲 的主要优点是它可以 无限地存储新数据,只要覆盖旧数据即可。

工作原理:

  • 循环缓冲 有两个指针:一个是“写”指针,另一个是“读”指针。
  • 当新数据到来时,数据被写入“写”指针当前指向的位置,并将“写”指针向前移动。
  • 当数据需要被消费或读取时,数据从“读”指针的当前位置读出,并将“读”指针向前移动。
  • 如果“写”指针到达 缓冲区 的尾部并继续前进,它会回绕到 缓冲区 的开始位置。同样,“读"指针也会如此。
缓冲池

缓冲池 是一组预先分配的 缓冲区,这些 缓冲区 可以被系统中的多个进程或线程共享和重新使用。

工作原理:

  • 当一个进程需要一个 缓冲区 时,它从 缓冲池 中请求一个。如果可用的话,一个 缓冲区 会分配给该进程。
  • 一旦进程完成了对 缓冲区 的使用,它会将 缓冲区 返回到池中,使其可以被其他进程重新使用。
  • 如果 缓冲池 为空,进程可能需要等待,直到有其他进程释放一个 缓冲区

设备分配和回收

设备分配 是指根据用户的 I/O 请求 分配所需的设备。分配的原则是充分发挥设备的使用效率,尽可能地让设备忙碌,但又避免造成死锁。

从设备的特性来看,设备常使用以下三种使用方式:

  • 独占式使用设备
  • 分时共享使用设备
  • 以 SPOOLing 方式使用外部设备

数据结构

在操作系统中,为了有效管理和访问外围设备,经常使用一种数据结构叫做 设备控制表(Device Control Table,简称 DCT)。这是一个特殊的数据结构,用于存储有关连接到系统的每个设备的信息。

     设备类型type
DCT 1
DCT 2
DCT n
     设备标识符deviceid
      设备状态
      指向控制器表的指针
      重复执行次数或时间
      设备队列的队首指针
设备控制表DCT

设备分配方式

  • 静态分配:在 静态分配 中,设备在程序开始执行时分配,并在程序执行完毕后才释放。这意味着该设备在程序执行期间是专用的,不会被其他进程共享。
  • 动态分配:在 动态分配 中,设备只在需要时被分配,并在不再需要时立即释放,这使得其他进程可以在第一个进程的 I/O 操作 之间使用该设备。

分配安全性

  • 安全分配安全分配 意味着操作系统在分配资源时采用一种策略,确保系统始终处于一个不会导致死锁的状态。
  • 不安全分配不安全的分配 方式并不意味着系统必然会进入死锁,但它意味着系统采取了一种策略,可能会使其进入不安全状态。

逻辑和物理设备映射

在操作系统中管理设备时,涉及到两种名字:

  • 逻辑设备名:是用户和应用程序用来引用设备的友好名称或标识符。这些名字通常比 物理设备名 更容易记忆和使用。
  • 物理设备名 :是用于直接与硬件通信的底层标识。这些名称通常更加具体,并反映了设备的实际物理特性或位置。

操作系统通过 逻辑设备表(LUT,Logical Unit Table)将 逻辑设备名 映射到 物理设备名
当应用程序或用户尝试访问一个设备时,操作系统首先查找 逻辑设备表 以确定 逻辑设备名 与哪个 物理设备 相关联。然后,操作系统使用表中的信息来管理对实际 物理设备 的访问。

例如,在 Unix/Linux 系统中,/dev 目录下的文件就是 逻辑设备名,比如:

这些设备文件本质上是对 物理设备 的逻辑映射,内核会将它们映射到底层实际的设备驱动和硬件资源。例如,/dev/sda 对应的 物理设备 可能是挂在 SATA 总线上的某个 SSD,而内核中通过设备树或 PCI 设备信息知道它的实际 物理地址 和资源。

这种映射机制的好处是:应用程序只需要处理逻辑设备名,不必关心设备的底层细节。同时也方便了设备的统一管理、权限控制和热插拔等操作。

SPOOLing 技术

SPOOLing(Simultaneous Peripheral Operations On-Line,联机并发外设操作),中文常称为“假脱机”技术,是一种用于高效管理慢速 I/O 设备(如打印机、磁带机)的计算机系统技术。它的主要作用是 缓冲数据、解耦处理流程,提高系统资源的使用效率。

输入设备
输出设备
主存
CPU
磁盘

什么是 SPOOLing?

SPOOLing 的核心思想是:将数据暂时存放在磁盘等中间存储区域,再由专门的后台程序将其送往目标外设(如打印机)。这样做的好处是,让 CPU 和外设之间的工作可以 并行进行,互不等待。

关键机制

  1. 中间存储区
    所有要输出到外设的数据,先被保存到磁盘上的一个临时区域。这相当于给设备排了一个“任务队列”。同样地,从外部设备读取的数据,也可以先写入磁盘,等待处理。

  2. 解耦与并行
    数据先保存到中间区域后,CPU 无需等待外设完成操作,可以继续执行其他任务;而外设也可以在空闲时慢慢处理队列中的任务。主机与外设实现了解耦,处理流程得以并行

  3. 后台处理机制
    SPOOLing 操作通常由系统后台的“守护进程”负责管理。例如,打印服务会定期检查打印队列,将任务按顺序发送到打印机。用户提交任务后可以继续工作,不需等待打印完成。

典型应用

在多用户环境中,多个用户可能同时提交打印请求。如果没有 SPOOLing 技术,打印机必须一个一个处理,用户只能等待。而使用 SPOOLing 后:

  • 所有打印任务首先被写入磁盘上的打印队列;
  • 打印守护进程会按顺序读取队列任务并发送到打印机;
  • 用户提交任务后立刻可以继续其他操作,无需等待打印完成。