以下皆为我个人的想法,内容可能会有偏差
程序查询方式
准备阶段,在CPU的寄存器中设置好主存缓冲区的首地址和计数值
首先,cpu通过命令线发出启动指令去启动设备,然后在地址线发送地址码,与之匹配对应的I/O接口中SEL有效,接口会将I/O的数据送至接口中数据缓冲寄存器,当完成这一工作后,D = 1,B = 0,表示外设准备好了。
针对单设备,CPU启动设备之后,会一直发出测试指令,查询I/O设备是否准备就绪,如果准备就绪就会发出传送指令,进行传送数据。
针对多设备,CPU发出启动指令去启动设备相对于设备将数据送至接口中的数据缓冲寄存器所花费的时间是很快的,因此,就会发生以下情况:CPU一段时间内发出多个启动设备的指令,当然也会发出测试指令,但是,发现设备都没准备好,而此时已经启动了多个设备。那么该如何处理呢?
程序查询流程便应运而生,当CPU发出测试指令的时候,它会从1号设备开始查询,判断其是否准备好了,如果没有,CPU就发出转移指令,查询其他的设备,发出测试指令,测试是否准备好了,直到有一个设备准备好了,CPU发出传送指令,进行数据传输。
程序中断方式
理解了程序查询方式,对中断就很容易理解了,因为中断就是在此基础上改进的。程序查询方式的弊端是,在外设准备阶段,CPU会一直发出测试指令,直到外设准备好了,CPU的利用率就很低了。
加上多进程的知识,进程进行I/O的时候,该进程进入阻塞状态,进而CPU执行其他进程,I/O结束后,进程从阻塞队列到就绪队列。
程序中断方式的过程是:
首先,CPU发出启动指令去启动设备,CPU不必一直发测试指令了。等到指令周期结束后,CPU会发出中断查询信号,若设备准备好了,I/O接口会发出一个中断请求。CPU进行中断响应,传输数据。
中断与查询的区别在于:查询方式,CPU在外设准备阶段会一直发出查询指令,而中断方式CPU在外设准备阶段,仍然可以执行程序,等到外设准备好了,执行中断,将数据传送到内存中。