程序直接控制方式
一次读数据操作
-
其核心就是让我们的CPU去轮询
- CPU向控制器发出读指令,于是设备启动,并且将状态寄存器设置位1(未就绪)
- 轮询检查控制器的状态(其实就是再不断地执行程序的循环,若状态位一直是1,说明设备还没有准备好要输入的数据,于是CPU会不断地轮询)
- 输入设备将准备好的数据传给控制器,并报告自身的状态
- 控制器将输入的数据放到数据寄存器中,并将状态位改为0(已就绪)
- CPU通过轮询发现数据已经就绪,即可将数据寄存器中的内存读入CPU的寄存器中,然后再将CPU寄存器中的数据读入到内存
- 因为需要CPU的寄存器来中转,所以读写的单位是字
- PU干预的频率很频繁,I/O操作开始之前,完成之后都需要CPU的介入,并且在等待的时候还需要等待I/O的完成过程中CPU需要不断轮询检查——导致CPU和I/O设备只能串行工作
- 这种方式虽然实现简单,但是效率很低,导致CPU和I/O设备只能串行工作
中断驱动方式
- 因为轮询会浪费大量的CPU资源,CPU的利用率很低
-
由于我们的I/O设备速度很慢,如果采用轮询会大大浪费我们的CPU资源,所以当引入我们的中断机制,当CPU发出了读/写命令之后,可将等待I/O的进程阻塞,先切换搭配别的进程执行,当I/O完成之后,控制器会向CPU发出一个中断信号,CPU检测到中断信号之后,会保存当前进程的允许环境信息,转去执行中断程序,处理中断的过程中CPU从I/O控制器读一个字的数据仅CPU的寄存器,再写入主存
- CPU会再每个指令周期的末尾进行检测中断
- 中断处理过程中需要保存和恢复进程的运行环境,这也是需要时间开销,所以中断的频率也不能太高
-
因为还是需要CPU作为中介,每次读写是一个字为单位
-
优点:与程序直接控制方式的轮询相比,中断驱动方式中,I/O控制会通过中断信号主动报告已完成,CPU就不需要不停的轮询来检查,可以实现CPU和I/O设备可并行工作,提高CPU的利用率
-
每个字在I/O设备和内存之间的传输还是需要。需要经过CPU,频繁的中断处理会消耗较多的CPU时间
DMA方式
- 虽然
中断驱动方式解决了程序直接控制方式
的问题,但是每一次只能读/写一个字,导致CPU频繁切换,耗费了很多时间。于是人们又发明了DMA方式。
- DMA的方式数据的传输单位是块——不再需要经过CPU的中转
- 数据的流向是从设备直接放入内存,或者从内存直接到设备
- 仅在传输一个或者多个数据块的开始和结束,才需要CPU的干预
- DR数据寄存器
- 暂存从设备到内存,或者从内存到设备的数据
- MAR 内存地址寄存器
- 在输入的时候,MAR表示数据应放到内存的什么位置输出的时候表示输出的数据放在内存的什么位置
- DC 数据计数器 表示剩余要读/写的字节数
- CR 用于存放CPU发来的I/O命令,或者设备的状态信息
- CPU的干预的频率比较低,只要在传输一个或者多个数据块的开始和结束的时候,才需要CPU的干预
- 读写的单位是一个或者多个块(因为读写的只可能是连续的多个块,且这些块读入内存后再内存中也必须是连续的
- 缺点:CPU发出一条I/O指令,只能读/写一个或者多个连续的数据块
- 如果要读/写多个离散存储的数据块,或者要将数据分别写道不同的内存区域中,CPU要分别发出多条I/O指令,进行多次中断处理才能完成
通道控制方法
- 通道控制的方式是为了解决DMA方式连续存储的问题
-
通道:一种硬件,可以理解为是弱鸡版的CPU,通道可以识别一些列的通道指令
- CPU告诉通道我已经把你要执行的任务放到内存,你去取一下,然后按照这个任务清单去做,做完发个信息通知一下
- CPU向通道发出I/O指令,指明通道程序再内存中的位置,并指明要操作哪个I/O设备,之后CPU饥切换到其他进行执行了
- 通道执行内存中的通道程序
- 通道执行完规定的任务之后,向CPU发出中断信号,之后CPU对中断进行处理
- CPU告诉通道我已经把你要执行的任务放到内存,你去取一下,然后按照这个任务清单去做,做完发个信息通知一下
-
CPU干预的频率是极低的,通道会根据CPU的指示执行相应的通道程序,只有完成了一组数据块的读/写才需要发出中断信号
-
传输的单位——每次读/写一组数据块
-
缺点就是实现复杂,需要专门的通道硬件支持