bio,面向流,只能讀或者只能寫,阻塞io
nio,面向緩衝區,可以同時進行讀寫,非阻塞io
整個bio的繼承關係如上圖,每種流只能寫或者讀,整個bio流的設計用了裝飾者模式,如果你不清楚的話,可以看《面試官:說一下裝飾者模式的作用,以及哪些地方用到了裝飾者模式吧》,本文不再介紹
nio涉及到的api主要為buffer channel selector。buffer可以用來儲存和讀取資料,channel是網路通道,selector主要用來監聽事件的發生。後續的內容會簡單介紹一下三者是如何協同工作的。
用例子類別一下
bio:排隊打飯
nio:點餐等待被叫
api的使用我就不演示了,分析一下他們背後的開發模式
類別開發模式
thread-per-connection這種開發模式應該很多人都比較清楚,見名知意,乙個請求建立乙個執行緒,支援不了高併發,當然你可以用執行緒池避免執行緒的重複建立
reactor的核心流程為
註冊感興趣的事件
掃瞄是否有感興趣的事件發生
事件發生後作出相應的處理
reactor模式的演進過程如下
單reactor單執行緒
執行流程
reactor物件通過select監控客戶端請求事件,收到事件後通過dispatch分發
如果是建立連線事件,則交給acceptor通過accept處理連線請求,然後建立乙個handler物件處理連線完成後的的後續業務處理
如果是讀寫事件,則呼叫對應的handler來處理請求。handler會完成 read->業務處理->send整個完整的業務流程
優點
模型簡單,整個過程都在乙個執行緒中完成
缺點
效能問題,只有乙個執行緒,無法發揮多核cpu的效能。並且當handler在處理請求時,無法處理連線請求,容易導致效能瓶頸
可靠性問題,執行緒意外終止或者死迴圈,系統不能接收和處理外部訊息,造成節點故障
單reactor多執行緒
執行流程
reactor物件通過select監控客戶端請求事件,收到事件後通過dispatch分發
如果是建立連線事件,則交給acceptor通過accept處理連線請求,然後建立乙個handler物件處理連線完成後的的後續業務處理
如果是讀寫事件,則呼叫對應的handler來處理請求
handler只負責讀取和響應事件,不做具體的業務處理,讀取到資料後,會分發給worker執行緒池中的某個執行緒處理業務,處理完畢後將結果返回給handler
handler收到響應後返回給client
優點
充分利用多核cpu的處理能力
缺點
reactor單執行緒執行,處理所有事件的監聽和響應,在高併發場景容易出現效能瓶頸
主從reactor多執行緒
reactor在高併發下容易出現瓶頸,所以將reactor分為2部分,mainreactor只處理連線事件,
subreactor只處理讀寫事件
如果是連線事件mainreactor直接交給acceptor來處理,如果是讀寫事件mainreactor交給subreactor來處理
當我們在寫netty程式時,會建立2個eventloopgroup,乙個是bossgroup,乙個是workergroup。bossgroup 就用來處理連線請求的,而 workergroup 是用來處理讀寫請求的
eventloop對應reactor模式中的reactor,eventloopgroup就是eventloop組成的集合
mainreactor有乙個,在單執行緒中執行。subreactor有多個,在多個執行緒中執行
現在我們常用的nio框架是netty,在netty中切換這三種模式就非常方便了,**如下
當然netty做了一定的改進。即單reactor多執行緒和主從reactor多執行緒中reactor執行緒可以是多個
// 單reactor單執行緒
eventloopgroup eventloopgroup =
newnioeventloopgroup(1
);serverbootstrap serverbootstrap =
newserverbootstrap()
;serverbootstrap.
group
(eventloopgroup)
;// 單reactor多執行緒
// eventloopgroup不指定執行緒數的話預設是cpu核數的2倍
eventloopgroup eventloopgroup =
newnioeventloopgroup()
;serverbootstrap serverbootstrap =
newserverbootstrap()
;serverbootstrap.
group
(eventloopgroup)
;// 主從reactor多執行緒
eventloopgroup bossgroup =
newnioeventloopgroup()
;eventloopgroup workergroup =
newnioeventloopgroup()
;serverbootstrap serverbootstrap =
newserverbootstrap()
;serverbootstrap.
group
(bossgroup, workergroup)
;
for迴圈優化 面試官 可以優化一下氣泡排序嘛?
十大排序演算法中,氣泡排序應該算得上是最簡單的一種排序方法了。之前只知道最簡單的兩個for迴圈做冒泡,其實在for迴圈的同時,還可以通過一些小細節來實現對演算法的優化。首先我們可以通過 來了解其冒泡原理 通過 可以清晰的看見冒泡的原理 前後比較,然後移位。下面我們進行實戰,對下列陣列進行排序 int...
面試官問我,你講一下WMS倉儲管理業務?
一般軟體面試,都少不了對你過往的專案經驗詢問,那麼,從面試角度來講,業務 技能,是重要的兩塊。以下是以 wms倉儲管理 專案為例,在面試時的回答 ok,那就講一下我最近參與的乙個專案。專案的名稱是 智慧型倉儲管理系統 這個專案是關於自動化倉儲的需求,當時我們公司的主要業務就是提供自動化倉儲服務。因為...
程式設計師如何回答面試官「請介紹一下自己」這類問題
從面試官的角度來看,最難的面試問題莫過於此 那麼 說說你自己吧。這似乎很簡單,感覺就像一張免費入場券 沒有假想場景,無需真實例子,沒有技術挑戰,甚至沒有可怕的 你最大的缺點是什麼?只要 告訴我一切。但這只是看起來簡單。收到這樣的公開邀請,風險可能大於機遇,因為你沒有任何回答框架,只有乙個沒有線索的空...