由 农夫一号 发表于 十月 21st, 2011
IO这个词出现太多了太多了,这里整理一下思路。
计算机由控制单元,运算单元,存储单元,输入设备输出设备组成。其中IO指的就是输入输出。
关于IO又有接口,设备,操作的概念: 参见http://book.51cto.com/art/200704/45417.htm
IO接口是实现外部设备与主机之间的连接和信息交换的设备,也可称I/O适配器(Adapter)或适配卡。目前有:
① 总线系统
② 直接内存访问(DMA)
③ 通道
④ SCSI(Small Computer System Interface)
⑤ 并行口
⑥ RS-232C接口
⑦ USB(Universal Serial Bus,通用串行总线)接口
⑧ IEEE 1394接口
(1)程序查询方式
这种方式下,CPU通过I/O指令询问指定外设当前的状态,如果外设准备就绪,则进行数据的输入或输出,否则CPU等待,循环查询。
这种方式的优点是结构简单,只需要少量的硬件电路即可,缺点是由于CPU的速度远远高于外设,因此通常处于等待状态,工作效率很低
(2)中断处理方式
在这种方式下,CPU不再被动等待,而是可以执行其他程序,一旦外设为数据交换准备就绪,可以向CPU提出服务请求,CPU如果响应该请求,便暂时停止当前程序的执行,转去执行与该请求对应的服务程序,完成后,再继续执行原来被中断的程序。
中 断处理方式的优点是显而易见的,它不但为CPU省去了查询外设状态和等待外设就绪所花费的时间,提高了CPU的工作效率,还满足了外设的实时要求。但需要 为每个I/O设备分配一个中断请求号和相应的中断服务程序,此外还需要一个中断控制器(I/O接口芯片)管理I/O设备提出的中断请求,例如设置中断屏 蔽、中断请求优先级等。
此外,中断处理方式的缺点是每传送一个字符都要进行中断,启动中断控制器,还要保留和恢复现场以便能继续原程序的执行,花费的工作量很大,这样如果需要大量数据交换,系统的性能会很低。
(3)DMA(直接存储器存取)传送方式
DMA最明显的一个特点是它不是用软件而是采用一个专门的控制器来控制内存与外设之间的数据交流,无须CPU介入,大大提高CPU的工作效率。
在进行DMA数据传送之前,DMA控制器会向CPU申请总线控制 权,CPU如果允许,则将控制权交出,因此,在数据交换时,总线控制权由DMA控制器掌握,在传输结束后,DMA控制器将总线控制权交还给CPU。
(4) 通道方式
(5) 外围处理机(输入输出处理机)方式
有专门的处理机负责IO,一般用于大型系统
键盘,鼠标,硬盘,打印机,扫描仪,网络设备等……
说实话,我还是没搞清楚!有时候把接口当成设备,有时又要把它当成控制方式,下面显然是控制方式:
常见I/O接口方式的分类方式有:
①按数据传送格式分类:串行接口和并行接口
②按时序控制方式分类:同步接口和异步接口
③按传送控制方式分类:直接程序传送接口,中断接口,DMA接口.
还有网络IO这个说法,对于web方面的来说,性能与网络IO操作有很大关系,参见http://blog.csdn.net/historyasamirror/article/details/5778378
对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。
当一个read操作发生时,它会经历两个阶段:
1 等待数据准备 (Waiting for the data to be ready)
2 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)记住这两点很重要,因为这些IO Model的区别就是在两个阶段上各有不同的情况。
阻塞IO:特点就是在IO执行的两个阶段都被block了,调用返回时数据一定是准备好了的。
非阻塞IO:调用马上返回,但是数据可能还没准备好,需要不断的主动询问kernel数据好了没有
多路IO(IO multiplexing):先选择,后获取。选择操作会阻塞知道其中一个有数据。
异步IO:调用马上返回,有数据后会发信号。(和ajax取数据有点像哈)
此文将多路分为同步IO,
这篇文章有另一种分法:http://blog.chinaunix.net/space.php?uid=20357359&do=blog&id=1963658
将多路归类为异步阻塞,各有各道理,知道原理就好。不钻牛角尖!
显然非阻塞异步IO性能应该是最好的,Nodejs中的事件驱动非阻塞IO就是AIO。