官术网_书友最值得收藏!

  • Netty權威指南
  • 李林鋒
  • 8字
  • 2024-01-05 16:20:11

2.5 4種I/O的對比

2.5.1 概念澄清

為了防止由于對一些技術概念和術語的理解或者叫法不一致而引起歧義,本小節特意對本書中的專業術語或者技術用語做下聲明:如果它們與其他一些技術書籍的稱呼不一致,請以本小節的解釋為準。

1.異步非阻塞I/O

很多人喜歡將JDK1.4提供的NIO框架稱為異步非阻塞I/O,但是,如果嚴格按照UNIX網絡編程模型和JDK的實現進行區分,實際上它只能被稱為非阻塞I/O,不能叫異步非阻塞I/O。在早期的JDK1.4和1.5 update10版本之前,JDK的Selector基于select/poll模型實現,它是基于I/O復用技術的非阻塞I/O,不是異步I/O。在JDK1.5 update10和Linux core2.6以上版本,Sun優化了Selctor的實現,它在底層使用epoll替換了select/poll,上層的API并沒有變化,可以認為是JDK NIO的一次性能優化,但是它仍舊沒有改變I/O的模型。相關優化的官方說明如圖2-17所示。

由JDK1.7提供的NIO2.0,新增了異步的套接字通道,它是真正的異步I/O,在異步I/O操作的時候可以傳遞信號變量,當操作完成之后會回調相關的方法,異步I/O也被稱為AIO。

NIO類庫支持非阻塞讀和寫操作,相比于之前的同步阻塞讀和寫,它是異步的,因此很多人習慣于稱NIO為異步非阻塞I/O,包括很多介紹NIO編程的書籍也沿用了這個說法。為了符合大家的習慣,本書也會將NIO稱為異步非阻塞I/O或者非阻塞I/O,請大家理解,不要過分糾結在一些技術術語的咬文嚼字上。

圖2-17 JDK1.5_update10支持epoll

2.多路復用器Selector

幾乎所有的中文技術書籍都將Selector翻譯為選擇器,但是實際上我認為這樣的翻譯并不恰當,選擇器僅僅是字面上的意思,體現不出Selector的功能和特點。

在前面的章節我們介紹過Java NIO的實現關鍵是多路復用I/O技術,多路復用的核心就是通過Selector來輪詢注冊在其上的Channel,當發現某個或者多個Channel處于就緒狀態后,從阻塞狀態返回就緒的Channel的選擇鍵集合,進行I/O操作。由于多路復用器是NIO實現非阻塞I/O的關鍵,它又是主要通過Selector實現的,所以本書將Selector翻譯為多路復用器,與其他技術書籍所說的選擇器是同一個東西,請大家了解。

3.偽異步I/O

偽異步I/O的概念完全來源于實踐。在JDK NIO編程沒有流行之前,為了解決Tomcat通信線程同步I/O導致業務線程被掛住的問題,大家想到了一個辦法:在通信線程和業務線程之間做個緩沖區,這個緩沖區用于隔離I/O線程和業務線程間的直接訪問,這樣業務線程就不會被I/O線程阻塞。而對于后端的業務側來說,將消息或者Task放到線程池后就返回了,它不再直接訪問I/O線程或者進行I/O讀寫,這樣也就不會被同步阻塞。類似的設計還包括前端啟動一組線程,將接收的客戶端封裝成Task,放到后端的線程池執行,用于解決一連接一線程問題。像這樣通過線程池做緩沖區的做法,本書中習慣于稱它為偽異步I/O,而官方并沒有偽異步I/O這種說法,請大家注意。

下面的小節我們對幾種常見的I/O進行對比,以便大家能夠理解幾種I/O的差異。

主站蜘蛛池模板: 鄱阳县| 文化| 马公市| 农安县| 洱源县| 岳西县| 剑川县| 闻喜县| 报价| 宝应县| 丹巴县| 新疆| 久治县| 上虞市| 舒城县| 临猗县| 含山县| 凉山| 天水市| 肃南| 呼和浩特市| 大邑县| 黔西| 利辛县| 泾源县| 稻城县| 广宗县| 江都市| 双桥区| 额济纳旗| 渑池县| 丽江市| 家居| 五常市| 汉寿县| 米易县| 新乡县| 凤凰县| 错那县| 台东市| 苗栗市|