IO問題一直是面試的重災區之一
但又是非常重要而且面試必問的知識點
一個工作了7年的粉絲私信我,他去面試了 4家網際網路公司,
有三個公司問他網路IO的問題,另外一個公司問了Netty,結果都沒回答上來。
好吧,對於“IO和NIO的區別”,看看普通人和高手的回答。
普通人:
嗯。。。。。。。。。。
高手:
好的,關於這個問題,我會從下面幾個方面來回答。
首先,I/O ,指的是IO流, 它可以實現資料從磁碟中的讀取以及寫入。
實際上,除了磁碟以外,記憶體、網路都可以作為I/O流的資料來源和目的地。
在Java裡面,提供了字元流和位元組流兩種方式來實現資料流的操作。
其次,當程式是面向網路進行資料的IO操作的時候,Java裡面提供了Socket的方式來實現。
通過這種方式可以實現資料的網路傳輸。
基於Socket的IO通訊,它是屬於阻塞式IO,也就是說,在連線以及IO事件未就緒的情況下,當前的連線會處於阻塞等待的狀態。
如果一旦某個連線處於阻塞狀態,那麼後續的連線都得等待。所以服務端能夠處理的連線數量非常有限。
NIO,是JDK1.4裡面新增的一種NEW IO機制,相比於傳統的IO,NIO在效率上做了很大的優化,並且新增了幾個核心元件。
Channel、Buffer、Selectors。
另外,還提供了非阻塞的特性,所以,對於網路IO來說,NIO通常也稱為No-Block IO,非阻塞IO。
也就是說,通過NIO進行網路資料傳輸的時候,如果連線未就緒或者IO事件未就緒的情況下,服務端不會阻塞當前連線,而是繼續去輪詢後續的連線來處理。
所以在NIO裡面,服務端能夠並行處理的連結數量更多。
因此,總的來說,IO和NIO的區別,站在網路IO的視角來說,前者是阻塞IO,後者是非阻塞IO。
以上就是我對這個問題的理解。
總結
在網際網路時代,網路IO是最基礎的技術。
無論是微服務架構中的服務通訊、還是應用系統和中介軟體之間的網路通訊,都在體現網路IO的重要性。
如果想獲得一對一的面試指導以及面試資料,可以私信我。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!