關於三大IO的理解 AIO,BIO,NIO

2021-09-13 11:20:28 字數 2910 閱讀 6528

1.同步

使用者程序觸發io操作並等待或者輪詢的去檢視io操作是否完成

2.非同步

使用者觸發io操作以後,可以幹別的事,io操作完成以後再通知當前執行緒繼續處理

3.阻塞

當乙個執行緒呼叫 read() 或 write()時,該執行緒被阻塞,直到有一些資料被讀取或寫入,該執行緒在此期間不能執行其他任務

4.非阻塞

當執行緒從某通道進行讀寫資料時,若沒有資料可用時,該執行緒可以進行其他任務。執行緒通常將非阻塞 io 的空閒時間用於在其他通道上執行 io 操作,所以單獨的執行緒可以管理多個輸入和輸出通道。

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

reactor模型:

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

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

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

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

proactor模型:

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

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

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

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

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

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

我們熟知的socket就是bio,每乙個socket套接字需要使用乙個執行緒來處理。建立連線、進行讀寫操作的時候都可能阻塞。在伺服器端如果要支援併發的連線時,需要更多的執行緒。連線不做任何事情的時候會造成不必要的執行緒開銷,可通過執行緒池來改善。

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

nio主要有三大核心部分:channel(通道),buffer(緩衝區), selector。傳統io基於位元組流和字元流進行操作,而nio基於channel和buffer(緩衝區)進行操作,資料總是從通道讀取到緩衝區中,或者從緩衝區寫入到通道中。selector(選擇區)用於監聽多個通道的事件(比如:連線開啟,資料到達)。因此,單個執行緒可以監聽多個資料通道。

nio基於channel和buffer(緩衝區)進行操作

selector(選擇區)用於監聽多個通道的事件

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可以簡述如下:

bio是同步並阻塞,伺服器實現模式為乙個連線乙個執行緒,即客戶端有連線請求時伺服器端就需要啟動乙個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善。

nio是同步非阻塞,伺服器實現模式為乙個請求乙個執行緒,即客戶端傳送的連線請求都會註冊到多路復用器上,多路復用器輪詢到連線有i/o請求時才啟動乙個執行緒進行處理。

aio是非同步非阻塞,伺服器實現模式為乙個有效請求乙個執行緒,客戶端的i/o請求都是由os先完成了再通知伺服器應用去啟動執行緒進行處理。

bio、nio、aio適用場景分析:

bio方式適用於連線數目比較小且固定的架構,這種方式對伺服器資源要求比較高

nio方式適用於連線數目多且連線比較短的架構,可充分利用伺服器資源

aio方式使用於連線數目多且連線比較長的架構,充分呼叫os參與併發操作

關於資料庫三大正規化的理解

正規化,英文 normal form,簡稱nf。它的由英國關係型資料庫鼻祖 e.f.codd在提出關係型資料庫模型後總結出來的一種理論,正規化也是關係型資料庫的理論基礎,也是我們在設計資料庫時需要遵守的守則。簡言之就是,資料庫設計對資料的儲存效能,還有開發人員對資料的操作都有莫大的關係。所以建立科學...

關於I O模型的一些理解

參照的文章 i o模型 在開始nio的學習之前,先對i o的模型有乙個理解,這對nio的學習是絕對有好處的。我畫一張圖,簡單表示一下資料從外部磁碟向執行中程序的記憶體區域移動的過程 這張明顯忽略了很多細節,只涉及了基本操作,下面分析一下這張圖。使用者空間和核心空間 乙個計算機通常有一定大小的記憶體空...

SSH三大框架的理解

1 strus裡面寫action相關的東西主要是負責介面的跳轉 過濾功能 在web info的src的struts.xml檔案中進行配置 apache software foundation dtd struts configuration 2.3 en value messageresource ...