现在的位置: 首页 > 综合 > 正文

关于I/O的一点总结

2019年06月14日 ⁄ 综合 ⁄ 共 1503字 ⁄ 字号 评论关闭

一般常见的I/O有3种:编程式(或者被称为查询式) 中断式 周期窃取式

1编程式I/O

它又被称谓查询式,其原因是在cpu处理这类中断的时候,cpu直接将权限移交给相应模块,中断其他任务的执行,并且没相隔一定固定的时间,cpu查询一下I/O模块是否有事务需要处理。在这种方式下,I/O操作占用的cpu百分之百的时间。注意这种中断驱动的方式有一个限制,那就是cpu处理中断的时间加上一次查询I/O模块状态的时间必须比I/O模块形成一次事务的时间要少。不然的话当cpu处理完一个中断事务,在进行查询的时候,之前本应该被处理的事务已经被后来的I/O模块获得数据覆盖,导致数据的遗失。

这类中断驱动模式所花的总时间是全部数据从外部设备传输进I/O模块的时间加上一次cpu处理中断事务的时间。(因外cpu处理中断事务是和I/O模块获得数据同时进行的,中断处理的时间一定比I/O模块形成一次中断事务的时间少,所以除了最后一次的cpu处理中断事务的时间之外,其他cpu处理中断驱动的时间都不需要进行计算)

2中断驱动式I/O

这种方法和查询式有部分相同,但是在这种方式中cpu没有直接将权限移交给I/O模块。这种机制的执行方式为:cpu和I/O模块独立运行,I/O模块处有一个缓存,当外部设备的数据传输似的I/O模块处的缓存被占满时,I/O模块向CPU发出一个中断请求,CPU在适当的条件下允许中断,将权限移交给I/O模块,cpu对缓存数据进行相应操作,中断处理结束后,I/O模块将权限移交给CPU,cpu继续之前的操作,I/O模块继续相应的传输。

这方法的使用条件是,在满足的外部设备最大数据传输速率的情况下,单位时间内中断操作不能占据CPU超过百分之百的时间,如果超过百分之百,那个不可能实现,I/O模块中断数据还是有可能丢失。

这种方法所用的时间是数据传输的时间+1次处理中断的时间。因为,cpu处理中断和I/O模块准备下一次缓存的事务是同时进行的,所以和编程式的理由相同,只有最后一次中断处理的时间需要考虑。

这种方法占用cpu的总时间是 中断次数*单位中断处理的时间/该方法所用的总时间。

3周期窃取式I/O

这类方法是采用的DMA(Direct Memory
Access)的结构,外部设备直接不断传输数据到I/O模块中,I/O模块将数据传输到DMA中,DMA在CPU对主存传输的空闲时间将数据传输到主存之中,数据的处理都是在DMA中的进行的,注意,DMA的初始化和数据传输结束后处理的时间是需要占用cpu
的时钟周期的。还有一点是,DMA的周期窃取并不是完全的窃取,DMA对主存的操作可能与cpu对主存的操作存在冲突,此时cpu会被中断操作(DMA对主存的优先级高于CPU),这一方面的对于cpu时间的占用在我们考虑这类问题的时候不能忽视。

这类方法所用的总时间是 数据传输的时间+1次I/O模块传输到DMA的时间+DMA所用的时间(DMA初始化和处理)

这类方法占用CPU的时间计算为   
DMA所用的时间(初始化+处理)+DMA与cpu冲突的时间(可以用冲突概率 P*冲突可能发生的事件的个数i
表示)   /这类方法所花的总时间

 

最后补充下:使用DMA的结构不只有周期窃取这一种方式,还有2种方法。一种是将对主存的控制权直接从CPU中拿过来,在输入结束后再将控制权交还给CPU,这就相当于周期窃取式中冲突发生概率为100%。另外为共享主存的时钟周期,即在主存的时钟周期前半段执行cpu的操作,后半段执行DMA的操作,这种方法就相当于
周期窃取式中的冲突发生概率为0,并且这种方法的适用前提为主存的时钟周期要大于cpu时钟周期和DMA时钟周期之和。

抱歉!评论已关闭.