本地资料设备管理
SCHEDULE LOCAL低优先级17 个小节覆盖真题 20092023
关联考点缓冲区6设备分配和回收3SPOOLing1做相关真题 · 10 道 →
做相关真题 · 10 道选中文字可高亮或加下划线
选中文字高亮 · 下划线

设备管理

真题练习

低频考点,大致了解下这节的三个概念:缓冲区、设备分配和回收、SPOOLing 就行,在选择题偶尔会考察。

缓冲区

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

缓冲区的重点是协调“生产者和消费者速度不一致”的传输过程;它不是为了保存热门数据而存在。一个数据块可以先进入缓冲区,再被保留到高速缓存中,二者在实现上可能共用内存,但解决的问题不同。

磁盘高速缓存

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

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

对比项 缓冲区(buffer) 高速缓存(cache)
首要目的 平滑设备与进程的速度差,允许生产与消费衔接 利用时间/空间局部性,避免再次访问慢设备
数据生命周期 通常随一次输入、输出或队列处理而流动 可在内存中保留副本,等待后续命中
典型状态 空、正在填充、已满待处理、正在输出 命中、未命中、脏、可替换
不能据此推出 有缓冲就一定重复利用数据 命中缓存就不需要同步或排队

缓冲区实现

单缓冲

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

工作过程:

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

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

对输入而言,单缓冲的典型节奏是“设备填满缓冲区 → 进程处理这一块 → 设备才能填下一块”。同一块内存不能同时被设备写入和进程读取,否则数据边界与内容都可能被破坏。

双缓冲

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

工作过程:

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

优点:

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

双缓冲让设备输入与进程处理两批数据交叠

循环缓冲

循环缓冲 是一个固定大小的缓冲区,读写位置到达尾部后会回绕到开头。它可以长期重复使用同一块空间,但容量并非无限:缓冲区满时,生产者必须等待、扩展容量或按既定策略覆盖旧数据;直接覆盖会造成尚未读取的数据丢失。

工作原理:

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

空、满与同步

只看“读指针是否等于写指针”无法同时区分:两者都可能出现指针相等。实现通常额外维护已用单元数,或约定始终保留一个空槽。缓冲区为空时消费者必须等待,缓冲区已满时生产者必须等待;读写指针和计数的更新还必须互斥。这里与同步和互斥中的互斥锁、empty / full 信号量是同一个问题。

缓冲池

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

工作原理:

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

实际管理时,缓冲池往往至少区分“空闲缓冲区队列”和“已装入、待处理的缓冲区队列”。这样设备、内核和用户进程能在不同队列间交接所有权,而不是同时使用同一块缓冲区。

设备分配和回收

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

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

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

例如,打印机本来适合独占使用,借助 SPOOLing 后可由多个进程并发提交任务,再由后台程序按队列顺序实际使用设备。

数据结构

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

设备控制表 DCT 记录设备状态、队列和控制器信息

教材中的表项名称会随系统而变化,但 DCT 至少要让内核回答“是什么设备、能否使用、谁在等、由谁控制”四个问题:

DCT 中的典型字段 用途
设备标识、类型与状态 找到目标设备,并判断空闲、忙、故障等状态
等待队列指针 保存暂时不能获得设备的进程或请求
控制器 / 通道关联 找到向下发出命令的硬件路径
驱动入口或操作表 连接到设备相关的初始化、启动、完成处理代码

设备分配方式

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

分配安全性

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

在设备分配语境中,安全分配通常要求进程只有在所需资源能够一次满足时才开始占有,避免“拿着 A 等 B”的循环等待;代价是设备利用率可能下降。不安全分配允许进程先取得部分资源,利用率较高,但必须依赖排序、撤销或死锁处理等其他机制控制风险。它与银行家算法中的“安全状态”有相通的目标,但不是同一个表格检查过程。

分配与回收的过程

一次设备请求并非只是在 DCT 上写一个“已分配”标记,通常沿着下面的路径推进:

  1. 解析名称:把应用给出的逻辑设备名解析到可用的设备条目。
  2. 检查与排队:检查访问权限、设备状态和分配策略;设备忙或暂不满足条件时,请求进入相应等待队列。
  3. 占有与启动:更新 DCT / 队列,调用驱动设置控制器寄存器或 DMA 描述符,并使请求进程等待完成事件。
  4. 完成通知:控制器完成、出错或被取消时产生中断;中断处理程序记录结果、推进队列。
  5. 回收与唤醒:释放本次占用的设备或缓冲区,唤醒下一个等待请求和本次 I/O 的进程;被唤醒的进程先进入就绪态。
过程流

设备分配、完成与回收不是一个瞬间

逐步查看逻辑设备名如何落到 DCT、请求如何排队、驱动如何启动,以及完成中断后谁被唤醒。

解析名称并定位 DCT检查状态与分配策略检查状态与分配策略更新占有关系并启动驱动更新占有关系并启动驱动完成中断推进请求队列完成中断推进请求队列回收并唤醒

当前查看:解析名称并定位 DCT设备独立性软件从逻辑设备表找到目标设备、控制器关联和驱动入口。

逻辑和物理设备映射

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

  • 逻辑设备名:用户和应用程序引用设备的稳定名称或标识符,屏蔽设备具体位置与型号。
  • 物理设备名:内核用于定位设备实例、控制器或驱动的底层标识。

在 408 的抽象模型中,设备独立性软件通过 逻辑设备表(LUT,Logical Unit Table)把 逻辑设备名 映射到可用的 物理设备,表项还可关联设备状态、DCT 或驱动入口。应用提交逻辑名称后,系统先做名称解析、权限与可用性检查,再把通用 I/O 请求交给相应设备驱动;驱动把请求转换为控制器能执行的硬件命令。

例如,Unix/Linux 的 /dev 设备文件可以帮助理解这一层次,但它不是教材 LUT 的逐字段实现:设备文件元数据中的设备号帮助内核找到驱动和设备实例,驱动再操作具体控制器。

过程流

逻辑设备名如何落到具体硬件

逐步查看应用程序只提供逻辑名称后,操作系统如何解析设备号、选择驱动并最终操作控制器和物理设备。

应用提交逻辑设备名查表并解析设备号查表并解析设备号驱动翻译通用请求驱动翻译通用请求控制器操作物理设备

当前查看:应用提交逻辑设备名应用通过设备文件或统一接口发出 I/O 请求,不需要知道设备的物理地址。

例如,某个 /dev 名称可以解析到一个内核设备实例及其驱动,驱动再通过总线、控制器和寄存器资源操作硬件。这里的设备号、驱动入口与控制器寄存器地址分属不同层次,不能把它们统称为“物理设备名”或“设备的物理地址”。

这种映射机制的好处是:应用程序只需要处理逻辑设备名,不必关心设备的底层细节。教材层面的关键收益是设备独立性、统一命名与便于重新分配;具体系统还可借此实施权限控制和热插拔管理。

SPOOLing 技术

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

多个进程把打印任务写入磁盘队列并由守护进程串行输出

什么是 SPOOLing?

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

教材中常把磁盘上的这块中间区域称为输入井 / 输出井。输入进程负责把外设输入送入输入井,输出进程或打印守护进程负责从输出井按队列取走任务;对提交任务的用户而言,慢速独占设备仿佛变成了可并发提交的“虚拟设备”,实际设备仍是一份一份地串行服务。

关键机制

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

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

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

典型应用

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

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