奇葛格的BLOG

红尘最可笑,我自乐逍遥

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  59 随笔 :: 23 文章 :: 11 评论 :: 0 Trackbacks
转自:http://www.blogjava.net/jobs/archive/2006/11/21/82409.html

回顾一下Unix的5种I/O模型

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和多路复用


java 1.4 nio提供的select,这是一种多路复用I/O(multiplexed non-blocking I/O)模型,底层是使用select或者poll。I/O复用就是,阻塞在select或者poll系统调用的某一个之上,而不是阻塞在真正的I/O系 统调用之上。JDK 5.0 update 9和JDK 6.0在linux下支持使用epoll,可以提高并发idle connection的性能(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


asynchronous I/O对于Java的影响,将不会低于当年JDK 1.4 nio引入multiplexed non-blocking I/O的影响,很多的Java应用都会重写。如同Linux 2.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会有大幅度的性能提升,这就是很多网络服务器应用程序需要的。

One of the updates in build 59 of Mustang (JavaTM SE 6) is that the New I/O Selector implementation will use the epoll event notification facility when running on the Linux 2.6 kernel.

JDK 5.0 update 9也支持:
The epoll SelectorProvider will be included in 5.0 update 9. To enable it requires setting the system property java.nio.channels.spi.SelectorProvider to the value sun.nio.ch.EPollSelectorProvider.

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

最好性能的还是异步IO,目前Java只能支持到多路复用一级,期待着以后Java 7.0/8.0支持异步IO,6.0是没有希望了。
posted on 2006-11-21 19:11 奇葛格 阅读(910) 评论(0)  编辑  收藏 所属分类: 技术新闻.乱评

只有注册用户登录后才能发表评论。


网站导航: