回顧一下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_jsrasynchronous 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。