非阻塞IO、NIO為什么會快,我們為什么需要多線程


NIO
提到這個詞,很多人會條件反射的說出這樣的話:
“非阻塞IO,速度快!”。

但是為什么非阻塞IO,就會比阻塞式IO速度快呢?

下面用一個普遍的例子形容一下阻塞io與非阻塞io的工作方式
有一個讀取數據的任務A。
阻塞io工作方式:
1、嘗試讀取數據
2、如果數據沒有准備完成(在web等工作環境下,經常出現此情況),重復步驟1
3、直到讀取數據完成后,返回。

非阻塞io工作方式:
1、嘗試讀取數據
2、如果數據沒有准備完成,返回失敗。如果數據准備完畢,讀取后返回。

根據兩種工作方式,稍加思考大家都會明白他們的優劣,而不是簡單的說出那句條件反射的話。。。

下面分析一下:
阻塞io的工作方式簡單明了,符合常理,非常容易理解和應用。
帶來的缺點就是等待時間不確定,當然可以通過限制超時時間來控制最長等待時間。
我們平時系統的大多數實現都是采用此工作方式,比如http請求、數據庫操作等。

非阻塞io的工作方式,也很簡單,但是應用起來可能就稍微復雜。
比如我們想要處理一個web請求。
最開始時socket處於ACCEPT狀態(此時我們開始相應此請求)
然后我們試圖讀取web請求的內容(此時socket處於READ狀態,read狀態是一個持續的io過程)
如果socket中數據並未准備好(即內容並沒有從網絡上接受完畢),會直接返回讀取失敗
這時。。我們似乎就傻了,怎么辦?沒有數據就直接返回了。。。汗一個!
冷靜過后,我們如果還想繼續這份工作的話,就不能繼續流汗,必須做點什么來搞定這次任務
最簡單的方法就是在while(true){}中無線循環的來調用上述流程。

非阻塞io在實際運用時,不可能我們寫一個簡單的無限循環去等待一個io。
下面說一下java的nio包里的Selector的運作方式:
Selector就是一個socket選擇器,
它不停地查看所有與他綁定的socket是否准備完成,哪一個io准備完成,它就會處理對應的channel
上面關於Selector的解釋只是最通俗簡單的說法。

MINA
提到這個詞,也都會說:
“mina用了nio,速度快!”

其實套用以上理論,我就可以知道,非阻塞IO本身並不會比阻塞式IO快,只是因為在高並發訪問時,
非阻塞IO能夠一定程度上減少服務器瞬間的並發線程數,從而提高CPU執行效率。

基於以上分析,我們為什么需要多線程:
多線程本身並不能提高效率,因為他反而會在一定程度上降低CPU運算效率(特別是在線程數遠遠大於CPU核心數時),
多線程的好處在於異步,避免一個線程在等待其他資源時,cpu空閑
非阻塞IO本身也不會提高速度,只是他在一定程度上能夠降低並發數,從而提高CPU效率

以上只是我作為一個菜鳥,根據自己的理解,說了一下非阻塞IO和阻塞式IO、NIO和傳統IO的區別,和我對多線程的理解。
如果有錯誤,勞煩各位能夠給予指正和批評。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM