【操作系统】IO

来源:互联网 发布:快牙软件下载 编辑:程序博客网 时间:2024/06/07 19:03

最近在看《现代操作系统》一书,这本书讲解操作系统的结构比较清晰,做一个总结。该书主要以软件层次和硬件层次两个角度来讲解。

IO硬件:

第一个就是IO的设备了,比如磁盘,键盘等。

第二个是设备控制器,这个在计算机内部,会包含若干接口,这个部件负责从设备读取或者向设备写入数据,并且提供了校验功能。这个设备内部有一个缓冲区,缓冲区包括了控制寄存器和数据区。cpu与设备进行交互,会把命令发送到设备控制器的控制寄存器中,然后控制器读取到命令,再操作设备完成任务。通过控制寄存器,cpu和设备可以交互。当要传输数据的时候,需要缓冲区作为中介,这是为什么?主要有两个原因,第一是有些数据需要组装或者校验,因此必须缓存一部分,以至接收到一个分组的单元,比如块。第二个原因是速度的差异,这个可以联想到进程中的生产者-消费者经典案例,如果不缓存设备的数据而是直接交给cpu处理,那么设备发送数据的速度是恒定的,但是cpu可能干其他事没有时间理会设备发来的数据,那么这些数据就会丢失,所以因为cpu处理数据和设备处理数据的速度差异导致了必须设立一个缓冲区。

明白了设备控制器上的缓冲区以后,那么cpu是如何与缓冲区通信呢?

第一种方法就是为每一个控制寄存器或者缓冲区设置一个端口号,相当于加上了一个标识;

第二种方法叫做内存映射IO,就是直接用一块内存作为缓冲区,通常位于地址0开始的地方。设备管理器会直接把从设备中读取的数据放置在内存的缓冲区中。那么之前不是说无法直接将数据放入内存吗?开始我也理解不了,貌似有点矛盾。仔细想想,其实这里的两个写入内存是不同的概念,之前指的是不用缓冲区,读来的数据立即被cpu使用,这种情况由于速度不同步等原因无法实现。而这里指的是使用缓冲区,只不过缓冲区在内存上而已,即设备控制器把数据缓冲到了一块位于内存中的缓冲区上。

第三个是DMA,当数据已经到了缓冲上,cpu就要使用缓冲区上的数据了,这时cpu需要执行拷贝操作,DMA的思路是把cpu从拷贝缓冲区的工作中解脱出来,这些事情不需要cpu来做,反而交给了DMA来做,DMA本身就像一个专门用作IO的处理器一样,可以独立cpu来使用总线,那么如果cpu要读取设备上的内容,cpu只需要对DMA编程,告诉它读取什么信息,读取完以后放到哪里等等这样的信息,然后cpu就可以去做其他事情了,剩余的IO任务由DMA代劳。这样做的好处是cpu是一个通用的执行单元,如果他来做IO那么效率不高,因为cpu需要上下文切换,代价比较高,而且应该让cpu去处理一些通用的任务,比如进程,而不是IO。相反,DMA确是一个专门干IO的单元,它执行所有的IO任务不需要上下文切换,效率更高。


上图是使用DMA的一次读操作,首先cpu对DMA编程,然后设备控制器把数据读入到自己的缓冲区,DMA指示设备控制器把缓冲数据写入合适的内存位置,中断。


IO软件:

几种IO机制:

(1)轮询法:cpu需要IO操作时,一直检测IO的控制寄存器直到其为可用时执行IO任务,这种方式,等待浪费了太多时间。

(2)中断IO:为了改善轮询法,当设备繁忙时cpu可以做其他任务,一旦设备可用,通过中断让cpu执行之前被挂起的IO。

(3)DMA:需要有DMA硬件的支持,cpu执行一次IO,把任务交给DMA,DMA完成以后再中断。相比较单纯的中断,DMA方式减少了中断的次数,其实中断也是很耗费cpu的。


设备的驱动程序:设备控制器只是硬件设备,cpu要通过设备的驱动程序来控制设备,整体的构架如图:


原创粉丝点击