很多初學者對IO的各種形式的操作(如題)都有一個誤區,彷彿總喜歡在其中分出個好壞,這其實是基礎知識不充足的表現,至少對高併發和網路程式設計不熟悉,所以我先建議至少在熟悉了NIO後,再去了解這四個的差別。更不要複製貼上別人的文章,這個東西其實需要有一點自己的想法。
在本文中我將把自己理解的這幾種io方式以最樸素的語言展現給大家,以及他們的優缺點和使用場景。
更需要清楚的一點:都是為了更大的壓榨CPU的利用價值。
不清楚NIO的可以學習我的文集:https://www.jianshu.com/nb/21635138
1. BIO:
BIO其實就是兩個程式(C/S)在一個執行緒裡進行的通訊形式,Client和Server端各啟一個程式來保持通訊,當呼叫的對方程式沒有資源的時候,自己進入等待狀態,但一直會監聽呼叫該程式的狀態,直到可以取到資源。
缺點:
一個連線佔用一個執行緒資源,並且執行緒資源得不到充分利用。執行緒開銷大、利用率也不高。
優點:
較於其它IO方式來說,確實沒啥優點…程式碼複雜度簡潔?開發週期短?
適用場景
連線數少、多資源(多IO操作)的長連線。
原因:執行緒的建立和銷燬對系統資源的浪費也很大,所以儘可能少的去折騰執行緒,因為一直主動的監聽對方程式,所以其實CPU的利用率也不低,所以源源不斷的資料能更加充分的使資源得到利用。當然,也可以用執行緒池來優化執行緒開銷的問題。
2. NIO
NIO和BIO有一個很大的不同,是把關注點放在每個請求任務(事件)上,Client傳送一個請求,會被Server端放入到多路複用上(事件池),事件池來輪詢這些請求事件,發現有IO請求,才會啟動一個執行緒去處理。
其實就是selector模型的工作流程(NIO知識)。
我的理解:NIO啟用了少量的執行緒(也許是單個執行緒)去對事件池做監控,對比BIO來說會節省很多cpu的資源,BIO是每個連線建立一個執行緒,並且監控工作也是該執行緒完成,NIO將監控工作歸為很少的執行緒去處理,當然這個執行緒不會再用於通訊,保證了每個執行緒的利用率,自然提升了高併發效能。
優點:
併發性高
缺點:
不適合重操作,NIO如果用於重操作,效能不如BIO,術業有專攻嘛,道理自己應該能想通。
適用場景:
適用於輕量級資料傳輸,比如聊天系統什麼的。
3. AIO
如大家所想,無止境的監控別的程式資源難免會造成浪費,所以回撥概念很重要,用過Future類的都清楚什麼是非同步非阻塞IO,通俗的講:每個程式幹自己的事情,如果A程式發現B程式想從我這裡獲取資源,那A程式在使用玩這部分資源後主動通知B,可以來我這取了,這就不用事件池、也不用耗費資源去做監控。
優點:
併發性高、CPU利用率高、執行緒利用率高
缺點:
不適合輕量級資料傳輸,因為程式之間頻繁的通訊在追錯、管理和資源消耗上不是很可觀。
適用場景:
對併發有需求的重量級資料傳輸。
總結
俗話講:沒有最好的,只有最合適的,每種IO都有自己擅長的領域,事前做好需求分析,耗費合適的人力資源去解決問題,才是真正的目的。