Lazy loaded image
操作系统
💧I/O设备
Words 1681Read Time 5 min
2025-4-15
2025-4-15
type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态
如何将I/O 集成进计算机系统中? I/O 应该如何集成进系统中?其中的一般机制是什么?如何让它们变得高效?

系统架构

在如下计算机架构中,CPU通过某种内存总线(memory bus)或互连电缆连接到系统内存。更下面是外围总线(peripheral bus)。它们将最慢的设备连接到系统包括磁盘、鼠标及其他类似设备。
notion image
这样的分层架构物理布局合理且造价成本低。越快的总线越短,因此高性能的内存总线没有足够的空间连接太多的设备。采用这种分层的方式,可以让要求高性能的设备离CPU更近一些,低性能设备离CPU远一些。

标准设备

标志设备不是真实存在的,它是包含两个重要组件的设备。第一部分是向系统其他部分展现的硬件接口(interface)。第二部分是它的内部结构(internal structure)。包含设备相关定点特定实现,负责具体实现宿舍吧展示给系统的抽象接口。
notion image

标准协议

一个简化的设备接口包括3个寄存器:一个状态(state)寄存器,可以读取并查看设备的当前状态;一个命令(command)寄存器,用于通知设备执行某个具体任务;一个任务寄存器,将数据传给设备或从设备接收数据。
操作系统与该设备交互协议如下:
该协议分为四部:
  1. OS 反复读取状态寄存器,等待设备进入可以接受命令的状态。称为轮询(polling)设备。
  1. OS 下发数据到数据寄存器。
  1. OS 将命令写入命令寄存器
  1. OS 再次通过不断轮询寄存器,等待并判断设备是否执行完成命令。
这个协议的轮询过程比较低效,在等待设备执行完成命令时浪费大量 CPU 时间,如果此时操作系统可以切换执行下一个就绪进程,就可以大大提高 CPU 的利用率。

利用中断减少CPU开销

有了中断后,CPU不需要不断轮询设备,而是向设备发出一个请求,然后就可以让对应进程睡眠,切换执行其他任务。当设备完成了自身操作,会抛出一个硬件中断,引发 CPU 跳转执行操作系统预先定义好的中断服务例程(Interrupt Service Routine,ISR),或更为简单的中断处理程序(interrupt handler)。中断处理程序会结束之前的请求并且唤醒等待 I/O的进程继续执行。
中断允许计算与 I/O 重叠(overlap),这是提高CPU利用率的关键。
notion image
上图,进程1 在CPU上运行一段时间,然后发出一个读取数据的I/O请求给磁盘。、如果没有中断,那么操作系统就会简单自旋,不断轮询设备状态,直到设备完成 I/O 操作(对应其中的 p)。当设备完成请求的操作后,进程 1 又可以继续运行。
当我们运行进程重叠:
notion image
磁盘处理进程1的请求时,操作系统在CPU上运行进程2.磁盘处理完成后,触发一个中断,然后操作唤醒进程1继续运行。无论是CPU还是磁盘都可以有效地利用。
💡
中断并非总是比 PIO(Programmed I/O) 好
尽管中断可以做到计算与 I/O 的重叠,但这仅在慢速设备上有意义。如果短时间内出现大量的中断,可能会使得系统过载并且引发活锁。

利用DMA 进行更高级的数据传输

使用DMA(Direct Memory Access)来减少 PIO 的开销。DMA 是一种特殊设备,可以协调完成内存和设备间的数据传递,不需要CPU介入。其工作过程如下:
为了能将数据传送给设备,OS会通过编程告诉 DMA 引擎数据在内存的位置,要拷贝的大小以及要拷贝哪个设备。之后,OS 就可以处理其他请求了。当DMA 的任务完成后,DMA 控制器会抛出一个中断来告诉操作系统自己已经完成数据传输。修改后的时间先如下:
notion image
由上图知,数据的拷贝工作都是由 DMA 控制器来完成的,因为 CPU 在此时是空闲的,所以操作系统可以让它做一些其他事情。

设备交互方法

随着设备的发展,主要有两种方式来实现与设备的交互。
  1. 用明确的 I/O指令。这些指令规定了操作系统将数据发送到特定设备寄存器的方法,从而允许构造上文提到的协议。
  1. 内存映射 I/O (memory-mapped I/O)。通过这种方式,硬件将设备寄存器作为内存地址提供。

设备启动器

如何实现一个设备无关的操作系统 如何保持操作系统的大部分与设备无关,从而对操作系统的主要子系统隐藏设备交互的细节?
抽象(abstraction)技术:在最底层,OS 知道设备如何工作,将这部分软件称为设备驱动器(device drive),所有设备的交互细节都封装在其中。
在Unix 的文件系统栈中,文件系统完全不清楚使用的何种类型的磁盘。它只需要简单地向通用块备层发送读写请求即可,块设备层会将这些请求路由给对应的设备驱动,然后设备驱动来完成真正的 底层操作。
notion image

小结

中断和 DMA,用于提高设备效率。
访问设备寄存器的两种方式:I/O 指令和内存映射 I/O
 
上一篇
页面置换
下一篇
多级反馈队列