设备管理
缓冲区
磁盘高速缓存
磁盘缓存指的是利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。
因此,磁盘高速缓存从逻辑上属于磁盘,物理上则是驻留在内存中的盘块。
缓冲区
缓冲区是一块预留在内存中的区域,用于临时存放数据,从而使得输入/输出操作与其他处理操作可以相对独立地进行。缓冲区的使用可以减少 I/O 操作的等待时间,提高系统的整体效率。
单缓冲
在单缓冲策略中,只有一个缓冲区用于数据的读取或写入。
工作过程:
- 数据从源(例如,磁盘)读入到单个缓冲区。
- 当数据在缓冲区内时,应用程序可以从该缓冲区中处理数据。
- 当应用程序处理完缓冲区中的数据并需要更多数据时,新的数据再次被读入到同一缓冲区中。
缺点:当缓冲区被填满并且数据被应用程序处理时,I/O 操作必须等待,直到缓冲区再次可用。这可能导致 I/O 操作的延迟。
双缓冲
双缓冲使用两个缓冲区而不是一个。当一个缓冲区被应用程序用于读取或处理数据时,另一个缓冲区可以用于并行的 I/O 操作。
工作过程:
- 数据从源读入到第一个缓冲区。
- 当第一个缓冲区的数据被应用程序处理时,第二个缓冲区可以开始并行地加载下一批数据。
- 一旦第一个缓冲区的数据被处理完毕,应用程序可以立即切换到第二个缓冲区,而第一个缓冲区则开始加载新的数据。
优点:
由于两个缓冲区交替使用,I/O 操作和数据处理可以并行进行,从而减少了等待时间,提高了效率。
循环缓冲
循环缓冲是一个固定大小的缓冲区,其特点是当达到缓冲区的尾部时,下一个位置自动“回绕”到缓冲区的开始位置。循环缓冲的主要优点是它可以无限地存储新数据,只要覆盖旧数据即可。
工作原理:
- 循环缓冲有两个指针:一个是“写”指针,另一个是“读”指针。
- 当新数据到来时,数据被写入“写”指针当前指向的位置,并将“写”指针向前移动。
- 当数据需要被消费或读取时,数据从“读”指针的当前位置读出,并将“读”指针向前移动。
- 如果“写”指针到达缓冲区的尾部并继续前进,它会回绕到缓冲区的开始位置。同样,“读"指针也会如此。
缓冲池
缓冲池是一组预先分配的缓冲区,这些缓冲区可以被系统中的多个进程或线程共享和重新使用。
工作原理:
- 当一个进程需要一个缓冲区时,它从缓冲池中请求一个。如果可用的话,一个缓冲区会分配给该进程。
- 一旦进程完成了对缓冲区的使用,它会将缓冲区返回到池中,使其可以被其他进程重新使用。
- 如果缓冲池为空,进程可能需要等待,直到有其他进程释放一个缓冲区。
设备分配和回收
设备分配是指根据用户的 I/O 请求分配所需的设备。分配的原则是充分发挥设备的使用效率,尽可能地让设备忙碌,但又避免造成死锁。
从设备的特性来看,设备常使用以下三种使用方式:
- 独占式使用设备
- 分时共享使用设备
- 以 SPOOLing 方式使用外部设备
数据结构
在操作系统中,为了有效管理和访问外围设备,经常使用一种数据结构叫做“设备控制表”(Device Control Table,简称 DCT)。这是一个特殊的数据结构,用于存储有关连接到系统的每个设备的信息。
设备分配方式
- 静态分配:在静态分配中,设备在程序开始执行时分配,并在程序执行完毕后才释放。这意味着该设备在程序执行期间是专用的,不会被其他进程共享。
- 动态分配:在动态分配中,设备只在需要时被分配,并在不再需要时立即释放,这使得其他进程可以在第一个进程的 I/O 操作之间使用该设备。
分配安全性
- 安全分配:安全分配意味着操作系统在分配资源时采用一种策略,确保系统始终处于一个不会导致死锁的状态。
- 不安全分配:不安全的分配方式并不意味着系统必然会进入死锁,但它意味着系统采取了一种策略,可能会使其进入不安全状态。
逻辑和物理设备映射
在操作系统中管理设备时,涉及到两种名字:
- 逻辑设备名:是用户和应用程序用来引用设备的友好名称或标识符。这些名字通常比物理设备名更容易记忆和使用。
- 物理设备名 :是用于直接与硬件通信的底层标识。这些名称通常更加具体,并反映了设备的实际物理特性或位置。
操作系统通过逻辑设备表(LUT,Logical Unit Table)将逻辑设备名映射到物理设备名。 当应用程序或用户尝试访问一个设备时,操作系统首先查找逻辑设备表以确定逻辑设备名与哪个物理设备相关联。然后,操作系统使用表中的信息来管理对实际物理设备的访问。
例如,在 Unix/Linux 系统中,/dev
目录下的文件就是逻辑设备名,比如:

这些设备文件本质上是对物理设备的逻辑映射,内核会将它们映射到底层实际的设备驱动和硬件资源。例如,/dev/sda
对应的物理设备可能是挂在 SATA 总线上的某个 SSD,而内核中通过设备树或 PCI 设备信息知道它的实际物理地址和资源。
这种映射机制的好处是:应用程序只需要处理逻辑设备名,不必关心设备的底层细节。同时也方便了设备的统一管理、权限控制和热插拔等操作。
SPOOLing 技术
SPOOLing(Simultaneous Peripheral Operations On-Line,联机并发外设操作),中文常称为“假脱机”技术,是一种用于高效管理慢速 I/O 设备(如打印机、磁带机)的计算机系统技术。它的主要作用是缓冲数据、解耦处理流程,提高系统资源的使用效率。
什么是 SPOOLing?
SPOOLing 的核心思想是:将数据暂时存放在磁盘等中间存储区域,再由专门的后台程序将其送往目标外设(如打印机)。这样做的好处是,让 CPU 和外设之间的工作可以并行进行,互不等待。
关键机制
中间存储区 所有要输出到外设的数据,先被保存到磁盘上的一个临时区域。这相当于给设备排了一个“任务队列”。同样地,从外部设备读取的数据,也可以先写入磁盘,等待处理。
解耦与并行 数据先保存到中间区域后,CPU 无需等待外设完成操作,可以继续执行其他任务;而外设也可以在空闲时慢慢处理队列中的任务。主机与外设实现了解耦,处理流程得以并行。
后台处理机制 SPOOLing 操作通常由系统后台的“守护进程”负责管理。例如,打印服务会定期检查打印队列,将任务按顺序发送到打印机。用户提交任务后可以继续工作,不需等待打印完成。
典型应用
在多用户环境中,多个用户可能同时提交打印请求。如果没有 SPOOLing 技术,打印机必须一个一个处理,用户只能等待。而使用 SPOOLing 后:
- 所有打印任务首先被写入磁盘上的打印队列;
- 打印守护进程会按顺序读取队列任务并发送到打印机;
- 用户提交任务后立刻可以继续其他操作,无需等待打印完成。