BIO和NIO的區別

2021-10-06 12:36:19 字數 1820 閱讀 1193

bio(同步阻塞):每乙個io請求都會有乙個執行緒去處理,如果資料沒有準備就緒,執行緒會一直等待。直到資料讀取完畢執行緒才會釋放,在此期間,程序不回去做任何其他任務,這種模式會浪費一定的執行緒資源。

nio(同步非阻塞):nio的優點在於首先基於快取讀寫檔案,能夠批量操作,然後用channel雙向讀寫資料,減少每次開啟斷開流的資源消耗。引入selecore的概念,用乙個執行緒管理多個通道,大大減少執行緒開銷。

多路復用技術:如果每乙個io請求都需要乙個程序去處理,如果沒有控制客戶端的數量,那麼有多少io請求就需要多少程序去處理,也就是所謂的多程序併發處理。問題在於這個模式消耗程序資源。如果在乙個程序裡面開闢多個通道,然後程序回去輪詢準備就緒的通道,被選中的通道去進行讀寫操作,這就是多路復用技術。而nio的selector是多路復用的一種實現。在作業系統設計中還有多種其他實現,select,poll,epoll。

channel:區別於流,channel是乙個通道的概念。流的讀寫一般是單向的,而channel是雙向   的。channel可以非同步讀寫資料。channel讀寫的載體一定是buffer,不能直接讀取流資料。

filechannel:處理檔案的讀取

datagramchannel:udp讀寫網路資料

socketchannel:tcp讀取網路資料

serversocketchannel:用於服務端,監聽tcp連線,為新來的建立 socketchannel

selector:selector 主要思想就是上文提到的多道復用技術,這種設計有幾個好處。一是乙個程序可以管理多個通道,輪詢選擇準備就緒的通道進行處理,這可以避免執行緒的阻塞等待,更好的利用資源。二是能減少多個執行緒情況下執行緒間上下文切換的開銷。

建立selector:selector.open();

向selecter註冊channel:channer.register(selector, selectionkey.op_read),注意這裡需要將 channel設定成非阻塞模式,channel.configureblocking(false)。

獲取interest感興趣的所有集合:selectionkey.interestops()。

獲取ready預操作集合:selectionkey.readyops()。

獲取channel:selectionkey.channel()。

獲取selector:selectionkey.selector()。

關閉selecter:close()。

喚醒selector:wakeup()。

選擇通道select():返回感興趣的事件就緒的通道。

buffer: 為了解決執行緒在一次io請求中需要一直等待資料流,從而有執行緒阻塞的問題。buffer的設計是當流到達後寫入快取區,執行緒在此期間不必要阻塞,等到讀寫操作就緒的時候執行緒再從快取區批量讀取資料。

buffer原理:buffer 本質上是乙個可供讀寫資料的記憶體,通過緩衝批量處理流來達到高效的目的。

capacity:記憶體塊的容量,記憶體塊緩衝資料的多少要由capacity來決定。一旦容量滿了,需要清空容量才能再次寫入資料。

buffer的方法

buffer分配:bytebuffer.allocate()。

buffer寫資料:channel.read(buf)從channel寫到buffer,buf.put(1)直接寫到buffer。

buffer讀資料:channel.write(buf)從buffer讀資料到buffer,buf.get()從buffer裡面讀取資料。

切換到讀模式:flip(),將position設定為0,並將limit設定為position。開始讀取資料。

清除資料:clear(),position設定回0,limit設定成capacity的值。

我認識的BIO和NIO

簡介 bio 同步阻塞式io。實現模式為1個連線對應乙個執行緒。即每有1個新的請求時,就需要建立乙個新的執行緒去處理,並且執行緒永遠不會釋放。如果這個連線不去做任何事情的話,會造成資源浪費。nio 同步非阻塞式io。實現模式為1個請求對應乙個執行緒。即有乙個新的請求時,會註冊到作業系統tcp。而服務...

面試官 說一下NIO和BIO的區別

bio,面向流,只能讀或者只能寫,阻塞io nio,面向緩衝區,可以同時進行讀寫,非阻塞io 整個bio的繼承關係如上圖,每種流只能寫或者讀,整個bio流的設計用了裝飾者模式,如果你不清楚的話,可以看 面試官 說一下裝飾者模式的作用,以及哪些地方用到了裝飾者模式吧 本文不再介紹 nio涉及到的api...

Tomcat的BIO和NIO一些問題

最近一些朋友通過書籍找到我,問了一些關於tomcat中bio和nio的問題,這裡列一下方便需要的朋友。後續也將前面有朋友問的問題整理下。只把 tomcat 的 bio 模式改為 nio 模式,是否能提高伺服器的吞吐量?發現在配置一樣的情況下,兩種模式壓出來的吞吐量差不多。要看你系統是不是整個都非同步...