unix的5种i/o模型

来源:互联网 发布:2015淘宝天猫客服手册 编辑:程序博客网 时间:2024/05/03 22:56

1、阻塞I/O
2、非阻塞I/O
3、I/O复用(select、poll、linux 2.6种改进的epoll)
4、信号驱动IO(SIGIO)
5、异步I/O(POSIX的aio_系列函数)
同步I/O和异步IO
POSIX把这两个术语定义如下:

同步I/O操作导致请求进程阻塞,直至操作完成
异步I/O操作不导致请求阻塞。

根据上述定义,前四种I/O模型都是同步I/O,第5种才是异步I/O。

select不允许多于一个的线程在同一个描述符集上等待。这使得反应式模型不适用于高性能应用,因为它没有有效地利用硬件的并行性。
异步I/O通常能够提高更好的性能,windows的iocp通过内核线程调度,也能提供很好的并发性能,但不是真正的异步。
Java nio和多路复用

java1.4 nio提供的select,这是一种多路复用I/O(multiplexed non-blockingI/O)模型,底层是使用select或者poll。I/O复用就是,阻塞在select或者poll系统调用的某一个之上,而不是阻塞在真正的I/O系统调用之上。JDK 5.0 update 9和JDK 6.0在linux下支持使用epoll,可以提高并发idleconnection的性能(http://blogs.sun.com/alanb/entry/epoll)。

以前看到有人猜测Windows下nio使用了IOCP,那应该是错的,毕竟IOCP不是多路复用I/O模型。从JavaOne 2006的幻灯片来看,aio才会使用IOCP来实现的。
Java aio和JSR 203

2003年,就有了JSR 203(http://jcp.org/en/jsr/detail?id=203),但是一直没有实现。

终于,JSR 203的spec lead说,将会在Java SE 7.0中完成JSR 203,Java SE 6.0已经是RC,很快正式版就会发布,然后就是Java SE 7.0,估计我们不需要等太久了。
http://blogs.sun.com/alanb/entry/what_is_happening_with_jsr

asynchronousI/O对于Java的影响,将不会低于当年JDK 1.4 nio引入multiplexed non-blockingI/O的影响,很多的Java应用都会重写。如同Linux2.6支持AIO,DB2、Oracle数据库都会发布新版本,说支持使用AIO,性能提高多少多少云云(主要是AIO的文件操作部分)。

对asynchronous I/O的支持,Java程序就能够支撑大并发网络应用了,在IO模型方面,对于C/C++等语言不再存在“C/C++能做,但是Java不能做的事情”。

这个是Java One 2006上的幻灯片。
http://blogs.sun.com/roller/resources/alanb/bof0895.pdf
提到了:
需要新的channel types支持异步I/O模型
使用Native机制,例如Windows IO Completion ports。

[附]
JDK 6.0 nio支持epoll,对并发idle connection会有大幅度的性能提升,这就是很多网络服务器应用程序需要的。

Oneof the updates in build 59 of Mustang (JavaTM SE 6) is that the New I/OSelector implementation will use the epoll event notification facilitywhen running on the Linux 2.6 kernel.

JDK 5.0 update 9也支持:
Theepoll SelectorProvider will be included in 5.0 update 9. To enable itrequires setting the system propertyjava.nio.channels.spi.SelectorProvider to the valuesun.nio.ch.EPollSelectorProvider.

5种IO模型:
阻塞IO
非阻塞IO
多路复用
信号驱动IO
异步IO

原创粉丝点击