回顧一下Unix的5種I/O模型


          1、阻塞I/O
          2、非阻塞I/O
          3、I/O復(fù)用(select、poll、linux 2.6種改進(jìn)的epoll)
          4、信號(hào)驅(qū)動(dòng)IO(SIGIO)
          5、異步I/O(POSIX的aio_系列函數(shù))


          同步I/O和異步IO


          POSIX把這兩個(gè)術(shù)語(yǔ)定義如下:
          同步I/O操作導(dǎo)致請(qǐng)求進(jìn)程阻塞,直至操作完成
          異步I/O操作不導(dǎo)致請(qǐng)求阻塞。

          根據(jù)上述定義,前四種I/O模型都是同步I/O,第5種才是異步I/O。

          select不允許多于一個(gè)的線程在同一個(gè)描述符集上等待。這使得反應(yīng)式模型不適用于高性能應(yīng)用,因?yàn)樗鼪]有有效地利用硬件的并行性。
          異步I/O通常能夠提高更好的性能,windows的iocp通過(guò)內(nèi)核線程調(diào)度,也能提供很好的并發(fā)性能,但不是真正的異步。


          Java nio和多路復(fù)用


          java 1.4 nio提供的select,這是一種多路復(fù)用I/O(multiplexed non-blocking I/O)模型,底層是使用select或者poll。I/O復(fù)用就是,阻塞在select或者poll系統(tǒng)調(diào)用的某一個(gè)之上,而不是阻塞在真正的I/O系統(tǒng)調(diào)用之上。JDK 5.0 update 9和JDK 6.0在linux下支持使用epoll,可以提高并發(fā)idle connection的性能(http://blogs.sun.com/alanb/entry/epoll)。

          以前看到有人猜測(cè)Windows下nio使用了IOCP,那應(yīng)該是錯(cuò)的,畢竟IOCP不是多路復(fù)用I/O模型。從JavaOne 2006的幻燈片來(lái)看,aio才會(huì)使用IOCP來(lái)實(shí)現(xiàn)的。


          Java aio和JSR 203


          2003年,就有了JSR 203(http://jcp.org/en/jsr/detail?id=203),但是一直沒有實(shí)現(xiàn)。

          終于,JSR 203的spec lead說(shuō),將會(huì)在Java SE 7.0中完成JSR 203,Java SE 6.0已經(jīng)是RC,很快正式版就會(huì)發(fā)布,然后就是Java SE 7.0,估計(jì)我們不需要等太久了。
          http://blogs.sun.com/alanb/entry/what_is_happening_with_jsr


          asynchronous I/O對(duì)于Java的影響,將不會(huì)低于當(dāng)年JDK 1.4 nio引入multiplexed non-blocking I/O的影響,很多的Java應(yīng)用都會(huì)重寫。如同Linux 2.6支持AIO,DB2、Oracle數(shù)據(jù)庫(kù)都會(huì)發(fā)布新版本,說(shuō)支持使用AIO,性能提高多少多少云云(主要是AIO的文件操作部分)。

          對(duì)asynchronous I/O的支持,Java程序就能夠支撐大并發(fā)網(wǎng)絡(luò)應(yīng)用了,在IO模型方面,對(duì)于C/C++等語(yǔ)言不再存在“C/C++能做,但是Java不能做的事情”。

          這個(gè)是Java One 2006上的幻燈片。
          http://blogs.sun.com/roller/resources/alanb/bof0895.pdf
          提到了:
          需要新的channel types支持異步I/O模型
          使用Native機(jī)制,例如Windows IO Completion ports。
          posted on 2006-11-21 00:34 溫少的日志 閱讀(6890) 評(píng)論(2)  編輯  收藏
          Comments

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
           
          主站蜘蛛池模板: 天峨县| 栾城县| 广昌县| 长岭县| 封丘县| 河源市| 若尔盖县| 太白县| 石林| 广宁县| 塘沽区| 兰州市| 抚州市| 哈密市| 湖州市| 修文县| 阿拉善左旗| 秦皇岛市| 垫江县| 彰化县| 土默特右旗| 曲阳县| 阿拉善左旗| 九台市| 陇西县| 辉南县| 英吉沙县| 瓦房店市| 绿春县| 天柱县| 海南省| 北海市| 横峰县| 渑池县| 鹿邑县| 牟定县| 绍兴市| 望城县| 通化县| 永安市| 马龙县|