五種IO模型

2022-09-11 23:00:35 字數 2008 閱讀 6333

io的產生

i/o輸入/輸出(input/output),分為io裝置和io介面兩個部分.

當使用者程序呼叫了recvfrom這個系統呼叫,就引發了一次io過程,這個時候的io就要等待系統去磁碟上將資料讀取讀來,再拷貝到程序中

在網路情況下,io通常分為兩步

1.等待系統準備資料

2.資料從核心中拷貝到程序中

如果想提高io的效率,就要減少準備資料的時間.

同步非同步:

主要看能不能直接拿到結果

阻塞非阻塞:

直接等待結果還是間接等待結果

io多路復用:

在單執行緒內輪訓直接等待結果

通常的io模型分為5種

1.阻塞io

2.非阻塞io

3.事件驅動io

4.多路復用io

5.非同步io

1.阻塞io

在核心將資料拷貝到程序中之前,整個程序都處在等待狀態,就是阻塞io

a拿著一支魚竿在河邊釣魚,並且一直在魚竿前等,在等的時候不做其他的事情,十分專心。只有魚上鉤的時,才結束掉等的動作,把魚釣上來。

2.非阻塞io

每次程序詢問核心是否有資料準備好,即檔案描述符緩衝區是否就緒。當有資料報準備好時,就進行拷貝資料報的操作。當沒有資料報準備好時,也不阻塞程式,核心直接返回未準備就緒的訊號,等待使用者程式的下乙個輪尋,減少資料等待的時間,當準備資料時,程序是在非阻塞狀態的,可以去做一些其他操作.

b也在河邊釣魚,但是b不想將自己的所有時間都花費在釣魚上,在等魚上鉤這個時間段中,b也在做其他的事情(一會看看書,一會讀讀報紙,一會又去看其他人的釣魚等),但b在做這些事情的時候,每隔乙個固定的時間檢查魚是否上鉤。一旦檢查到有魚上鉤,就停下手中的事情,把魚釣上來。

這樣的輪詢機制對cpu開銷很大,只有在特定場景下才推薦使用.

3.事件驅動io

事件驅動io模型,應用程序告訴核心:當資料報準備好的時候,給我傳送乙個訊號,對sigio訊號進行捕捉,並且呼叫我的訊號處理函式來獲取資料報。

c也在河邊釣魚,但與a、b不同的是,c比較聰明,他給魚竿上掛乙個鈴鐺,當有魚上鉤的時候,這個鈴鐺就會被碰響,c就會將魚釣上來。

4.多路復用io

io多路復用是多了乙個select函式,select函式有乙個引數是檔案描述符集合,對這些檔案描述符進行迴圈監聽,當某個檔案描述符就緒時,就對這個檔案描述符進行處理。

其中,select只負責等,recvfrom只負責拷貝,io多路轉接是屬於阻塞io,但可以對多個檔案描述符進行阻塞監聽,所以效率較阻塞io的高。

d同樣也在河邊釣魚,但是d生活水平比較好,d拿了很多的魚竿,一次性有很多魚竿在等,d不斷的檢視每個魚竿是否有魚上鉤。增加了效率,減少了等待的時間。

5.非同步io

當應用程式呼叫aio_read時,核心一方面去取資料報內容返回,另一方面將程式控制權還給應用程序,應用程序繼續處理其他事情,是一種非阻塞的狀態。

當核心中有資料報就緒時,由核心將資料報拷貝到應用程式中,返回aio_read中定義好的函式處理程式。

e也想釣魚,但e有事情,於是他雇來了f,讓f幫他等待魚上鉤,一旦有魚上鉤,f就打**給e,e就會將魚釣上去。

很少有linux系統支援非同步io,在windows系統中的iocp就是使用的非同步io模型

可以看出,阻塞程度:阻塞io>非阻塞io>多路轉接io>訊號驅動io>非同步io,效率是由低到高的。

五種IO模型

再講io模型之前,給大家舉乙個釣魚的例子。張三去釣魚,他釣魚的時候一動不動,一直看著魚竿,看有沒有動,無論是誰叫他,他都不動,只有等魚梢動了 魚上鉤了 他才會動 李四去釣魚,他沒有像張三那樣瓷楞著,只是時不時的輪詢檢查魚竿有沒有動。一直在動。王五也來釣魚,他就比較聰明了,在魚竿上掛個鈴鐺,只要鈴鐺響...

五種IO模型

阻塞io 在核心將資料準備好之前,系統呼叫會一直等待,所有的套接字都是預設阻塞方式 非阻塞io 如果核心還沒有將資料準備好,系統呼叫會直接返回,並返回錯誤碼 非阻塞io往往需要以迴圈的方式反覆讀寫檔案描述符,這個過程稱為輪詢,對cpu的浪費較大,一般只在特定的場景下使用 訊號驅動io 核心將資料準備...

五種IO模型

1.五種io分為阻塞i o 非阻塞i o 訊號驅動io 多路復用i o select 和 poll 非同步i o 前四個被稱為同步io。1.1乙個輸入操作一般有兩個不同的階段 2.1阻塞io 程序呼叫recvfrom,從使用者態轉到核心態,直到資料準備好且拷貝到應用程式緩衝區或者出錯 最常見的錯誤是...