BIO NIO和AIO的區別(簡明版)

2021-09-12 11:16:30 字數 2479 閱讀 4279

一:事件分離器

在io讀寫時,把 io請求 與 讀寫操作 分離調配進行,需要用到事件分離器。根據處理機制的不同,事件分離器又分為:同步的reactor和非同步的proactor。

reactor模型:

- 應用程式在事件分離器註冊 讀就緒事件 和 讀就緒事件處理器

- 事件分離器等待讀就緒事件發生

- 讀就緒事件發生,啟用事件分離器,分離器呼叫 讀就緒事件處理器(即:可以進行讀操作了,開始讀)

- 讀事件處理器開始進行讀操作,把讀到的資料提供給程式使用

proactor模型:

- 應用程式在事件分離器註冊 讀完成事件 和 讀完成事件處理器,並向作業系統發出非同步讀請求

- 事件分離器等待作業系統完成讀取

- 在分離器等待過程中,作業系統利用並行的核心執行緒執行實際的讀操作,並將結果資料存入使用者自定義緩衝區,最後通知事件分離器讀操作完成

- 事件分離器監聽到 讀完成事件 後,啟用 讀完成事件的處理器

- 讀完成事件處理器 處理使用者自定義緩衝區中的資料給應用程式使用

同步和非同步的區別就在於 讀 操作由誰完成:同步的reactor是指程式發出讀請求後,由分離器監聽到可以進行讀操作時(需要獲得讀操作條件)通知事件處理器進行讀操作,非同步的proactor是指程式發出讀請求後,作業系統立刻非同步地進行讀操作了,讀完之後在通知分離器,分離器啟用處理器直接取用已讀到的資料。

二:同步阻塞io(bio)

我們熟知的socket程式設計就是bio,乙個socket連線乙個處理執行緒(這個執行緒負責這個socket連線的一系列資料傳輸操作)。阻塞的原因在於:作業系統允許的執行緒數量是有限的,多個socket申請與服務端建立連線時,服務端不能提供相應數量的處理執行緒,沒有分配到處理執行緒的連線就會阻塞等待或被拒絕。

三:同步非阻塞io(nio)

new io是對bio的改進,基於reactor模型。我們知道,乙個socket連線只有在特點時候才會發生資料傳輸io操作,大部分時間這個「資料通道」是空閒的,但還是占用著執行緒。nio作出的改進就是「乙個請求乙個執行緒」,在連線到服務端的眾多socket中,只有需要進行io操作的才能獲取服務端的處理執行緒進行io。這樣就不會因為執行緒不夠用而限制了socket的接入。客戶端的socket連線到服務端時,就會在事件分離器註冊乙個 io請求事件 和 io 事件處理器。在該連線發生io請求時,io事件處理器就會啟動乙個執行緒來處理這個io請求,不斷嘗試獲取系統的io的使用許可權,一旦成功(即:可以進行io),則通知這個socket進行io資料傳輸。

nio還提供了兩個新概念:buffer和channel

buffer:

– 是一塊連續的記憶體塊。

– 是 nio 資料讀或寫的中轉地。

channel:

– 資料的源頭或者資料的目的地

– 用於向 buffer 提供資料或者讀取 buffer 資料 ,buffer 物件的唯一介面。

– 非同步 i/o 支援

buffer作為io流中資料的緩衝區,而channel則作為socket的io流與buffer的傳輸通道。客戶端socket與服務端socket之間的io傳輸不直接把資料交給cpu使用,

而是先經過channel通道把資料儲存到buffer,然後cpu直接從buffer區讀寫資料,一次可以讀寫更多的內容。使用buffer提高io效率的原因(這裡與io流裡面的bufferedxxstream、bufferedreader、bufferedwriter提高效能的原理一樣):io的耗時主要花在資料傳輸的路上,普通的io是乙個位元組乙個位元組地傳輸,而採用了buffer的話,通過buffer封裝的方法(比如一次讀一行,則以行為單位傳輸而不是乙個位元組一次進行傳輸)就可以實現「一大塊位元組」的傳輸。比如:io就是送快遞,普通io是乙個快遞跑一趟,採用了buffer的io就是一車跑一趟。很明顯,buffer效率更高,花在傳輸路上的時間大大縮短。

四:非同步阻塞io(aio)

nio是同步的io,是因為程式需要io操作時,必須獲得了io許可權後親自進行io操作才能進行下一步操作。aio是對nio的改進(所以aio又叫nio.2),它是基於proactor模型的。每個socket連線在事件分離器註冊 io完成事件 和 io完成事件處理器。程式需要進行io時,向分離器發出io請求並把所用的buffer區域告知分離器,分離器通知作業系統進行io操作,作業系統自己不斷嘗試獲取io許可權並進行io操作(資料儲存在buffer區),操作完成後通知分離器;分離器檢測到 io完成事件,則啟用 io完成事件處理器,處理器會通知程式說「io已完成」,程式知道後就直接從buffer區進行資料的讀寫。

也就是說:aio是發出io請求後,由作業系統自己去獲取io許可權並進行io操作;nio則是發出io請求後,由執行緒不斷嘗試獲取io許可權,獲取到後通知應用程式自己進行io操作。

BIO NIO和AIO的區別(簡明版)

一 事件分離器 在io讀寫時,把 io請求 與 讀寫操作 分離調配進行,需要用到事件分離器。根據處理機制的不同,事件分離器又分為 同步的reactor和非同步的proactor。reactor模型 應用程式在事件分離器註冊 讀就緒事件 和 讀就緒事件處理器 事件分離器等待讀就緒事件發生 讀就緒事件發...

BIO NIO和AIO的區別

在io讀寫時,把 io請求 與 讀寫操作 分離調配進行,需要用到事件分離器。根據處理機制的不同,事件分離器又分為 同步的reactor和非同步的proactor。reactor模型 proactor模型 同步和非同步的區別就在於 讀 操作由誰完成 同步的reactor是指程式發出讀請求後,由分離器監...

BIO NIO和AIO的區別

一 事件分離器 在io讀寫時,把 io請求 與 讀寫操作 分離調配進行,需要用到事件分離器。根據處理機制的不同,事件分離器又分為 同步的reactor和非同步的proactor。reactor模型 proactor模型 同步和非同步的區別就在於 讀 操作由誰完成 同步的reactor是指程式發出讀請...