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

2021-10-24 21:52:49 字數 3373 閱讀 6836

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,那就講一下我最近參與的乙個專案。專案的名稱是 智慧型倉儲管理系統 這個專案是關於自動化倉儲的需求,當時我們公司的主要業務就是提供自動化倉儲服務。因為...

程式設計師如何回答面試官「請介紹一下自己」這類問題

從面試官的角度來看,最難的面試問題莫過於此 那麼 說說你自己吧。這似乎很簡單,感覺就像一張免費入場券 沒有假想場景,無需真實例子,沒有技術挑戰,甚至沒有可怕的 你最大的缺點是什麼?只要 告訴我一切。但這只是看起來簡單。收到這樣的公開邀請,風險可能大於機遇,因為你沒有任何回答框架,只有乙個沒有線索的空...