考研408操作系统-IO操作的4种控制方式
IO控制方式/输入输出控制方式
即:用什么样的方式来控制IO设备的数据读写,外围设备和内存之间的IO控制方式有4种
1.程序直接控制方式
准确的讲是“CPU直接控制方式”。是因为整个过程CPU都在执行当前IO进程,其他的什么都不干。
以下为个人猜想:
至于教材为什么叫程序直接控制方式,可能是因为CPU一直被当前进程所占用,相当于是程序直接控制整个IO过程。
程序直接控制过程:
CPU通过控制线向IO控制器中的IO逻辑发送读/写信号,地址线则指明了IO操作的地址。IO逻辑接到CPU信号后,并不会立即读写数据,而是先往状态寄存器写入信息:“我现在正在干活,当前我还没有读完/写完”。
CPU怎么知道IO逻辑干没干完呢?就是通过一刻不停地检查状态寄存器来判断IO设备有没有读完/写完。也就是说,IO设备一边忙,CPU另一边不干别的,就一直盯着IO设备的状态。
IO逻辑这边修改完状态寄存器,就开始通过接口读写数据了,读进来或者要写出去的数据都放到数据寄存器。读/写完毕后,IO逻辑再次修改状态寄存器:“我忙完了”。
CPU检查到状态改变后,立刻从数据寄存器取出数据送给内存,继续投入到下一轮IO操作中。
这样做实现起来十分简单,但缺点很明显:CPU和IO设备是串行工作,CPU一直处于忙等状态干不了别的,cpu利用率很低。
2.中断驱动方式
中断驱动方式就是上一种方法的改进。既然CPU一直等着利用率低,那就不让CPU别在旁边等,直到IO设备忙完了再去叫CPU过来。而这个过程利用的就是操作系统的中断机制。
中断驱动方式:
IO控制器接收到CPU发出的命令之后不仅要修改状态寄存器还要发起一个中断信号,让CPU放弃当前IO进程,使得进程进入阻塞态。相当于IO设备对CPU说“你先走吧,等我忙完再来”。接下来的过程和之前一样。
等到IO设备读写操作完毕后,它又发起一个中断,迫使CPU放下当前进程回来执行之前阻塞的IO进程,然后CPU将数据从寄存器取出送给内存。
总的来说就是IO操作前多了两次中断操作,第一次让CPU走,第二次让CPU来。
现在CPU和IO设备是并行工作,但是另外一个问题也暴露出来了:程序直接控制方式和中断驱动方式都是每次读写一个字,当数据较大时就需要多次IO操作,一次操作就需要两次中断,n次操作就需要2n次中断。频繁的中断操作其实也是比较影响系统的运行效率的。
3.DMA方式(直接存储器存取方式)
DMA方式:
既然每次读写一个字太少了,那就想办法提高每次读写的数据量不就好了吗。
原来的IO控制器太垃圾,那就再做一个DMA控制器。实际上,DMA控制器本质上也是IO控制器,区别就是每次可以读写一个磁盘块。
同样都是控制器,那凭啥它就能每次读一个块呢?其实它也就只能每次读一个字的大小,但它比较“精明”,不会每读写一个字就发起中断,而是慢慢攒起来,攒到一个块的时候再发起中断。DMA内部有一个DC(数据计数器),它通过DC统计自己在DR(数据寄存器)积攒的数据量,达到一个块就发起中断。
除此之外还有一个改进:那就是DMA控制器读写的数据直接交给内存,无需经过CPU。
但DMA方式还是有缺点的:cpu每次发出一条IO指令只能读写一个或多个连续的数据块。
读写离散的块还是需要多次中断。
4.通道控制方式
通道控制方式:
通道是专门被开发出来处理IO操作的处理机,就像GPU专门处理图像信号那样。
IO通道既充当了cpu的角色,又充当了IO控制器的角色。
通道控制方式的流程是这样的:cpu发出IO指令,指令当中会告诉通道要读写的IO设备是谁、要读写的数据量是多少、要读写的内存地址是多少... IO通道接收指令后读取通道程序开始读写操作,从IO设备读出的数据直接到内存,中间过程通道会自己处理,不用关心它中间读写的是连续的数据块还是不连续的。通道操作完毕后发起中断,一次IO操作完毕。
CPU就像是一家之主,通道则是一个大管家,那些工作的细节主人不用关心,只要关注结果即可。
总结: