Java中的IO模型

2021-09-11 17:00:19 字數 2286 閱讀 2597

一、同步、非同步、阻塞與非阻塞

從核心角度看i/o操作分為兩步:使用者層api呼叫;核心層完成系統呼叫(發起i/o請求)。所以同步、非同步針對的是使用者的api的呼叫;阻塞、非阻塞針對的是io請求。

同步指的是函式完成之前會一直等待;阻塞指的是系統呼叫的時候程序會被設定為sleep狀態,直到等待的資料發生       

同步與非同步:

實際上同步與非同步是針對應用程式與核心的互動而言的。同步過程中程序觸發io操作並等待或者輪詢的去檢視io操作是否完成。非同步過程中程序觸發io操作以後,直接返回,做自己的事情,io交給核心來處理,完成後核心通知程序io完成。

阻塞與非阻塞

若要做一件事情,能不能立即得到返回應答,如果不能立即獲得返回,需要等待,就是阻塞;否則就是非阻塞。

二、unix提供的i/o模型

分為五種:阻塞io、非阻塞io、io復用、訊號驅動io、非同步io

首先我們以乙個示例對這五種io模型進行說明。

事情:演唱會

角色1:售票處

角色2:小明

角色3:黃牛

角色4:快遞員

阻塞io:

小明到售票處進行購票,票還未到發售時間,在售票處等待三天,直到買到票返回

非阻塞io:

小明到售票處進行購票,票還未到發售時間,小明回家,過三個小時再來問一次,如此反覆,直到買到票回家

io復用:

小明給黃牛打**,幫小明留意買張票,票買到後黃牛打**告訴小明,小明來取票回家;票沒有出來之前,小明就直接做自己的事情

訊號驅動io:

小明想看演唱會,直接給售票處打**說明,有票打**通知一聲,小明去取票;票沒有出來之前,小明就直接做自己的事情

非同步io:

小明想看演唱會,直接給售票處打**說明,有票直接讓快遞員送一張票

阻塞io:

bio:稱為同步阻塞io。乙個使用者連線請求建立乙個執行緒進行處理,它的缺點是使用者請求數量和服務端的執行緒數有很大關係,服務端的執行緒是併發的瓶頸,限制了伺服器使用者的數量。

分為兩個階段:

(1)等待資料就緒,網路i/o就是等待遠端資料陸續到達,磁碟i/o就是等待磁碟資料從磁碟上讀取到核心態中;

(2)資料拷貝,將核心空間的資料拷貝乙份到使用者態中。

非阻塞io:

非阻塞io分為三個階段:

(1)socket設定為nonblock就是告訴核心,當i/o請求無法完成時,不要將執行緒設定為sleep狀態,而是返回乙個錯誤碼(ewouldblock),這樣執行緒就不會阻塞了;

(2)i/o操作函式會一直測試資料是否準備好,若沒有準備好,繼續測試,直到準備好;整個i/o請求過程中,雖然使用者執行緒每次發起請求都會立即返回,但為了等到資料,仍要不斷輪詢,重複請求,浪費大量cpu資源;

(3)資料準備好了,將其從使用者空間拷貝到核心空間。

io復用:

i/o多路復用會用到select函式和poll函式,這兩個函式會使執行緒阻塞,與阻塞i/o不同的是:i/o多路復用可以同時對多個i/o操作進行阻塞,還可以同時對多個讀操作,多個寫操作的i/o函式進行檢測,直到有資料可讀或者可寫,才真正呼叫i/o函式。

從流程上來看,使用select函式進行i/o請求和同步阻塞模型沒有太大的區別,甚至還多了新增監視channel,以及呼叫select函式的額外操作,增加了額外工作。但是,使用 select以後最大的優勢是使用者可以在乙個執行緒內同時處理多個channel的i/o請求。使用者可以註冊多個channel,然後不斷地呼叫select讀取被啟用的channel,即可達到在同乙個執行緒內同時處理多個i/o請求的目的。而在同步阻塞模型中,必須通過多執行緒的方式才能達到這個目的。

呼叫select/poll該方法由乙個使用者態執行緒負責輪詢多個channel,直到某個階段1的資料就緒,再通知實際的使用者執行緒執行階段2的拷貝。 通過乙個專職的使用者態執行緒執行非阻塞i/o輪詢,模擬實現了階段一的非同步化。

訊號驅動io

首先我們允許socket進行訊號驅動i/o,並安裝乙個訊號處理函式,執行緒繼續執行並不阻塞。當資料準備好時,執行緒會收到乙個sigio 訊號,可以在訊號處理函式中呼叫i/o操作函式處理資料。

非同步io

呼叫aio_read 函式,告訴核心描述字,緩衝區指標,緩衝區大小,檔案偏移以及通知的方式,然後立即返回。當核心將資料拷貝到緩衝區後,再通知應用程式。所以非同步i/o模式下,階段1和階段2全部由核心完成,完成不需要使用者執行緒的參與。

JAVA學習 IO模型(補充)

昨天在整理reactor 模型和proactor模型的時候發現最開始對io模型的理解還是比較膚淺,然後繼續查詢資料後找到一篇講的很精闢的文章。現在把內容結合我個人理解整理出來 對於乙個network io 這裡我們以read舉例 它會涉及到兩個系統物件,呼叫這個io的process or threa...

I O模型 I O模型

輸入 輸出 i o 是在主存和外部裝置 例如磁碟驅動器 終端和網路 之間複製資料的過程。輸入操作是從 i o 裝置複製資料到主存,輸出資料是從主存複製資料到 i o 裝置。描述的是使用者執行緒與核心的互動方式 描述的是使用者執行緒呼叫核心 i o 操作的方式 乙個 i o 操作其實分成了兩個步驟 發...

Linux系統中的I O模型

1.linux系統中i o模型 io模型有四種 1 同步阻塞i o模型 2 同步非阻塞i o模型 3 非同步阻塞i o模型 4 非同步非阻塞i o模型 備註,像select poll以及epoll屬於是非同步阻塞io的類別。阻塞與非阻塞是正對程序自身而言的,就是程序在進行io操作的時候,可不可以處理...