從零開始學Netty(一)常見的IO模型

什麼是Netty?

Netty是一個異步事件驅動的網絡應用框架,用於快速開發可維護的高性能協議服務器和客戶端。

(Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.)

這是github上官方給出的定義。這句話對於初識netty的人來說,確實晦澀難懂。我希望當你看完這個系列文章 後會對這句話有一個新的認識。

同步,異步,阻塞,非阻塞的概念

同步與異步:

同步與異步是針對應用程序與內核的交互而言。從內核中讀取數據,如果內核中數據還沒有準備好,如果是同步操作,它會一直等待,直到操作完成。如果是異步操作,那麼它會去做別的事情,等待數據準備好,內核通知它,它再去讀取數據。

阻塞與非阻塞:

應用進程請求IO操作時,如果數據未準備好,請求立即返回就是非阻塞,不立即返回就是阻塞。(非阻塞即發起準備數據命令後立即返回去執行後面的邏輯,若線程阻塞等待數據準備的就是阻塞)

阻塞模型(BIO)

bio

BIO的特點是在準備數據的階段和把數據從內核複製到用戶空間兩個階段都是阻塞的。是同步阻塞的IO模式,因爲兩個階段都阻塞。因爲模型簡單,我們在剛學習網絡編程時的寫的簡單通信軟件一般都採用這個模型。但是在實際網絡通信中,這個模型並不適用。下一篇就來告訴大家爲什麼這個模型不適合實際的網絡開發。

非阻塞模型(NIO)

nio

在應用程序發出數據請求時,當內核沒有準備好的時,用戶線程不會阻塞,而是立刻收到操作系統未準備好數據的消息,然後用戶線程接着處理自己其他的代碼,過一陣子之後再次發起詢問(一般用循環來實現),直到內核準備好數據後將數據從內核拷貝到用戶空間,這個階段仍然是阻塞的。

多路複用IO模型(IO Multiplex)

Multiplex
這個模型是操作系統提供了select的功能,用戶可以在select上註冊自己感興趣的事件,然後用戶調用select方法時會阻塞,當這些事件出現時會返回,然後用戶就可以根據具體的事件來實現自己的邏輯了。比如用戶在select註冊了讀事件,然後調用select()方法,此時調用的線程就會被select阻塞,直到內核準備好要讀的內容,此時select()就會返回,用戶就能拿到讀事件,此時再去內核將數據拷貝到用戶空間。

這個模型也是java中NIO的實現模型。

信號驅動IO(Signal driven IO)Signal driven IO

使用信號驅動I/O時,當網絡套接字可讀後,內核通過發送SIGIO信號通知應用進程,於是應用可以開始讀取數據。有時也稱此方式爲異步I/O。但是嚴格講,該方式並不能算真正的異步I/O,因爲實際讀取數據到應用進程緩存的工作仍然是由應用自己負責的。

異步IO模型(AIO)

aio

用戶進程發起數據請求後,立刻收到內核的返回去執行自己的其他代碼。當內核準備好數據後會將數據拷貝到用戶內存中,當這些都做好後會給用戶進程發送一個信號,然後再由用戶進行操作。

小結

上面列舉了五種io模型,現在有些看不明白也沒關係,下面會慢慢帶大家深入理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章