久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

JAVA中BIO,NIO,AIO的理解是怎樣的

163次閱讀
沒有評論

共計 3670 個字符,預計需要花費 10 分鐘才能閱讀完成。

今天就跟大家聊聊有關 JAVA 中 BIO,NIO,AIO 的理解是怎樣的,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

在高性能的 IO 體系設計中,有幾個名詞概念常常會使我們感到迷惑不解。具體如下: 

編號名詞解釋舉例 1 同步指的是用戶進程觸發 IO 操作并等待或者輪詢的去查看 IO 操作是否就緒自己上街買衣服,自己親自干這件事,別的事干不了。2 異步異步是指用戶進程觸發 IO 操作以后便開始做自己的事情,而當 IO 操作已經完成的時候會得到 IO 完成的通知(異步的特點就是通知)告訴朋友自己合適衣服的尺寸,大小,顏色,讓朋友委托去賣,然后自己可以去干別的事。(使用異步 IO 時,Java 將 IO 讀寫委托給 OS 處理,需要將數據緩沖區地址和大小傳給 OS)3 阻塞所謂阻塞方式的意思是指, 當試圖對該文件描述符進行讀寫時, 如果當時沒有東西可讀, 或者暫時不可寫, 程序就進入等待 狀態, 直到有東西可讀或者可寫為止去公交站充值,發現這個時候,充值員不在(可能上廁所去了),然后我們就在這里等待,一直等到充值員回來為止。(當然現實社會,可不是這樣,但是在計算機里確實如此。)4 非阻塞非阻塞狀態下, 如果沒有東西可讀, 或者不可寫, 讀寫函數馬上返回, 而不會等待,銀行里取款辦業務時,領取一張小票,領取完后我們自己可以玩玩手機,或者與別人聊聊天,當輪我們時,銀行的喇叭會通知,這時候我們就可以去了。

散仙不才,在查了一部分資料后,愿試著以通俗易懂的方式解釋下這幾個名詞。。 

在弄清楚上面的幾個問題之前,我們首先得明白什么是同步,異步,阻塞,非阻塞,只有這幾個單個概念理解清楚了,然后在組合理解起來,就相對比較容易了。 

1, 同步和異步是針對應用程序和內核的交互而言的。 

2, 阻塞和非阻塞是針對于進程在訪問數據的時候,根據 IO 操作的就緒狀態來采取的不同方式,說白了是一種讀取或者寫入操作函數的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。 

由上描述基本可以總結一句簡短的話,同步和異步是目的,阻塞和非阻塞是實現方式。 

 
下面我們再來理解組合方式的 IO 類型,就好理解多了。 

同步阻塞 IO(JAVA BIO): 
  同步并阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。 

同步非阻塞 IO(Java NIO):同步非阻塞,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有 I / O 請求時才啟動一個線程進行處理。用戶進程也需要時不時的詢問 IO 操作是否就緒,這就要求用戶進程不停的去詢問。 

異步阻塞 IO(Java NIO): 
  此種方式下是指應用發起一個 IO 操作以后,不等待內核 IO 操作的完成,等內核完成 IO 操作以后會通知應用程序,這其實就是同步和異步最關鍵的區別,同步必須等待或者主動的去詢問 IO 是否完成,那么為什么說是阻塞的呢?因為此時是通過 select 系統調用來完成的,而 select 函數本身的實現方式是阻塞的,而采用 select 函數有個好處就是它可以同時監聽多個文件句柄(如果從 UNP 的角度看,select 屬于同步操作。因為 select 之后,進程還需要讀寫數據),從而提高系統的并發性! 

(Java AIO(NIO.2))異步非阻塞 IO: 
  在此種模式下,用戶進程只需要發起一個 IO 操作然后立即返回,等 IO 操作真正的完成以后,應用程序會得到 IO 操作完成的通知,此時用戶進程只需要對數據進行處理就好了,不需要進行實際的 IO 讀寫操作,因為真正的 IO 讀取或者寫入操作已經由內核完成了。 

BIO、NIO、AIO 適用場景分析: 

  BIO 方式適用于連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,并發局限于應用中,JDK1.4 以前的唯一選擇,但程序直觀簡單易理解。 

  NIO 方式適用于連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,并發局限于應用中,編程比較復雜,JDK1.4 開始支持。 

  AIO 方式使用于連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用 OS 參與并發操作,編程比較復雜,JDK7 開始支持。 
 
搞清楚了以上概念以后,我們再回過頭來看看,Reactor 模式和 Proactor 模式。 
 
(其實阻塞與非阻塞都可以理解為同步范疇下才有的概念,對于異步,就不會再去分阻塞非阻塞。對于用戶進程,接到異步通知后,就直接操作進程用戶態空間里的數據好了。) 
 
首先來看看 Reactor 模式,Reactor 模式應用于同步 I / O 的場景。我們分別以讀操作和寫操作為例來看看 Reactor 中的具體步驟: 
讀取操作: 
1. 應用程序注冊讀就緒事件和相關聯的事件處理器  
 
2. 事件分離器等待事件的發生  
 
3. 當發生讀就緒事件的時候,事件分離器調用第一步注冊的事件處理器  
 
4. 事件處理器首先執行實際的讀取操作,然后根據讀取到的內容進行進一步的處理  
 
寫入操作類似于讀取操作,只不過第一步注冊的是寫就緒事件。 
 
 
下面我們來看看 Proactor 模式中讀取操作和寫入操作的過程: 
讀取操作: 
1. 應用程序初始化一個異步讀取操作,然后注冊相應的事件處理器,此時事件處理器不關注讀取就緒事件,而是關注讀取完成事件,這是區別于 Reactor 的關鍵。 
 
2. 事件分離器等待讀取操作完成事件  
 
3. 在事件分離器等待讀取操作完成的時候,操作系統調用內核線程完成讀取操作(異步 IO 都是操作系統負責將數據讀寫到應用傳遞進來的緩沖區供應用程序操作,操作系統扮演了重要角色),并將讀取的內容放入用戶傳遞過來的緩存區中。這也是區別于 Reactor 的一點,Proactor 中,應用程序需要傳遞緩存區。 
 
4. 事件分離器捕獲到讀取完成事件后,激活應用程序注冊的事件處理器,事件處理器直接從緩存區讀取數據,而不需要進行實際的讀取操作。 
 
Proactor 中寫入操作和讀取操作,只不過感興趣的事件是寫入完成事件。 
 
從上面可以看出,Reactor 和 Proactor 模式的主要區別就是真正的讀取和寫入操作是有誰來完成的,Reactor 中需要應用程序自己讀取或者寫入數據,而 Proactor 模式中,應用程序不需要進行實際的讀寫過程,它只需要從緩存區讀取或者寫入即可,操作系統會讀取緩存區或者寫入緩存區到真正的 IO 設備. 
 
  綜上所述,同步和異步是相對于應用和內核的交互方式而言的,同步 需要主動去詢問,而異步的時候內核在 IO 事件發生的時候通知應用程序,而阻塞和非阻塞僅僅是系統在調用系統調用的時候函數的實現方式而已。   

如果你想吃一份宮保雞丁蓋飯: 

同步阻塞:你到飯館點餐,然后在那等著,還要一邊喊:好了沒啊! 

同步非阻塞:在飯館點完餐,就去遛狗了。不過溜一會兒,就回飯館喊一聲:好了沒啊! 

異步阻塞:遛狗的時候,接到飯館電話,說飯做好了,讓您親自去拿。 

異步非阻塞:飯館打電話說,我們知道您的位置,一會給你送過來,安心遛狗就可以了。 

“一個 IO 操作其實分成了兩個步驟:發起 IO 請求和實際的 IO 操作。 
同步 IO 和異步 IO 的區別就在于第二個步驟是否阻塞,如果實際的 IO 讀寫阻塞請求進程,那么就是同步 IO。 
阻塞 IO 和非阻塞 IO 的區別在于第一步,發起 IO 請求是否會被阻塞,如果阻塞直到完成那么就是傳統的阻塞 IO,如果不阻塞,那么就是非阻塞 IO。 

同步和異步是針對應用程序和內核的交互而言的,同步指的是用戶進程觸發 IO 操作并等待或者輪詢的去查看 IO 操作是否就緒,而異步是指用戶進程觸發 IO 操作以后便開始做自己的事情,而當 IO 操作已經完成的時候會得到 IO 完成的通知。而阻塞和非阻塞是針對于進程在訪問數據的時候,根據 IO 操作的就緒狀態來采取的不同方式,說白了是一種讀取或者寫入操作函數的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。 
所以,IO 操作可以分為 3 類:同步阻塞(即早期的 IO 操作)、同步非阻塞(NIO)、異步(AIO)。 
同步阻塞: 
在此種方式下,用戶進程在發起一個 IO 操作以后,必須等待 IO 操作的完成,只有當真正完成了 IO 操作以后,用戶進程才能運行。JAVA 傳統的 IO 模型屬于此種方式。 

同步非阻塞: 
在此種方式下,用戶進程發起一個 IO 操作以后邊可返回做其它事情,但是用戶進程需要時不時的詢問 IO 操作是否就緒,這就要求用戶進程不停的去詢問,從而引入不必要的 CPU 資源浪費。其中目前 JAVA 的 NIO 就屬于同步非阻塞 IO。 
異步: 
此種方式下是指應用發起一個 IO 操作以后,不等待內核 IO 操作的完成,等內核完成 IO 操作以后會通知應用程序。” 

看完上述內容,你們對 JAVA 中 BIO,NIO,AIO 的理解是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業資訊頻道,感謝大家的支持。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計3670字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 天水市| 嘉鱼县| 崇明县| 安徽省| 屏东市| 新巴尔虎右旗| 虎林市| 伊川县| 巢湖市| 富裕县| 拉孜县| 黎川县| 新晃| 清新县| 伊金霍洛旗| 金山区| 汝州市| 阳春市| 山东| 安国市| 黄平县| 通榆县| 虞城县| 徐闻县| 工布江达县| 清丰县| 永德县| 开远市| 石首市| 淳安县| 扶余县| 皋兰县| 巴青县| 渝北区| 七台河市| 平阳县| 平塘县| 福安市| 石柱| 西城区| 广水市|