异步IO理解

缓存I/O又被称作标准I/O,大多数文件系统默认的I/O操作都是缓存I/O。在linux的缓存I/O机制中,操作系统会将I/O的数据缓存在文件系统的页缓存(page cache)中,也就是说,数据会被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。

缓存I/O有一下有点:

1.在一定程度上分离了应用程序空间和实际物理设备

2.可以减少读盘的次数,从而提高性能

当应用程序尝试读取某块数据时,如果这块数据已经存放在了页缓存中,那它就能立即返回给应用程序,而不用物理读盘操作。当然如果没有,那么就需先将数据从磁盘读到页缓存中。对于写机制,程序也会将数据先写到页缓存中,数据是否立即写到磁盘上取决于应用程序所采用的写操作机制:如果采用同步写机制(synchronous writes),那么数据会立即被写回到磁盘上,应用程序一直等到写完为止;如果采用延迟写机制(deferred writes),那应用程序只要把数据写到页缓存中就能做别的事了,延迟写机制下操作系统会定期将页缓存数据刷到磁盘上。与异步写机制(asynchronous writes)不同的是,延迟写在数据写到磁盘上后不会通知应用程序,而异步写会。所以延迟写本身是存在数据丢失的风险

在缓存I/O中,数据在传输过程中需要在应用程序地址空间和也缓存之间进行多次数据拷贝动作,他们带来的CPU和内存开销非常大

来自:https://www.ibm.com/developerworks/cn/linux/l-cn-directio/

缓冲与缓冲的处理方式是所有I/O操作的基础。术语“输入、输出” 只对数据移入和移出缓存有意义。通常,进程执行操作系统的I/O请求包括数据从缓冲区排出(写操作)和数据填充缓冲区(读操作)。这就是I/O的整体概念。在操作系统内部执行这些传输操作的机制可以非常复杂,但从概念上讲非常简单。

 

 

上图显示一个简化的逻辑图,表示块数据如何从外部源,例如一个磁盘,移动到进程的存储区域(例如RAM)。首先,进程要求缓冲通过read()系统调用填满。这个系统调用导致内核向磁盘控制硬件发出一条命令要从磁盘获取数据。磁盘控制器通过DMA直接将数据写入内核的内存缓冲区,不需要主CPU进一步帮助。当请求read()时,一旦磁盘控制器完成了缓存的填写,内核从内核空间的临时缓存拷贝数据到进程指定缓存中。

有一点需要注意,在内核试图缓存及预取数据时,内核空间中进程请求的数据可能已经就绪了。如果这样,进程请求的数据会被拷贝出来。如果数据不可用,则进程被挂起。内核将把数据读入内存。(这段没理解)

来自:http://www.importnew.com/14111.html

I/O中flush的作用

FileOutPutStream继承outputStream,并不提供flush()方法的重写,所以无论内容多少wirte都会将二进制流直接传递给底层操作系统的I/O,而像Buffered系列的I/O都是先放入自身实现缓存中,等缓存区有足够数据时,就整体写入设备。默认缓存区大小是8K

来自:http://blog.csdn.net/aa8568849/article/details/52974619

同步阻塞I/O

最常用的一个模型就是同步阻塞I/O。在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞,知道系统调用完成为止(数据传输完成或发生错误)。

比如下图,在调用read系统调用时,应用程序会阻塞并对内核惊醒上下文切换。然后触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据移动到用户空间的缓冲区中。然后应用程序就会接触阻塞。

 

同步非阻塞I/O

同步阻塞I/O的一种效率稍低的变种是同步非阻塞I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着I/O操作不会立即完成,read操作可能会返回一个错误代码
 

非阻塞的实现方式是I/O命令可能不会立即满足,需要应用程序调用许多次来等待操作完成。

异步阻塞I/O

另外一个阻塞解决方案是带有阻塞通知的非阻塞I/O。在这种模型中,配置的是非阻塞I/O,然后使用阻塞select系统调用来确定一个I/O描述符何时有操作。select可以为多个描述符提供通知。对于每个描述符来说,我们可以请求这个描述符 可以写数据、有读数据可用 以及 是否发生错误的通知。select调用的主要问题是它的效率不是非常高


异步非阻塞I/O(AIO)

最后,异步非阻塞I/O模型是一种处理与I/O重叠进行的模型。读请求会立即返回,说明read请求已经成功发起了。在后台完成度操作时,应用程序会执行其他处理操作。当read的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次I/O处理过程

 

 来自:https://www.ibm.com/developerworks/cn/linux/l-async/

猜你喜欢

转载自xiaoxiaoher.iteye.com/blog/2367681