BIO AIO NIO(转)

同步非阻塞IO (NIO)

NIO是基于事件驱动思想的,实现上通常采用Reactor(http://en.wikipedia.org/wiki/Reactor_pattern) 模式,从程序角度而言,当发起IO的读或写操作时,是非阻塞的;当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理, 应用再将流读取到缓冲区或写入操作系统。对于网络IO而言,主要有连接建立、流读取及流写入三种事件、linux2.6以后的版本使用epoll(http://lse.sourceforge.net/epoll/index.html)方式实现NIO。

select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。它的流程如图:

当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个 socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

这个图和blocking IO的图其实并没有太大的不同,事实上,还更差一些。因为这里需要使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。但是,用select的优势在于它可以同时处理多个connection。(多说一句。所以,如果处理的连接数不是很高的话,使用 select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。)

在IOmultiplexing Model中,实际中,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户的process其实是一直被 block的。只不过process是被select这个函数block,而不是被socket IO给block。

AIO,异步IO方式

AIO为异步IO方式,同样基于事件驱动思想,实现上通常采用Proactor模式(http://en.wikipedia.org/wiki/Proactor_pattern)

从程序的角度而言,与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均 为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方 法传递的流写入完毕时,操作系统主动通知应用程序。较之NIO而言,AIO一方面简化了程序出的编写,流的读取和写入都由操作系统来代替完成;另一方面省 去了NIO中程序要遍历事件通知队列(selector)的代价。Windows基于IOCP(http://en.wikipedia.org/wiki/Input/output_completion_port)实现了AIO,Linux目前只有基于epoll实现的AIO。

原址(http://www.cnblogs.com/focusj/articles/2404634.html)

      (http://furturestrategist.iteye.com/blog/1463369)

关键字部分

AIO

对于读操作而言,

当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;

对于写操作而言,当操作系统将write方 法传递的流写入完毕时,操作系统主动通知应用程序。

较之NIO而言,AIO一方面简化了程序出的编写,流的读取和写入都由操作系统来代替完成;另一方面省 去了NIO中程序要遍历事件通知队列(selector)的代价


NIO

当发起IO的读或写操作时,是非阻塞的;

当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,

应用再将流读取到缓冲区或写入操作系统。对于网络IO而言,主要有连接建立、流读取及流写入三种事件


IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO


BIO是一个连接一个线程。

NIO是一个请求一个线程。

AIO是一个有效请求一个线程。


AIO 是先读或写到系统内存缓冲区后,在通知应用程序。

NIO 是遍历要读取的应用程序,在用应用程序本身来读或写到系统内存缓冲区,

猜你喜欢

转载自javaeedevelop.iteye.com/blog/1722372