36.1 标准协议

协议包括四步:

  1. 轮询设备:OS反复读取状态寄存器,等待设备进入可以接收命令的就绪状态。
  2. OS下发数据到数据寄存器。如果CPU参与数据移动,就称之为编程的I/O(PIO)
  3. OS将命令写入命令寄存器。
  4. OS再次通过不断轮询设备,等待并判断设备是否执行完成命令。

Hint:在等待设备执行完成命令时,浪费了大量的CPU时间。

36.4 利用中断减少CPU开销

CPU不需要不断轮询设备,而是向设备发送一个请求,然后让对应进程睡眠,切换执行其他任务;当设备完成操作时,会抛出一个硬件中断。

中断允许计算与I/O重叠(overlap),这是提高CPU利用率的关键。
image.png
如果没有中断,那么在磁盘I/O时,CPU就会pause停摆。

image.png
如果利用中断允许重叠,操作系统就可以在等待磁盘操作时进行计算。

中断并非总是最佳方案,高性能设备处理请求很快,通常在CPU第一次轮询就可以返回结果;如果此时使用中断,反而会变慢(带来了进程的切换、上下文的切换)。

网络中也最好不要使用中断,网络端收到大量数据包,如果每一个包都发生一次中断,那么可能导致OS发生活锁,即不断处理中断而无法处理用户层请求

36.5 利用DMA进行更高效的数据传送

如果使用编程的I/O(PIO)将一大块数据传给设备,CPU又会因为琐碎的任务浪费时间和算力:
image.png
进程1在运行中向磁盘写一些数据,从内存拷贝到磁盘后,磁盘上的起始位置I/O才开始,此时CPU才可以开始处理其他请求。

使用DMA(DMA引擎是系统中的一个特殊设备,不需要CPU介入就可以协调完成内存和设备间的数据传递)。

DMA工作流程: OS通过编程告诉DMA引擎数据在内存的位置,要考背的大小和目的地,此后OS就可以处理其他请求;当DMA任务完成后,抛出中断。
image.png

36.7 纳入操作系统:设备驱动程序

在最底层,OS的一部分软件清楚设备如何工作,这部分软件是设备驱动程序,所有设备交互的细节都封装在其中
image.png
文件系统(包括其上的应用程序)不清楚它使用的是什么类型的磁盘,只需要向通用块设备发送读写请求即可,块设备层会将这些请求路由给对应的设备驱动,然后设备驱动完成真正的底层操作