36.1 标准协议
协议包括四步:
- 轮询设备:OS反复读取状态寄存器,等待设备进入可以接收命令的就绪状态。
- OS下发数据到数据寄存器。如果CPU参与数据移动,就称之为编程的I/O(PIO)
- OS将命令写入命令寄存器。
- OS再次通过不断轮询设备,等待并判断设备是否执行完成命令。
Hint:在等待设备执行完成命令时,浪费了大量的CPU时间。
36.4 利用中断减少CPU开销
CPU不需要不断轮询设备,而是向设备发送一个请求,然后让对应进程睡眠,切换执行其他任务;当设备完成操作时,会抛出一个硬件中断。
中断允许计算与I/O重叠(overlap),这是提高CPU利用率的关键。
如果没有中断,那么在磁盘I/O时,CPU就会pause停摆。
如果利用中断允许重叠,操作系统就可以在等待磁盘操作时进行计算。
中断并非总是最佳方案,高性能设备处理请求很快,通常在CPU第一次轮询就可以返回结果;如果此时使用中断,反而会变慢(带来了进程的切换、上下文的切换)。
网络中也最好不要使用中断,网络端收到大量数据包,如果每一个包都发生一次中断,那么可能导致OS发生活锁,即不断处理中断而无法处理用户层请求。
36.5 利用DMA进行更高效的数据传送
如果使用编程的I/O(PIO)将一大块数据传给设备,CPU又会因为琐碎的任务浪费时间和算力:
进程1在运行中向磁盘写一些数据,从内存拷贝到磁盘后,磁盘上的起始位置I/O才开始,此时CPU才可以开始处理其他请求。
使用DMA(DMA引擎是系统中的一个特殊设备,不需要CPU介入就可以协调完成内存和设备间的数据传递)。
DMA工作流程: OS通过编程告诉DMA引擎数据在内存的位置,要考背的大小和目的地,此后OS就可以处理其他请求;当DMA任务完成后,抛出中断。
36.7 纳入操作系统:设备驱动程序
在最底层,OS的一部分软件清楚设备如何工作,这部分软件是设备驱动程序,所有设备交互的细节都封装在其中
文件系统(包括其上的应用程序)不清楚它使用的是什么类型的磁盘,只需要向通用块设备发送读写请求即可,块设备层会将这些请求路由给对应的设备驱动,然后设备驱动完成真正的底层操作。