五種IO模型

2021-10-03 02:47:13 字數 1874 閱讀 6842

1.五種io分為阻塞i/o、非阻塞i/o、訊號驅動io、多路復用i/o (select 和 poll) 、非同步i/o ,前四個被稱為同步io。

1.1乙個輸入操作一般有兩個不同的階段:

2.1阻塞io: 程序呼叫recvfrom,從使用者態轉到核心態,直到資料準備好且拷貝到應用程式緩衝區或者出錯(最常見的錯誤是訊號中斷)才會返回。我們所說的程序阻塞的整段時間是從呼叫recvfrom開始到資料拷貝完成這段時間。當程序返回成功時,應用程式就開始處理資料了。

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

2.2非阻塞i/o: 當設定乙個套介面為非阻塞的方式時,即通知核心:當請求的i/o操作非得讓程序睡眠不能完成時,不要讓程序睡眠,而應返回乙個錯誤。

當乙個應用程式像這樣對乙個非阻塞描述符呼叫recvfrom時,我們稱此過程為輪詢。當系統呼叫沒有期待時操作發生的時候,核心立即返回乙個錯誤。應用程式不斷地查詢核心,看看某操作是否準備好,這樣子對cpu時間是極大的浪費。當操作準備好也就是資料報準備好的時候,將資料報拷貝到應用緩衝區這一段時間依舊是阻塞的。

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

通過系統呼叫安裝訊號處理程式,此系統呼叫立即返回,程序繼續工作。當資料報準備好之後,會為該程序生成乙個sigio訊號。隨即可以在訊號處理函式中呼叫recvfrom來處理資料,並通知主程式體資料已經準備好被處理了。

訊號驅動i/o模型的優點是當資料報到達時,可以不阻塞,主迴圈可以繼續執行,只是等待訊號處理程式的通知,或者資料已準備好被處理,或者資料報已經準備好被讀了。
2.4多路復用i/o (select 和 poll):io多路轉接是多了乙個select函式,select函式有乙個引數是檔案描述符集合,對這些檔案描述符進行迴圈監聽,當某個檔案描述符就緒時,就對這個檔案描述符進行處理。其中,select只負責等,recvfrom只負責拷貝。io多路轉接是屬於阻塞io,但可以對多個檔案描述符進行阻塞監聽,所以效率較阻塞io的高。

​ 應用程式通過i/o復用函式向核心註冊一組事件,核心通過i/o復用函式把其中就緒的事件通知給應用程式。i/o復用本身阻塞的,他們能提高程式執行的效率的原因在於他們具有同時監聽多個i/o事件的能力。

​ 常用的i/o復用函式是select,poll,呼叫select或poll,在這個兩個系統呼叫中的某乙個上阻塞,而不是而不阻塞於真正的系統呼叫。

以select為例,我們阻塞於select呼叫,等待資料報套介面可讀。當select返回可讀呼叫時,呼叫recvfrom將資料拷貝到應用程式緩衝區。

2.5非同步i/o:

​ 當應用程式呼叫aio_read時,核心一方面去取資料報內容返回,另一方面將程式控制權還給應用程序,應用程序繼續處理其他事情,是一種非阻塞的狀態。當核心中有資料報就緒時,由核心將資料報拷貝到應用程式中,返回aio_read中定義好的函式處理程式。

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

五種IO模型

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

五種IO模型

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

五種IO模型

在網路環境下,通俗的講,將io分為兩步 1.等 2.資料搬遷。如果要想提高io效率,需要將等的時間降低。五種io模型包括 阻塞io 非阻塞io 訊號驅動io io多路轉接 非同步io。其中,前四個被稱為同步io。在介紹五種io模型時,我會舉生活中釣魚的例子,加深理解。a拿著一支魚竿在河邊釣魚,並且一...