五種IO模型

2021-10-07 07:45:51 字數 1992 閱讀 7242

在網路環境下,通俗的講,將io分為兩步:

1.等;

2.資料搬遷。

如果要想提高io效率,需要將等的時間降低。

五種io模型包括:阻塞io、非阻塞io、訊號驅動io、io多路轉接、非同步io。其中,前四個被稱為同步io。

在介紹五種io模型時,我會舉生活中釣魚的例子,加深理解。

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

在核心將資料準備好之前,系統呼叫會一直等待所有的套接字,預設的是阻塞方式。

其實,我們例子中所說的魚竿就是這乙個檔案描述符。這個模型是我們最常見的,程式呼叫和我們編寫的基本程式是一致的。

fd=connect();

write(fd);

read(fd);

close(fd);

程式的read必須在write之後執行,當write阻塞住了,read就不能執行下去,一直處於等待狀態。

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

其實,b在檢查魚竿是否有魚,是乙個輪詢的過程。

每次客戶詢問核心是否有資料準備好,即檔案描述符緩衝區是否就緒。當有資料報準備好時,就進行拷貝資料報的操作。當沒有資料報準備好時,也不阻塞程式,核心直接返回未準備就緒的訊號,等待使用者程式的下乙個輪尋。

但是,輪尋對於cpu來說是較大的浪費,一般只有在特定的場景下才使用。

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

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

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

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

其中,select只負責等,recvfrom只負責拷貝。

io多路轉接是屬於阻塞io,但可以對多個檔案描述符進行阻塞監聽,所以效率較阻塞io的高。

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

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

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

很少有linux系統支援,windows的iocp就是該模型。

可以看出,阻塞程度:阻塞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,從使用者態轉到核心態,直到資料準備好且拷貝到應用程式緩衝區或者出錯 最常見的錯誤是...