Netty(二)

異步和同步
同步(Sync):所謂同步,就是線程發出一個功能調用時,在沒有得到結果之前,該調用就不返回或繼續執行後續操作,而是等待可以調用。當可以調用之後,線程自行進行調用。

異步(Async):異步與同步相對,當一個異步過程調用發出後,調用者在沒有得到結果之前,就可以繼續執行後續操作。當這個調用完成後,一般通過狀態、通知和回調來通知調用者。對於異步調用,調用的返回並不受調用者控制。

總結來說,同步和異步的區別大概有兩個:

請求發出後,是否可以返回執行其他操作。
當可以進行調用時,同步情況是發起調用的線程自己去調用並得到結果,異步情況是內核將調用動作完成,將結果返回給調用線程。
事件驅動
一個典型的事件驅動的程序,就是一個死循環,並以一個線程的形式存在,這個死循環包括兩個部分,第一個部分是按照一定的條件接收並選擇一個要處理的事件,第二個部分就是事件的處理過程。程序的執行過程就是選擇事件和處理事件,而當沒有任何事件觸發時,程序會因查詢事件隊列失敗而進入睡眠狀態,從而釋放cpu。

也就是說,事件驅動就是有事件就處理,沒時間就等待。

BIO、NIO和AIO的區別

事件分離器
在IO讀寫時,把 IO請求 與 讀寫操作 分離調配進行,需要用到事件分離器。根據處理機制的不同,事件分離器又分爲:同步的Reactor和異步的Proactor。

Reactor模型:

應用程序在事件分離器註冊 讀就緒事件 和 讀就緒事件處理器
事件分離器等待讀就緒事件發生
讀就緒事件發生,激活事件分離器,分離器調用 讀就緒事件處理器(即:可以進行讀操作了,開始讀)
讀事件處理器開始進行讀操作,把讀到的數據提供給程序使用
Proactor模型:

應用程序在事件分離器註冊 讀完成事件 和讀完成事件處理器,並向操作系統發出異步讀請求
事件分離器等待操作系統完成讀取
在分離器等待過程中,操作系統利用並行的內核線程執行實際的讀操作,並將結果數據存入用戶自定義緩衝區,最後通知事件分離器讀操作完成
事件分離器監聽到 讀完成事件 後,激活 讀完成事件的處理器
讀完成事件處理器 處理用戶自定義緩衝區中的數據給應用程序使用
同步和異步的區別就在於 讀 操作由誰完成:同步的Reactor是指程序發出讀請求後,由分離器監聽到可以進行讀操作時(需要獲得讀操作條件)通知事件處理器進行讀操作,異步的Proactor是指程序發出讀請求後,操作系統立刻異步地進行讀操作了,讀完之後在通知分離器,分離器激活處理器直接取用已讀到的數據。

同步阻塞IO(BIO):在此種方式下,用戶進程在發起一個IO操作以後,必須等待IO操作的完成,只有當真正完成了IO操作以後,用戶進程才能運行。JAVA傳統的IO模型屬於此種方式!

同步非阻塞IO(NIO):在此種方式下,用戶進程發起一個IO操作以後邊可返回做其它事情,但是用戶進程需要時不時的詢問IO操作是否就緒,這就要求用戶進程不停的去詢問,從而引入不必要的CPU資源浪費。其中目前JAVA的NIO就屬於同步非阻塞IO。

異步阻塞IO(AIO):此種方式下是指應用發起一個IO操作以後,不等待內核IO操作的完成,等內核完成IO操作以後會通知應用程序,這其實就是同步和異步最關鍵的區別,同步必須等待或者主動的去詢問IO是否完成,那麼爲什麼說是阻塞的呢?因爲此時是通過select系統調用來完成的,而select函數本身的實現方式是阻塞的,而採用select函數有個好處就是它可以同時監聽多個文件句柄,從而提高系統的併發性!

異步非阻塞IO:在此種模式下,用戶進程只需要發起一個IO操作然後立即返回,等IO操作真正的完成以後,應用程序會得到IO操作完成的通知,此時用戶進程只需要對數據進行處理就好了,不需要進行實際的IO讀寫操作,因爲真正的IO讀取或者寫入操作已經由內核完成了。目前Java中還沒有支持此種IO模型。

Netty相關概念和基本架構

Netty的核心組件包括以下幾個部分:

BootStrap和ServerBootstrap BootStrap通常稱爲引導類,提供一個用於應用程序網絡層配置的容器。
Channel 底層網路傳輸API必須提供給應用I/O操作的接口,如讀、寫、連接、綁定等。它結構類似一個“Socket”。它有很多類似於socket的函數:bind、close、config、connect、isActive、isOpen、isWritable、read、write等等。
ChannelHandler Handle稱之爲處理器,支持很多協議,提供用於數據處理的容器。常用的一個接口是ChannelInboundHandler,這個類型可以處理入站事件(即外部應用連接到本應用的事件);反之有ChannelOutboundHandler接口,處理出站事件。業務邏輯經常在一個或多個ChannelInboundHandler中操作。
ChannelPipeline Netty的數據處理流程其實是一種責任鏈和攔截過濾器模式,ChannelPipeline 提供了一個鏈容器,該鏈包含一個或多個ChannelHandler ,並提供了一個API用於管理沿着鏈入站和出站事件的流動。
EventLoop EventLoop 用於處理 Channel 的 I/O操作。一個EventLoop可以處理多個Channel事件。而EventLoopGroup是一個Group,可以包括多個EventLoop。
ChannelFuture Netty是一種異步I/O模型,一個操作可能無法立即返回結果,所以它提供了ChannelFuture類,可以通過addListener添加監聽器,操作完成時可以作出通知。
Netty的基本架構如下圖所示:
在這裏插入圖片描述

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